魔術情書 6.55 破解過程+不脫殼打破解補丁【原創】

看雪資料發表於2004-12-07

【破解作者】 海風月影
【作者郵箱】 zjhangtian@sohu.com
【使用工具】 od 1.10d,PEid,LoadPE,winHex,eXeScope
【破解平臺】 WinXP
【軟體名稱】 魔術情書 6.55
【下載地址】 www.coolboo.com
【軟體簡介】 “魔術情書”是一款能由電腦自動書寫情書的應用軟體,有了她,可以讓你從此不再為
寫情書而煩惱,你只需輕輕點選幾下滑鼠就可以寫出讓你感到滿意的情書。軟體內含強
大情書庫,可以用它書寫出超過一萬封不一樣的情書,而且情書庫可以隨意地擴充。軟
件內還帶有一百多封古今中外經典的情書,只需點選滑鼠,就可以自動套用:)你可以
選擇“自動書寫”、“模板式書寫”及“組合式書寫”這幾種方式來快速寫 情書,軟
件支援線上傳送情書,可以傳送匿名郵件;可以將寫的情書儲存為“文字檔案”、“Wo
rd文件”、“ 網頁檔案”等等,在網頁檔案選項中還可以選擇把檔案儲存為“爛漫星
空”、“趣味求愛”、“音樂動力”等等網頁,可以讓你寫的情書更具吸引力、更能博
得你心目中的女神、白馬王子的歡心。
此次升級新增幾十個個實用的功能,情書庫擴大了三倍,增強了非常實用的背景音樂功
能,線上傳送情書功能支援需要認證的郵件伺服器,可以傳送郵件附件,使用了全新的
皮膚介面技術,可以任意更換介面(共有九種精彩介面),馬上下載親自體驗一下吧!


【軟體大小】 2M
【加殼方式】 upx
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)
--------------------------------------------------------------------------------
【破解內容】


一、破解過程

1、peid查殼,UPX 0.80 - 0.84 -> Markus & Laszlo, 是簡單的壓縮殼,脫殼過程就不寫了,不會脫也沒關係,反正後面我們要不脫殼打補丁

2、用od載入,F9執行,出現對話方塊,顯示用了幾次,因此,首先把nag去掉。如何確定呼叫nag的程式碼呢?我介紹一種自己的方法,開啟記憶體(ALT+M),選中當前執行區域,這裡是

記憶體映象,專案 28
 地址=00401000
 大小=00197000 (1667072.)
 Owner=MSQingSh 00400000
 區段=UPX0
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE

因為我們執行的位置在0056xxxx,屬於上面那個區域。然後按F2,此時,程式被中斷下來了

0044F25B    E8 F8F9FFFF       call MSQingSh.0044EC58
0044F260    E8 1F46FBFF       call MSQingSh.00403884
0044F265    807D FB 00        cmp byte ptr ss:[ebp-5],0
0044F269    74 05             je short MSQingSh.0044F270
0044F26B    E8 FC85FBFF       call <jmp.&user32.WaitMessage>
0044F270    33C0              xor eax,eax                             ; 中斷在這
0044F272    5A                pop edx
0044F273    59                pop ecx
0044F274    59                pop ecx
0044F275    64:8910           mov dword ptr fs:[eax],edx
0044F278    68 92F24400       push MSQingSh.0044F292
0044F27D    8D45 F0           lea eax,dword ptr ss:[ebp-10]
0044F280    BA 02000000       mov edx,2
0044F285    E8 7E4BFBFF       call MSQingSh.00403E08
0044F28A    C3                retn

然後一路按F8,直到明顯遇到一個迴圈,如下

