• 标 题:*辅助工具 1.0 Encrypt by Stkman 完美暴破(应该只能用暴力了) (11千字)
  • 作 者:Sam.com
  • 时 间:2002-4-3 7:38:51
  • 链 接:http://bbs.pediy.com

名称:*辅助工具 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

  • 标 题:加个smc (1012字)
  • 作 者:真.hp
  • 时 间:2002-4-3 10:08:23
  • 链 接:http://bbs.pediy.com

60                      pusha                ;保存所有寄存器的值
BE 30 03 40 00          mov    esi, 40032Ah  ;指向数据开始处
BF DF 14 40 00          mov    edi, 4014DFh  ;指向要修改的地方
31 C9                  xor    ecx, ecx
B1 12                  mov    cl, 12h      ;要改18字节
F3 A4                  repe movsb
BF 25 1B 40 00          mov    edi, 401B25h  ;指向第2个要改的地方
B1 06                  mov    cl, 6
F3 A4                  repe movsb
BF 51 1C 40 00          mov    edi, 401C51h  ;指向第3个要改的地方
B1 02                  mov    cl, 2
F3 A4                  repe movsb
61                      popa                  ;恢复所有寄存器的值
68 79 C4 40 00          push    40C479h
C3                      retn                  ;转到oep


上面的代码:
60BE2A034000BFDF14400031C9B112F3A4BF251B4000B106F3A4BF511C4000B102F3A4616879C44000C3
数据:
C70053616D2EC74004636F6D00E912000000B9FFFFFF00909090

把这些放到400300处,然后把文件的14D9B处改为00 03即可。