好友
阅读权限 20
听众
最后登录 1970-1-1
【文章标题】: ZAPLINE 转载(CM--第八天)算法分析
【文章作者】: x80x88
【作者邮箱】: x80x88@163.com
【下载地址】: http://www.52pojie.cn/thread-18487-1-1.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
初写破文,大家凑和着看吧!主要是骗点钱
无壳,Z大说了是汇编的
用户名:x80x88,试炼码:12345678,OD载入
闲话少说,定位断点应该好找吧,用字串参考就可以了!
从这里往下看:
.......
00401288 push ebp
00401289 mov ebp,esp
0040128B add esp,-104
00401291 mov dword ptr ss:[ebp-104],0
0040129B push 80
004012A0 lea eax,dword ptr ss:[ebp-80]
004012A3 push eax
004012A4 push 3ED
004012A9 push dword ptr ds:[40300C]
004012AF call <jmp.&user32.GetDlgItemTextA> ; 取用户名
004012B4 cmp eax,5 ; 判断用户名位数是否大于5位
004012B7 jb CRACKME1.00401384
004012BD push 80
004012C2 lea eax,dword ptr ss:[ebp-100]
004012C8 push eax
004012C9 push 3EE
004012CE push dword ptr ds:[40300C]
004012D4 call <jmp.&user32.GetDlgItemTextA> ; 取假码
004012D9 cmp eax,8 ; 判断假码位数是否为8位
004012DC jnz CRACKME1.00401384
004012E2 lea edx,dword ptr ss:[ebp-100]
004012E8 push edx
004012E9 call CRACKME1.00401470
004012EE push eax
004012EF call CRACKME1.00401386 ; 经过这个Call以后eax=12345678,我输入的假码,前面就是格式转换了:)
004012F4 cmp eax,0
004012F7 je CRACKME1.00401384
---------------------------------
004012FD xor edx,edx
004012FF xor eax,52476433 ; 12345678 xor 52476433=4073324B
00401304 xor eax,52472456 ; 4073324B xor 52472456=1234161D
00401309 sub eax,4000000 ; 1234161D-4000000=0E34161D
---------------------------------
假码的一小段计算,最后结果为0E34161D-------->①
0040130E mov ebx,1
00401313 rol ebx,10 ; 经过rol 10后ebx=10000
00401316 lea esi,dword ptr ss:[ebp-80]
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00401319 cmp byte ptr ds:[esi],0
0040131C je short CRACKME1.0040132B
0040131E movzx edx,byte ptr ds:[esi] ; [esi]中为假码,按位取假码参与运算
00401321 rol edx,10
00401324 add eax,edx
00401326 sub eax,ebx
00401328 inc esi
00401329 jmp short CRACKME1.00401319
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这1段循环计算看着有点头晕,自己跟一遍其实很简单,以我的为例
假码经过前面1段计算后的值①为0E34161D,我的用户名为"x80x88",用户名各位ASCII码16进制和为1C8,用户名位
数为6位,则这段的计算为0E34161D+(1C8 rol 10)+6*10000=0FF6161D-------->②
0040132B mov ebx,eax ; EAX=0FF6161D
0040132D ror ebx,10 ; 高低位互换,此时EBX=161D0FF6
00401330 cmp bx,0C390 ; 比较上面计算结果的高4位是否为C390,即0FF6与C390比较,第1次验证
00401335 jnz short CRACKME1.00401384 ; 可以知道高位必须为固定值C390
00401337 mov dword ptr ss:[ebp-104],eax
0040133D mov ecx,4 ; ECX赋值4,置循环次数
00401342 xor edx,edx
00401344 xor ebx,ebx
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00401346 cmp ecx,0
00401349 je short CRACKME1.00401355
0040134B mov bl,al
0040134D add edx,ebx
0040134F ror eax,8
00401352 dec ecx
00401353 jmp short CRACKME1.00401346
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这段循环取前面一个循环的计算结果②为0FF6161D计算,即1D+16+F6+0F=138为EDX中的最后值
00401355 cmp edx,285 ; 比较上面循环的计算结果是否为285,此处为138与285进行比较
0040135B jnz short CRACKME1.00401384 ; 第2处验证
0040135D lea ebx,dword ptr ss:[ebp-104] ; 将我们的计算结果②0FF6161D赋值给EBX
00401363 call ebx ; 这里是个很有意思的地方:)
到这里我们看一下下面,是对EDI的判断,EDI为0则注册成功,而前面EDI并未参与运算,加上一个Call ebx,我们猜测ebx中的值就是机
器码,如果还原得不对则程序出错!要edi为0一般是xor edi,edi,其机器码为33FF,验证一下是否满足第2个验证:33+FF+C3+90=285,ok了
现在我们可以逆推一下注册码了,要注册成功,则②处的值必须为C390FF33
C390FF33+6*10000-(1C8 rol 10)=C1CEFF33 (1C8为用户名和位ASCII码16进制和)
C1CEFF33+4000000=C5CEFF33
C5CEFF33 XOR 52472456=9789DB65
9789DB65 XOR 52476433=C5CEBF56----->我们的真码
00401365 cmp edi,0
00401368 jnz short CRACKME1.00401384
0040136A push 1040
0040136F push CRACKME1.00402240 ; keygen me - b2c_2k5
00401374 push CRACKME1.00402254 ; congrats u did it :)\nnow code me a keygen and write a tut as alway..
00401379 push dword ptr ds:[40300C]
0040137F call <jmp.&user32.MessageBoxA> ; 注册成功提示
00401384 leave
00401385 retn
--------------------------------------------------------------------------------
【经验总结】
没啥经验,感觉写文章好累:)
--------------------------------------------------------------------------------
【版权声明】: 本文原创于x80x88, 转载请注明作者并保持文章的完整, 谢谢!
2009年02月04日 10:41:34
[ 本帖最后由 x80x88 于 2009-2-4 16:01 编辑 ]
免费评分
查看全部评分