0044BC11    E8 36BBFBFF             call <jmp.&user32.SendMessageA>
0044BC16    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC19    33D2                    xor edx,edx
0044BC1B    8990 34020000           mov dword ptr ds:[eax+234],edx
0044BC21    8B03                    mov eax,dword ptr ds:[ebx]              ; 從這
0044BC23    E8 D42D0000             call MSQingSh.0044E9FC
0044BC28    8B03                    mov eax,dword ptr ds:[ebx]
0044BC2A    80B8 8C000000 00        cmp byte ptr ds:[eax+8C],0
0044BC31    74 0F                   je short MSQingSh.0044BC42
0044BC33    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC36    C780 34020000 02000000  mov dword ptr ds:[eax+234],2
0044BC40    EB 14                   jmp short MSQingSh.0044BC56
0044BC42    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC45    83B8 34020000 00        cmp dword ptr ds:[eax+234],0
0044BC4C    74 08                   je short MSQingSh.0044BC56
0044BC4E    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC51    E8 26FDFFFF             call MSQingSh.0044B97C
0044BC56    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC59    8B80 34020000           mov eax,dword ptr ds:[eax+234]
0044BC5F    85C0                    test eax,eax
0044BC61  ^ 74 BE                   je short MSQingSh.0044BC21              ; 到這,是訊息迴圈
0044BC63    8945 F8                 mov dword ptr ss:[ebp-8],eax            ; 在這下斷點
0044BC66    6A 00                   push 0
0044BC68    6A 00                   push 0
0044BC6A    68 01B00000             push 0B001
0044BC6F    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BC72    E8 D9ABFEFF             call MSQingSh.00436850

這個迴圈是windows的訊息迴圈,因為程式是用delphi寫的,不容易看出來,當窗體解除安裝時就退出迴圈,因此在0044BC63下斷點,F9執行
斷在44bc63處,小心按F8,一步一步走,不斷地 ret ,遇到下面的這樣的 ret 直接跳

0044BC97    5A                      pop edx
0044BC98    59                      pop ecx
0044BC99    59                      pop ecx
0044BC9A    64:8910                 mov dword ptr fs:[eax],edx
0044BC9D    68 B2BC4400             push MSQingSh.0044BCB2                  ; 這是跳轉地址
0044BCA2    8B45 FC                 mov eax,dword ptr ss:[ebp-4]
0044BCA5    E8 7AFDFFFF             call MSQingSh.0044BA24
0044BCAA    C3                      retn                                    ; 這個實際上是個跳轉

前面一個push,後面一個ret,實際上就是一個jmp,因此只管跳,碰到下面的ret 就要注意了,恢復ebp 就代表這個過程結束了

0044BD73    8B45 F8                 mov eax,dword ptr ss:[ebp-8]
0044BD76    5E                      pop esi
0044BD77    5B                      pop ebx
0044BD78    8BE5                    mov esp,ebp
0044BD7A    5D                      pop ebp                                 ; 恢復ebp了,就要注意了
0044BD7B    C3                      retn                                    ; 這個ret返回後的地址要注意

ret 後來到552379,上面一行的 call 就是呼叫 nag 的call

0055236A    A1 2C835600             mov eax,dword ptr ds:[56832C]
0055236F    8B00                    mov eax,dword ptr ds:[eax]
00552371    8B10                    mov edx,dword ptr ds:[eax]
00552373    FF92 D8000000           call dword ptr ds:[edx+D8]         ; 這個call就是呼叫nag的call
00552379    33C0                    xor eax,eax                        ; 返回到這
0055237B    5A                      pop edx
0055237C    59                      pop ecx
0055237D    59                      pop ecx
0055237E    64:8910                 mov dword ptr fs:[eax],edx
00552381    68 A6235500             push MSQingSh.005523A6
00552386    A1 2C835600             mov eax,dword ptr ds:[56832C]
0055238B    8B00                    mov eax,dword ptr ds:[eax]

把00552373這行nop掉,nag就沒有了 ^_^


3、但還沒有破解掉,因為雖然nag沒了,但20次的限制還是有的,用了20次後碰到要註冊的nag,這就說明這個nag是在上面去掉的nag前出現的,用od載入脫殼後的檔案(不是把上面去掉nag的檔案),F9執行,用剛才上面的方法確定nag的呼叫地址

