*輔助工具 1.0 Encrypt by Stkman 完美暴破(應該只能用暴力了) (11千字)

看雪資料發表於2002-04-03

名稱:*輔助工具 1.0
下載:http://www.stkman.net

簡介:一款包含了非常聰明的投注方法的軟體,它可以將你對足球的瞭解充分量化到足彩投注中去。

限制:未註冊只能產生8條投注單
原因:純屬練習

此類軟體對我沒用,只是以前看到stkman在徵集破解,很佩服stkman對演算法的研究,於是下載來練習,不過最近才有空來擺弄,不知是否有人貼過它的破解,我沒留意,至於完美不完美,還是要stkman來表態的

聽stkman說此程式是用他寫的加密工具處理過,只能考慮用暴力破解了,程式是ASPack 2.x加殼,輕鬆脫殼,它用KeyFile來保護的,開啟KeyFile就被那長長的一大串數字嚇倒了,同時還看到了__unreg,既然程式用了KeyFile,我們就先用bpx readfile來設斷吧,同樣為了不受其它程式的影響,我們先用TRW載入主程式再下斷點,F5,程式彈出一個MessageBox,說KeyFile不存在,呵呵,看來程式一開始就有保護了,重來,這次用bpx MessageBoxA,攔下後用pmodule進入程式領空,我們來到下面的地方:

==Step 1==================================================
0187:00402BAD  PUSH    BYTE +00
0187:00402BAF  PUSH    EAX
0187:00402BB0  CALL    00411880      <---裡面應該是一些保護吧,沒看
0187:00402BB5  MOV      EDX,[004325A8]
0187:00402BBB  MOV      EAX,[EDX+04]
0187:00402BBE  TEST    BYTE [EAX+004325AC],06
0187:00402BC5  JZ      00402BE3      <---如果不跳就是"KeyFile不存在"
0187:00402BC7  PUSH    DWORD 2010
0187:00402BCC  PUSH    DWORD 0042D4C4
0187:00402BD1  PUSH    DWORD 0042D580
0187:00402BD6  PUSH    BYTE +00
0187:00402BD8  CALL    `USER32!MessageBoxA`
0187:00402BDE  XOR      EAX,EAX
0187:00402BE0  RET      10
0187:00402BE3  CALL    004012D0      <---Call 1
0187:00402BE8  TEST    EAX,EAX
0187:00402BEA  JZ      00402C08
0187:00402BEC  PUSH    DWORD 2010
0187:00402BF1  PUSH    DWORD 0042D4C4
0187:00402BF6  PUSH    DWORD 0042D548
0187:00402BFB  PUSH    BYTE +00
0187:00402BFD  CALL    `USER32!MessageBoxA` <---如果上面不跳的話就會彈出"KeyFile不合法"看
0187:00402C03  XOR      EAX,EAX                  來上面的Call是在檢驗KeyFile我們先進入看看
0187:00402C05  RET      10
0187:00402C08  MOV      ECX,[ESP+04]
0187:00402C0C  PUSH    BYTE +00
0187:00402C0E  PUSH    DWORD 004025F0
0187:00402C13  PUSH    BYTE +00
0187:00402C15  PUSH    BYTE +65
0187:00402C17  PUSH    ECX
0187:00402C18  CALL    `USER32!DialogBoxParamA`  <---程式介面

==Call 1==========================================================
這裡只是最後的一部分,前面有很多略掉,因為我猜想stkman肯定不會用一些簡單的演算法來加密的,也許是一些上百位的演算法吧,反正我的數學最差,記得讀大學時那兩冊厚厚的高等數學我只看了20多頁,我自己都不知道是如何畢業的:-)雖然程式來到最後,但我們的KeyFile肯定是沒註冊的啦,那我們看看程式在幹什麼


