标 题:破解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.