005635D2    8990 EC020000           mov dword ptr ds:[eax+2EC],edx
005635D8    A1 CC825600             mov eax,dword ptr ds:[5682CC]
005635DD    8B00                    mov eax,dword ptr ds:[eax]
005635DF    E8 ACB5EEFF             call MSQingSh.0044EB90               ; nag的call
005635E4    E8 9BCCFFFF             call MSQingSh.00560284               ; 返回到這行
005635E9    E9 91070000             jmp MSQingSh.00563D7F                ; 跳走就over了

然後向上看會發現很多這樣的類似程式碼(call 44eb90 / call 560284 / jmp 563d7f),因此這段程式碼不能執行,一直向上看,程式碼類似就向上看直到看到程式碼不一樣的時候,憑經驗下斷點(在跳轉上下),然後重新執行,看看能否斷下來。我找到一段可疑程式碼

0056218D    33DB                    xor ebx,ebx                 ;最可疑的是這裡 ebx=0
0056218F    A1 54D05600             mov eax,dword ptr ds:[56D054]
00562194    8B40 30                 mov eax,dword ptr ds:[eax+30]
00562197    83C0 18                 add eax,18
0056219A    8B15 B87E5600           mov edx,dword ptr ds:[567EB8]        ; MSQingSh.0056B5E8
005621A0    8B52 24                 mov edx,dword ptr ds:[edx+24]
005621A3    E8 901CEAFF             call MSQingSh.00403E38
005621A8    8B15 B87E5600           mov edx,dword ptr ds:[567EB8]        ; MSQingSh.0056B5E8
005621AE    8B52 20                 mov edx,dword ptr ds:[edx+20]
005621B1    8BCB                    mov ecx,ebx
005621B3    A1 54D05600             mov eax,dword ptr ds:[56D054]
005621B8    E8 D358F0FF             call MSQingSh.00467A90
.......
中間有很多這樣結構的程式碼,太長了,不帖了
.......
00562823    8B15 B87E5600           mov edx,dword ptr ds:[567EB8]        ; MSQingSh.0056B5E8
00562829    8B52 28                 mov edx,dword ptr ds:[edx+28]
0056282C    B9 674F0000             mov ecx,4F67
00562831    A1 60D05600             mov eax,dword ptr ds:[56D060]
00562836    E8 6DDDFFFF             call MSQingSh.005605A8
0056283B    E9 52100000             jmp MSQingSh.00563892         ;這裡跳走

ebx = 0 ,猜測可能是清空計數器,從0開始計數(每次都清空,這樣不就等於無限次數用了嘛^_^),記住行號0056218d,向上看有哪個跳轉跳到這,很快就找到這裡

00561FDB    E8 B0CBEEFF         call MSQingSh.0044EB90
00561FE0    E8 9FE2FFFF         call MSQingSh.00560284
00561FE5    E9 951D0000         jmp MSQingSh.00563D7F
00561FEA    E8 B1E2FFFF         call MSQingSh.005602A0           ; 上面是無條件跳轉,記住這個行號
00561FEF    803D 88D05600 00    cmp byte ptr ds:[56D088],0
00561FF6    74 43               je short MSQingSh.0056203B
00561FF8    803D 89D05600 00    cmp byte ptr ds:[56D089],0
00561FFF    74 3A               je short MSQingSh.0056203B
00562001    803D 8AD05600 00    cmp byte ptr ds:[56D08A],0
00562008    74 31               je short MSQingSh.0056203B
0056200A    803D 8BD05600 00    cmp byte ptr ds:[56D08B],0
00562011    74 28               je short MSQingSh.0056203B
00562013    803D 8CD05600 00    cmp byte ptr ds:[56D08C],0
0056201A    74 1F               je short MSQingSh.0056203B
0056201C    803D 8DD05600 00    cmp byte ptr ds:[56D08D],0
00562023    74 16               je short MSQingSh.0056203B
00562025    803D 8ED05600 00    cmp byte ptr ds:[56D08E],0
0056202C    74 0D               je short MSQingSh.0056203B
0056202E    803D 8FD05600 00    cmp byte ptr ds:[56D08F],0
00562035    0F85 52010000       jnz MSQingSh.0056218D            ; 找到這了,上面的都不能跳,這個要跳
0056203B    A1 CC825600         mov eax,dword ptr ds:[5682CC]
00562040    8B00                mov eax,dword ptr ds:[eax]

