标 题:破解Crackme(Buzz'm_Frog's) (5千字)
发信人:VitaminC
时 间:2002-3-18 22:58:06
详细信息:
破解Crackme(Buzz'm_Frog's):
这个程序和它的第一个一样,是用BC++写的,同样,它获得NAME和NUM.的方法和第一个是一样的,好像正好和前几个程序也是一样的.不能用那个GETWINDOWTEXTA和GETDLGITEMTEXTA设断,要用HMEMCPY.这个东东没他写的第二个好破,至少第二个程序在你输入了错误的NUM.会有提示.这样搞到我不知在哪就已经判断了...弄得我一开始在程序里瞎忙呼!还是有出错提示的好啊...
好了言归正传:
会在这里中断:
...
:0040157E 8B0DE0AE4300 mov ecx, dword
ptr [0043AEE0]
:00401584 8B81D0010000 mov eax, dword
ptr [ecx+000001D0] /*用D可以看到00BA4840这个地址*/
:0040158A E80D940000 call 0040A99C
/*这个CALL取得NAME放在00BA4840*/
:0040158F 8D55DC
lea edx, dword ptr [ebp-24]
:00401592 8D45FC
lea eax, dword ptr [ebp-04]
:00401595 E88DE10000 call 0040F727
:0040159A FF4D9C
dec [ebp-64]
:0040159D 8D45DC
lea eax, dword ptr [ebp-24]
:004015A0 BA02000000 mov edx,
00000002
:004015A5 E84EE10000 call 0040F6F8
:004015AA 66C745908000 mov [ebp-70],
0080
:004015B0 8D45D8
lea eax, dword ptr [ebp-28]
:004015B3 E840040000 call 004019F8
:004015B8 8BD0
mov edx, eax
:004015BA FF459C
inc [ebp-64]
:004015BD 8B0DE0AE4300 mov ecx, dword
ptr [0043AEE0]
:004015C3 8B81D4010000 mov eax, dword
ptr [ecx+000001D4]/*用D可以看到00BA4858这个地址*/
:004015C9 E8CE930000 call 0040A99C
/*这个CALL取得NUM.放在00BA4858*/
...
看上去是那么多CALL...也不知自己进去了多少个CALL.谁知又是白忙...
过了这段,就要小心了,这是常规.但这个程序好多的CALL都是没用的(呵呵对于我们CRACKER来说).就算CALL前是传入了NAME或NUM.都是没用的:-(.
好了,要到这里是关键:
* Referenced by a CALL at Addresses:
|:00403CD3 , :00407789 , :00408313 , :0040A807 , :0040A9F5
|:0040F7E0 , :0040F7F6 , :0040F80C , :0040F822 , :004187DF
|:0041CC40 , :0041F7AD , :0041F854 , :0041FB5B
|
:00425C9C 53
push ebx
:00425C9D 56
push esi
:00425C9E 57
push edi
:00425C9F 89C6
mov esi, eax
:00425CA1 89D7
mov edi, edx
:00425CA3 39D0
cmp eax, edx/*关键啊!不过难以发现!*/
:00425CA5 0F848F000000 je 00425D3A
...
说实在,能到这里我也不知是进了哪个CALL,反正一开始跟踪我发现来了这几次,留意了那个CMP并设了断,特别在我在那里用了D,你想我看到了什么?看到了123,和CA-,其实这就是好东东,那个123是我常用的NUM.(1234abcd)中的123!而那个CA-就是注册码中的前三位!GOD,立即把EAX和EDI改相等,试试!对就这样!用F5...
^-^你会发现又在这里中断了,(希望你没有用BC *因为只比较了123后面一定还有比较!)当然如果你没把EAX=EDX是不会再回来的,只会在程序的领空里打转...好,灵感一来,用D看看...又是好东东是4abcd和-3914!全出来了!退出去,把CA--3914输入去,又是一个容易的...且慢!你会发现这是不行的,又是希望你在SICE里没有BC
*!你会发现会三次回到这个比较!(当然前两次要使EAX=EDX)那时用D,行了你想要的都出来了!CA-684101-3914!这就是Vitamin C对应的正确的NUM.!OK!
好了,还有就是去找算法了...
那么多的CALL,并好像每个CALL都与NUM.和NAME有关...:-(
^-^好在我在第二次过了:00425CA3那个CMP后我还细心看了代码,找到了这一段:(我关心有MOVSX的,呵呵...)
...
:00401698 8D45FC
lea eax, dword ptr [ebp-04]
:0040169B E888030000 call 00401A28
:004016A0 8B9570FFFFFF mov edx, dword
ptr [ebp+FFFFFF70]
:004016A6 0FBE0C10 movsx
ecx, byte ptr [eax+edx] /*这种代码见过吧?常用来取一个字符
:004016AA 018D74FFFFFF add dword ptr
[ebp+FFFFFF74], ecx 加上JG之类的跳跃就可取全每个字符
:004016B0 FF8570FFFFFF inc dword ptr
[ebp+FFFFFF70] 了,这里还是那样,取NAME的每个字符
然后相加*/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401696(U)
|
:004016B6 8D45FC
lea eax, dword ptr [ebp-04]
:004016B9 E894E20000 call 0040F952
:004016BE 3B8570FFFFFF cmp eax, dword
ptr [ebp+FFFFFF70]
:004016C4 7FD2
jg 00401698
:004016C6 8B9574FFFFFF mov edx, dword
ptr [ebp+FFFFFF74]
:004016CC 0FAF9574FFFFFF imul edx, dword ptr
[ebp+FFFFFF74]/*相加得到的数字的平方*/
:004016D3 81C2AC000000 add edx, 000000AC
/*再加上ACH,到了这里,用? EDX你
:004016D9 899574FFFFFF mov dword ptr
[ebp+FFFFFF74], edx 会见到相识的A7045H->684101D*/
:004016DF 66C74590A400 mov [ebp-70],
00A4
:004016E5 8D45CC
lea eax, dword ptr [ebp-34]
:004016E8 8B9574FFFFFF mov edx, dword
ptr [ebp+FFFFFF74]
...
分析代码得出算法:
NAME的每个字符的16进制代码相加后再平方,最后加上ACH,就得出了,NUM.中间部分.
...
那么CA-和-3914呢?
它们分别是在第一次CMP和第二次CMP中已出现,那么我想,CA-是可到在第一次CPM前得来的...
那就在第二次HMEMCPY和第一次CMP间找算法....用了不少时间...
没找到...^-^...
我总不能分析它的每个CALL吧?
等等!我知道CA-放在00BA4830,-3914放在00BA6BF0.(在CMP时用D知道的.)那么...我在SICE里一开始进入程序领空时就D 00BA4830和D
00BA6BF0,O!GOD,它们已经存在了...会不会是上次载入程序后留下的?那简单,重启计算机,再来D一次,它们还是存在的!那么大胆认为,CA-和-3914是固定的!
那好来验证一下,换一个NAME,算出中简的NUM.前后加上CA-和-3914...
OK了!我的设想是正确的!
NAME:Vitamin C
NUM.:CA-684101-3914
OK!
Vitamin C[抗坏血酸].2002.2.5.HY.GD.CHI.