0187:004014AB  CALL    00407050
0187:004014B0  ADD      ESP,BYTE +44
0187:004014B3  TEST    EAX,EAX
0187:004014B5  JZ      004014D6      <--- 一定跳
0187:004014B7  PUSH    EBP
0187:004014B8  CALL    00406920
0187:004014BD  PUSH    EDI
0187:004014BE  CALL    00406920
0187:004014C3  ADD      ESP,BYTE +08
0187:004014C6  MOV      EAX,01
0187:004014CB  POP      EDI
0187:004014CC  POP      ESI
0187:004014CD  POP      EBP
0187:004014CE  POP      EBX
0187:004014CF  ADD      ESP,09C4
0187:004014D5  RET   
0187:004014D6  MOV      ESI,0042D454  <---d esi="__unreg"
0187:004014DB  LEA      EAX,[ESP+38]  <---d eax="__unreg"
0187:004014DF  MOV      DL,[EAX]
0187:004014E1  MOV      CL,DL
0187:004014E3  CMP      DL,[ESI]      <---兩字串比較,不等就跳走了,這裡我在猜想程式
0187:004014E5  JNZ      00401503          用KeyFile算出裡面的註冊名,與__unreg比較
0187:004014E7  CMP      CL,BL              相等的話程式就是未註冊版,於是將[esp+38]
0187:004014E9  JZ      004014FF          裡的__unreg改成Sam.com,F5,程式的註冊使用者
0187:004014EB  MOV      DL,[EAX+01]        變成Sam.com了,哈哈~~~~既然如此我們就先來
0187:004014EE  MOV      CL,DL              給程式做個小手術,請看下面
0187:004014F0  CMP      DL,[ESI+01]
0187:004014F3  JNZ      00401503
0187:004014F5  ADD      EAX,BYTE +02
0187:004014F8  ADD      ESI,BYTE +02
0187:004014FB  CMP      CL,BL
0187:004014FD  JNZ      004014DF
0187:004014FF  XOR      EAX,EAX
0187:00401501  JMP      SHORT 00401508
0187:00401503  SBB      EAX,EAX
0187:00401505  SBB      EAX,BYTE -01
0187:00401508  CMP      EAX,EBX
0187:0040150A  JNZ      00401514
0187:0040150C  MOV      [0043274C],EBX
0187:00401512  JMP      SHORT 00401546
0187:00401514  LEA      EDI,[ESP+38]  <---!!
0187:00401518  OR      ECX,BYTE -01
0187:0040151B  XOR      EAX,EAX
0187:0040151D  MOV      DWORD [0043274C],01
0187:00401527  REPNE SCASB            <---看到這個我才會有上面的猜想
0187:00401529  NOT      ECX
0187:0040152B  SUB      EDI,ECX
0187:0040152D  MOV      EAX,ECX
0187:0040152F  MOV      ESI,EDI
0187:00401531  MOV      EDI,00432790
0187:00401536  SHR      ECX,02
0187:00401539  REP MOVSD
0187:0040153B  MOV      ECX,EAX
0187:0040153D  AND      ECX,BYTE +03
0187:00401540  REP MOVSB
0187:00401542  MOV      EDI,[ESP+14]
0187:00401546  PUSH    EBP
0187:00401547  CALL    00406920
0187:0040154C  PUSH    EDI
0187:0040154D  CALL    00406920
0187:00401552  ADD      ESP,BYTE +08
0187:00401555  XOR      EAX,EAX
0187:00401557  POP      EDI
0187:00401558  POP      ESI
0187:00401559  POP      EBP
0187:0040155A  POP      EBX
0187:0040155B  ADD      ESP,09C4
0187:00401561  RET   

改程式的目的主要是想將[esp+38]裡的__unreg改成我自己的名字,那我們在那裡找空間來修改呢,其實上面比較字串的那一段的功能只是比較,對程式的其它地方沒有影響,那我們就利用它吧,從4014DF處我改成(用Hiew改,不過要注意在Hiew裡我們看到的程式碼和這裡的有點不同如第一行應寫成mov d,[eax],2E6D6153):

mov [eax],dword ptr 2E6D6153h    <---寫入"Sam.com"
mov [eax+4],dword ptr 006D6F63h
jmp 00401503

改好後試試,呵呵~~~~~~~~成功!!別高興得太早,雖然程式顯示了我的註冊名,但是它的功能限制還沒去掉呢,先試試它的功能,按下"生成投注檔案"程式會生成一個soccer.txt檔案,裡面果然只有8條投注單,那好辦,我們就用bpx writefile來設斷吧,然後就是漫長的跟蹤,過程也記不起了,最後找到下面的地方:

==Step 2=========================================================
0187:00401B20  MOV      EAX,[0043278C]  <---每次來到這裡都增加了1
0187:00401B25  MOV      ECX,[004327F4]  <---裡面是8,應該就是它了吧,將[004327F4]改成FF試試
0187:00401B2B  INC      EAX                  請往下看我的小總結
0187:00401B2C  PUSH    ESI
0187:00401B2D  CMP      EAX,ECX
0187:00401B2F  MOV      [0043278C],EAX
0187:00401B34  JG      NEAR 00401C0F    <---大於8就跳出Call了
0187:00401B3A  PUSH    EBX
0187:00401B3B  PUSH    EBP
0187:00401B3C  MOV      EBP,[ESP+10]
0187:00401B40  PUSH    EDI
0187:00401B41  XOR      EBX,EBX
0187:00401B43  MOV      EDI,004326E4
0187:00401B48  MOV      ESI,00432758
0187:00401B4D  CMP      EBX,[EBP*4+0042D2C4]
0187:00401B54  JG      00401B68
0187:00401B56  PUSH    DWORD 0042D4D8
0187:00401B5B  PUSH    ESI
0187:00401B5C  PUSH    DWORD 00432650
0187:00401B61  CALL    004054E0
0187:00401B66  JMP      SHORT 00401B92
0187:00401B68  MOV      EAX,[EDI-04]
0187:00401B6B  PUSH    DWORD 0042D4D8
0187:00401B70  TEST    EAX,EAX
0187:00401B72  JZ      00401B85
0187:00401B74  PUSH    DWORD 0042D4D0
0187:00401B79  PUSH    DWORD 00432650
0187:00401B7E  CALL    004054E0
0187:00401B83  JMP      SHORT 00401B92
0187:00401B85  MOV      AL,[EDI]
0187:00401B87  PUSH    EAX
0187:00401B88  PUSH    DWORD 00432650
0187:00401B8D  CALL    00405770
0187:00401B92  ADD      ESP,BYTE +08
0187:00401B95  PUSH    EAX
0187:00401B96  CALL    004054E0
0187:00401B9B  ADD      ESP,BYTE +08
0187:00401B9E  ADD      ESI,BYTE +04
0187:00401BA1  INC      EBX
0187:00401BA2  ADD      EDI,BYTE +08
0187:00401BA5  CMP      ESI,0043278C
0187:00401BAB  JL      00401B4D
0187:00401BAD  PUSH    BYTE +0A
0187:00401BAF  MOV      ECX,00432650
0187:00401BB4  CALL    00402CB0
0187:00401BB9  MOV      ECX,[00432650]
0187:00401BBF  XOR      ESI,ESI
0187:00401BC1  POP      EDI
0187:00401BC2  POP      EBP
0187:00401BC3  MOV      EAX,[ECX+04]
0187:00401BC6  POP      EBX
0187:00401BC7  TEST    BYTE [EAX+00432654],06
0187:00401BCE  JNZ      00401BE7
0187:00401BD0  MOV      EAX,[EAX+00432678]
0187:00401BD6  MOV      ECX,EAX
0187:00401BD8  MOV      EDX,[EAX]
0187:00401BDA  CALL    NEAR [EDX+2C]
0187:00401BDD  CMP      EAX,BYTE -01
0187:00401BE0  JNZ      00401BE7
0187:00401BE2  MOV      ESI,04
0187:00401BE7  MOV      EAX,[00432650]
0187:00401BEC  MOV      ECX,[EAX+04]
0187:00401BEF  ADD      ECX,00432650
0187:00401BF5  TEST    ESI,ESI
0187:00401BF7  JZ      00401C0F
0187:00401BF9  MOV      EAX,[ECX+04]
0187:00401BFC  MOV      EDX,[ECX+28]
0187:00401BFF  OR      EAX,ESI
0187:00401C01  TEST    EDX,EDX
0187:00401C03  JNZ      00401C07
0187:00401C05  OR      AL,04
0187:00401C07  PUSH    BYTE +00
0187:00401C09  PUSH    EAX
0187:00401C0A  CALL    00411880
0187:00401C0F  POP      ESI
0187:00401C10  RET   