在00561FEA下斷點發現斷不下來,所以繼續向上找跳到00561FEA的跳轉

00561B34    8B52 20             mov edx,dword ptr ds:[edx+20]
00561B37    B1 01               mov cl,1
00561B39    A1 54D05600         mov eax,dword ptr ds:[56D054]
00561B3E    E8 C95DF0FF         call MSQingSh.0046790C
00561B43    8BD8                mov ebx,eax
00561B45    84DB                test bl,bl
00561B47    0F84 F30C0000       je MSQingSh.00562840             ; 這是關鍵的跳轉,不能跳
00561B4D    8B0D B87E5600       mov ecx,dword ptr ds:[567EB8]    ; MSQingSh.0056B5E8
00561B53    8B49 28             mov ecx,dword ptr ds:[ecx+28]
00561B56    8D85 ECFEFFFF       lea eax,dword ptr ss:[ebp-114]
00561B5C    8B15 60D05600       mov edx,dword ptr ds:[56D060]
00561B62    E8 4925EAFF         call MSQingSh.004040B0
00561B67    8B85 ECFEFFFF       mov eax,dword ptr ss:[ebp-114]
00561B6D    E8 D676EAFF         call MSQingSh.00409248
00561B72    84C0                test al,al
00561B74    0F85 1E030000       jnz MSQingSh.00561E98         ;這些都不能跳,下面很多
......
中間很多這樣的程式碼,省略
......
00561E69    75 2D               jnz short MSQingSh.00561E98     ;不能跳
00561E6B    8B0D B87E5600       mov ecx,dword ptr ds:[567EB8]    ; MSQingSh.0056B5E8
00561E71    8B49 70             mov ecx,dword ptr ds:[ecx+70]
00561E74    8D85 A4FEFFFF       lea eax,dword ptr ss:[ebp-15C]
00561E7A    8B15 60D05600       mov edx,dword ptr ds:[56D060]
00561E80    E8 2B22EAFF         call MSQingSh.004040B0
00561E85    8B85 A4FEFFFF       mov eax,dword ptr ss:[ebp-15C]
00561E8B    E8 B873EAFF         call MSQingSh.00409248
00561E90    84C0                test al,al
00561E92    0F84 52010000       je MSQingSh.00561FEA             ; 找到這,這個要跳
00561E98    A1 CC825600         mov eax,dword ptr ds:[5682CC]
00561E9D    8B00                mov eax,dword ptr ds:[eax]
00561E9F    E8 54CCEEFF         call MSQingSh.0044EAF8

找到

00561E92    0F84 52010000       je MSQingSh.00561FEA     

但上面有很多

jnz short MSQingSh.00561E98

在第一個處下斷點發現斷不下來,因此找到關鍵的跳轉

00561B47    0F84 F30C0000       je MSQingSh.00562840             ; 這是關鍵的跳轉,不能跳

這是能斷下來的跳轉,直接改成 jmp 0056218D 跳到

0056218D    33DB                    xor ebx,ebx                 ;最可疑的是這裡 ebx=0

因為中間的程式碼都是判斷是否是第一次執行的,沒必要執行,直接跳不影響結果,F9執行,果然出現了剛用了一次的nag(用沒有去掉這個nag的檔案),然後在nag掉下面這行

00552373    FF92 D8000000           call dword ptr ds:[edx+D8]         ; 這個call就是呼叫nag的call

儲存一下MSQingShu_cRacKEd.exe,執行一下,呵呵,成功了^_^!
此時次數已不受限制了,下面的第四步可有可無,但是考慮到這篇文章第二部分是逆向的,所以乾脆就寫詳細點,把自己的名字也寫程式序裡^_^!

4、先確定自己名字的字元,新建文字檔案,寫入“cRacKEd bY 海風月影[NE365][DFCG]”,和“魔術情書 6.55  -  cRacKEd bY 海風月影[NE365][DFCG]”,沒有引號,前一個是放在about裡的,後一個是標題欄。然後用winHex開啟檔案,看到16進位制字元
用od執行破解後的程式,然後開啟記憶體(ALT+M),點右鍵選搜尋-整個區域,填入"(Richie)",沒有引號,注意大小寫,第一處

