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