小總結:[004327F4]改成FF後我們發現程式生成的投注單已經不止8條了,不過還有問題,程式應該生成700多條的投注單,但我們最多隻能生成15條,看來程式還有其它比較的地方,先不管它,我們先來保證程式能生成最多的投注單,經測試,程式最多也只能生成幾萬條的投注單,那當然了,生成再多的投注單也沒用,我們有這麼多錢去投注嗎:-( 動手吧,我們要改的地方如下(我曾經查詢過[004327F4]的地方想在它生成8這個數的地方修改,只找到了一個地方,但發現它生成這個8並不是簡單的放到記憶體中,而是有一大堆的演算法,還不能亂修改,因為程式的其它地方要呼叫那幾個Call,改後程式執行就不正常了):

0187:00401B20 A18C274300      MOV      EAX,[0043278C]
0187:00401B25 8B0DF4274300    MOV      ECX,[004327F4] <---改成mov ecx,00FFFFFF
0187:00401B2B 40              INC      EAX                最後還多了一個位元組,要將它改為nop,
0187:00401B2C 56              PUSH    ESI                FFFFFF已經足夠用了
0187:00401B2D 3BC1            CMP      EAX,ECX
0187:00401B2F A38C274300      MOV      [0043278C],EAX
0187:00401B34 0F8FD5000000    JG      NEAR 00401C0F

我們再找找其它比較的地方,用F12退出這個Call,我們來到下面的地方:

==Step 3=========================================================
0187:00401C20  MOV      EAX,[ESP+04]
0187:00401C24  PUSH    ESI
0187:00401C25  TEST    EAX,EAX
0187:00401C27  MOV      EAX,[00432754]
0187:00401C2C  MOV      ECX,[EAX*4+0042D2C4]
0187:00401C33  JZ      00401C7C        <---跳過去了
0187:00401C35  MOV      ESI,[ESP+0C]
0187:00401C39  MOV      DL,[ECX*8+004326E5]
0187:00401C40  TEST    ESI,ESI
0187:00401C42  MOV      [ECX*4+00432758],DL
0187:00401C49  JNZ      00401C69        <---也跳過去了
0187:00401C4B  CMP      EAX,[0042D300]  <---這裡的比較如果不跳的話就會進入上面Step 2的地方
0187:00401C51  JNL      00401CC7            在這不停的按F7你會發現這個比較有點象查表,10多次後
0187:00401C53  PUSH    EAX                就永遠進不了Step 2,那我們就將401C51這一行nop掉看看,
0187:00401C54  CALL    00401B20            Bingo~~~~~~就是它了

0187:00401C59  MOV      EAX,[00432754]  <---出來後我們停在這裡,往上看看可疑的地方
0187:00401C5E  ADD      ESP,BYTE +04
0187:00401C61  DEC      EAX
0187:00401C62  MOV      [00432754],EAX
0187:00401C67  POP      ESI
0187:00401C68  RET   

總結:至此,我們完全將它的限制去掉了,生成的投注單一個都不少,而且還顯示為註冊版,我們要改的地方只有3個而已,你可以將脫殼後的程式用Hiew修改,不過因為脫殼後的程式比原來大了3倍,於是決定用記憶體補丁的方法來寫一個Loader,生成的Loader只有5KB,效果一樣,要改的資料如下(用序號產生器編寫器裡的"製作記憶體補丁"):

修改地址  長度      原始指令        修改指令
4014DF    6      8A108ACA3A16    C70053616D2E
4014E5    7      751C3ACB74148A  C74004636F6D00
4014EC    5      50018ACA3A      E912000000
401B25    6      8B0DF4274300    B9FFFFFF0090
401C51    2      7D74            9090

-=eND=-

      _/_/_/
    _/          _/_/_/  _/_/_/  _/_/
    _/_/    _/    _/  _/    _/    _/
        _/  _/    _/  _/    _/    _/
_/_/_/      _/_/_/  _/    _/    _/

                                              Sam.com
                                          7:02 2002-4-3

相關文章