005C8540  69 6F 6E 06 13 D7 F7 D5 DF A3 BA D6 EC 20 BD AD  ion作者:朱 江
005C8550  28 52 69 63 68 69 65 29 00 00 0F 54 62 73 53 6B  (Richie)..TbsSk

這裡是delphi的控制元件的屬性,先記住偏移量005C8548,用loadPE查一下在檔案裡的偏移1c7148,用winHex修改此處的程式碼,儲存,執行,發現沒有用,這就說明在程式執行時修改了控制元件的屬性,這條路走不通了。。。。。。

繼續搜尋下一個,搜到

00BB1B1C  C4 A7 CA F5 C7 E9 CA E9 20 36 2E 35 35 20 20 20  魔術情書 6.55
00BB1B2C  20 20 D7 F7 D5 DF A3 BA D6 EC 20 BD AD 28 52 69    作者:朱 江(Ri
00BB1B3C  63 68 69 65 29 20 20 20 20 20 CD F8 D5 BE A3 BA  chie)     網站:
00BB1B4C  77 77 77 2E 43 6F 6F 6C 42 6F 6F 2E 63 6F 6D 00  www.CoolBoo.com.

呵呵,這不是標題欄嘛,記住00BB1B1C這個地址,可惜,這個地址是動態生成的,原來程式檔案裡沒有,因此要動態除錯,用od重新載入,發現都沒有00BB1B1C這個地址,看來要一步一步跟蹤了,開啟記憶體,把位址列露出來能看到就行了,然後一步步跟蹤,看看

記憶體映象,專案 36
 地址=00BB0000
 大小=00088000 (557056.)
 Owner=         00BB0000 (itself)
 區段=
 型別=Priv 00021004
 訪問=RW
 初始訪問=

這個頁面什麼時候出來

00403AE4    8B04DF              mov eax,dword ptr ds:[edi+ebx*8]   ; 這個是迴圈
00403AE7    43                  inc ebx
00403AE8    891D B0945600       mov dword ptr ds:[5694B0],ebx
00403AEE    85C0                test eax,eax
00403AF0    74 02               je short MSQingSh.00403AF4
00403AF2    FFD0                call eax                           ; 執行到某一個時出現頁面,下斷點
00403AF4    3BF3                cmp esi,ebx
00403AF6  ^ 7F EC               jg short MSQingSh.00403AE4

在00403AF0下斷點,F9慢慢按,發現頁面出來了就轉到00BB1B1C去看看,發現還全是00(幸運^_^),對00BB1B1C下記憶體寫入斷點,取消 call eax 的斷點,F9執行,斷在

00402980    FD                  std
00402981    F3:A5               rep movsd                          ; 斷在這,不能F8走
00402983    89C1                mov ecx,eax                        ; 在這下斷點,F9執行,取消斷點
00402985    83E1 03             and ecx,3
00402988    83C6 03             add esi,3
0040298B    83C7 03             add edi,3
0040298E    F3:A4               rep movsb
00402990    FC                  cld
00402991    5F                  pop edi
00402992    5E                  pop esi
00402993    C3                  retn

不能用F8走,一走就飛,所以在下一行下斷點,F9執行,取消斷點,然後一路F8,來到

0046A3C7    B8 30B25600         mov eax,MSQingSh.0056B230          ; 指標
0046A3CC    BA 03000000         mov edx,3
0046A3D1    E8 4E9DF9FF         call MSQingSh.00404124             ; 上面生成第一個字串
0046A3D6    FF35 14B25600       push dword ptr ds:[56B214]         ; 在這下斷點,這裡是第一個字串
0046A3DC    68 F8E64600         push MSQingSh.0046E6F8
0046A3E1    FF35 24B25600       push dword ptr ds:[56B224]         ; 這裡是6.55
0046A3E7    68 622C0000         push 2C62
0046A3EC    8D45 DC             lea eax,dword ptr ss:[ebp-24]
0046A3EF    50                  push eax
0046A3F0    B9 C6570000         mov ecx,57C6
0046A3F5    BA 700A0000         mov edx,0A70
0046A3FA    B8 04E74600         mov eax,MSQingSh.0046E704
0046A3FF    E8 78E8FFFF         call MSQingSh.00468C7C             ; 生成第二個字串
0046A404    FF75 DC             push dword ptr ss:[ebp-24]         ; 第二個字串
0046A407    B8 18B25600         mov eax,MSQingSh.0056B218          ; 連線後放入的地址(即指標)
0046A40C    BA 04000000         mov edx,4
0046A411    E8 0E9DF9FF         call MSQingSh.00404124             ; 連線兩個字元
0046A416    68 732C0000         push 2C73                          ; 來到這,然後向上看

所以,找一個空白的地方,把 魔術情書 6.55  -  cRacKEd bY 海風月影[NE365][DFCG] 複製過去,然後修改0056B218裡的內容,指向我們的字串,執行,出錯,暈!! 重來一次,斷在0046A3D6,仔細看每個字串

00BB1A8C                                      01 00 00 00              ...
00BB1A9C  0D 00 00 00 C4 A7 CA F5 C7 E9 CA E9 20 36 2E 35  ....魔術情書 6.5
00BB1AAC  35 00                                            5.


00BB1ACC                          01 00 00 00 32 00 00 00          ...2...
00BB1ADC  20 20 20 20 20 D7 F7 D5 DF A3 BA D6 EC 20 BD AD       作者:朱 江
00BB1AEC  28 52 69 63 68 69 65 29 20 20 20 20 20 CD F8 D5  (Richie)     

在 字串-8 偏移處有一個 01,在 字串-4 偏移處的值正好是字串的長度,應此我們把這兩個資訊也加上,再修改0056B218裡的內容,指向我們的字串,執行,發現標題已經變成 魔術情書 6.55  -  cRacKEd bY 海風月影[NE365][DFCG] 了,下面就是儲存了,在

0046A416    68 732C0000         push 2C73                          ; 來到這,然後向上看

處打個smc補丁,隨便找一片空地,寫程式碼

push 2c73
mov dword ptr ds:[0056B218],(放標題的地址)        ;smc補丁
jmp 46a41b                                            ;跳到push 2c73的下一行

儲存一下,標題欄就有我們的資訊了。

about裡的資訊找法和上面一樣,找到

0046A764    68 9B2C0000         push 2C9B
0046A769    8D45 88             lea eax,dword ptr ss:[ebp-78]
0046A76C    50                  push eax
0046A76D    B9 FF570000         mov ecx,57FF
0046A772    BA A90A0000         mov edx,0AA9
0046A777    B8 3CE94600         mov eax,MSQingSh.0046E93C
0046A77C    E8 FBE4FFFF         call MSQingSh.00468C7C
0046A781    8B55 88             mov edx,dword ptr ss:[ebp-78]      ; 在這裡 00BB207C
0046A784    B8 8CB25600         mov eax,MSQingSh.0056B28C          ; 指標
0046A789    E8 AA96F9FF         call MSQingSh.00403E38

修改方法可以用上面的方法,但這裡沒有連線兩個字串,所以我們可以這樣改

0046A764    BA 20805900         mov edx,MSQingSh.00598020          ; 假設字串存在00598020
0046A769    8955 88             mov dword ptr ss:[ebp-78],edx      ; 儲存一下,以防程式有校驗
0046A76C    EB 16               jmp short MSQingSh.0046A784        ; 跳到儲存指標
0046A76E    90                  nop
0046A76F    90                  nop
。。。。中間的nop 省略    
0046A782    90                  nop
0046A783    90                  nop
0046A784    B8 8CB25600         mov eax,MSQingSh.0056B28C          ; 指標
0046A789    E8 AA96F9FF         call MSQingSh.00403E38

上面要連線兩個字串,這裡不用,所以讓程式幫我們把指標填好,儲存,這樣就ok了。(注意要從 字串-8 偏移處開始複製)
我還把about裡圖片給去掉了,大家自己去試試看,或者看我下面SMC程式碼。



二、不脫殼打破解補丁
1、原理:未脫殼的程式檔案執行程式碼是動態生成的,所以不能用靜態修改儲存,自然想到SMC(Self Modify Code)來打補丁,關於SMC可以參考《加密與解密》第二版和《軟體加密技術內幕》中關於SMC的介紹,在這我們直接用例子說明

2、在哪打補丁:補丁位置很顯然放在殼把程式程式碼還原後,進入程式執行之前。對於壓縮殼,最簡單的地方就是在跳入oep時打補丁,對於這個程式,是用upx加殼的,跳入Oep的程式碼一般是
popad
jmp oep
那補丁打在哪呢? 打在popad 前面,因為popad 恢復暫存器前 暫存器是隨便我們用的,而殼程式碼又結束了,不影響程式正常執行。
3、下面要注意的問題就是空間問題,用od載入,跳入oep附近的程式碼

0064880A  ^\EB E2                    jmp short MSQingSh.006487EE
0064880C    61                       popad
0064880D  - E9 BE84F1FF              jmp MSQingSh.00560CD0
00648812    0000                     add byte ptr ds:[eax],al
00648814    0000                     add byte ptr ds:[eax],al
00648816    0000                     add byte ptr ds:[eax],al
00648818    0000                     add byte ptr ds:[eax],al
0064881A    0000                     add byte ptr ds:[eax],al

用loadPE 查一下64880d在檔案中的偏移是b0c0d,屬於第二區段,看一下區段表中第三區段的檔案中偏移b0e00,剩餘空間1f3
(這裡可以用 nbw的剩餘空間檢視器自動算,我找不到了,所以手動算一下),如果空間不夠,可以在後面加一個區段

然後我們把我們的程式碼插在
jmp short MSQingSh.006487EE

popad
之間。



打補丁後的程式碼如下,我儘量把我寫的程式碼的註釋寫詳細點:

0064880A  ^\EB E2                    jmp short MSQingSh.006487EE
0064880C    A2 F37F5C00              mov byte ptr ds:[5C7FF3],al                  ; 修改屬性5個
00648811    A2 FD7F5C00              mov byte ptr ds:[5C7FFD],al                  ; about裡圖片height=0,width=0
00648816    C605 07805C00 08         mov byte ptr ds:[5C8007],8                   ; about裡圖片autosize=false
0064881D    C605 61845C00 67         mov byte ptr ds:[5C8461],67                  ; about裡label.left
00648824    C605 68845C00 5A         mov byte ptr ds:[5C8468],5A                  ; about裡label.top
0064882B    C705 471B5600 E9410600   mov dword ptr ds:[561B47],641E9              ; 爆破點,兩個
00648835    C705 73235500 EB049090   mov dword ptr ds:[552373],909004EB
0064883F    C705 64A74600 BA898864   mov dword ptr ds:[46A764],648889BA           ; 修改程式碼
00648849    C705 68A74600 00895588   mov dword ptr ds:[46A768],88558900           ; 讓about裡有我們的資訊
00648853    C705 6CA74600 EB169090   mov dword ptr ds:[46A76C],909016EB
0064885D    C705 16A44600 E9CBE41D   mov dword ptr ds:[46A416],1DE4CBE9           ; 修改程式碼,讓程式跳到我們的程式碼,跳轉要用5個位元組,但考慮到最後一個位元組是00,和原來的程式一樣,所以我們只要改前面4個就行了

00648867    61                       popad                                        
00648868  - E9 6384F1FF              jmp MSQingSh.00560CD0
0064886D    0000                     add byte ptr ds:[eax],al
0064886F    0000                     add byte ptr ds:[eax],al
00648871    0000                     add byte ptr ds:[eax],al
00648873    0000                     add byte ptr ds:[eax],al
00648875    0000                     add byte ptr ds:[eax],al
00648877    0000                     add byte ptr ds:[eax],al
00648879    0000                     add byte ptr ds:[eax],al
0064887B    0000                     add byte ptr ds:[eax],al
0064887D    0000                     add byte ptr ds:[eax],al
0064887F    0000                     add byte ptr ds:[eax],al
00648881    0100                     add dword ptr ds:[eax],eax                   ; 這裡是我們儲存的資料
00648883    0000                     add byte ptr ds:[eax],al
00648885    2000                     and byte ptr ds:[eax],al
00648887    0000                     add byte ptr ds:[eax],al
00648889    6352 61                  arpl word ptr ds:[edx+61],dx                 ; 第一個字串(about裡的)
0064888C    634B 45                  arpl word ptr ds:[ebx+45],cx
0064888F    64:2062 59               and byte ptr fs:[edx+59],ah
00648893    20BA A3B7E7D4            and byte ptr ds:[edx+D4E7B7A3],bh
00648899    C2 D3B0                  retn 0B0D3
0064889C    5B                       pop ebx
0064889D    4E                       dec esi
0064889E    45                       inc ebp
0064889F    3336                     xor esi,dword ptr ds:[esi]
006488A1    35 5D5B4446              xor eax,46445B5D
006488A6    43                       inc ebx
006488A7    47                       inc edi
006488A8    5D                       pop ebp
006488A9    0001                     add byte ptr ds:[ecx],al
006488AB    0000                     add byte ptr ds:[eax],al
006488AD    0032                     add byte ptr ds:[edx],dh
006488AF    0000                     add byte ptr ds:[eax],al
006488B1    00C4                     add ah,al                                    ; 第二個字串(標題欄的)
006488B3    A7                       cmpsd
006488B4    CA F5C7                  retf 0C7F5
006488B7  - E9 CAE92036              jmp 36857286
006488BC    2E:34 39                 xor al,39
006488BF    2020                     and byte ptr ds:[eax],ah
006488C1    2D 20206352              sub eax,52632020
006488C6    61                       popad
006488C7    634B 45                  arpl word ptr ds:[ebx+45],cx
006488CA    64:2062 59               and byte ptr fs:[edx+59],ah
006488CE    20BA A3B7E7D4            and byte ptr ds:[edx+D4E7B7A3],bh
006488D4    C2 D3B0                  retn 0B0D3
006488D7    5B                       pop ebx
006488D8    4E                       dec esi
006488D9    45                       inc ebp
006488DA    3336                     xor esi,dword ptr ds:[esi]
006488DC    35 5D5B4446              xor eax,46445B5D
006488E1    43                       inc ebx
006488E2    47                       inc edi
006488E3    5D                       pop ebp
006488E4    0000                     add byte ptr ds:[eax],al
006488E6    68 732C0000              push 2C73                                    ; 儲存原來程式碼
006488EB    C705 18B25600 B2886400   mov dword ptr ds:[56B218],MSQingSh.006488B2  ; 打補丁
006488F5  - E9 211BE2FF              jmp MSQingSh.0046A41B                        ; 跳回去

4、改完後儲存一下,因為這是在殼上打補丁,所以不用考慮可讀可寫可執行的問題,下面就用keymaker做一下檔案補丁就行了,這裡我用的是dREAMtHEATER的XCell(R) Version 1.0做的補丁



--------------------------------------------------------------------------------
【破解總結】


後記:本文難度不大,主要是做一個拋磚引玉的作用,最近很忙,而且上不了網,我是破解的魔術情書 6.49版,剛破完發現出來了6.55版,好在同一作者程式設計思路相同,所以6.55版破解的點和6.49一樣,還有作者的其他些軟體都差不多。這篇文章寫好時 6.56版又出來了。。。。。。 作者動作真快,大家用6.56版對照這看吧,程式碼基本都是一樣的。
本文只是暴力破解,對於判斷是否註冊的地方一直沒找到,希望有高手能指點一二。
--------------------------------------------------------------------------------
【爆破地址】


00552373    FF92 D8000000  call dword ptr ds:[edx+D8];nop掉
00561B47    0F84 F30C0000  je MSQingSh.00562840;改成 jmp 0056218D
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

2004-12-4 

相關文章