Zapline 转载(CM--第八天)算法简析
【文章标题】: ZAPLINE 转载(CM--第八天)算法分析【文章作者】: x80x88
【作者邮箱】: x80x88@163.com
【下载地址】: http://www.52pojie.cn/thread-18487-1-1.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
初写破文,大家凑和着看吧!主要是骗点钱:lol
无壳,Z大说了是汇编的
用户名:x80x88,试炼码:12345678,OD载入
闲话少说,定位断点应该好找吧,用字串参考就可以了!
从这里往下看:
.......
00401288push ebp
00401289mov ebp,esp
0040128Badd esp,-104
00401291mov dword ptr ss:,0
0040129Bpush 80
004012A0lea eax,dword ptr ss:
004012A3push eax
004012A4push 3ED
004012A9push dword ptr ds:
004012AFcall <jmp.&user32.GetDlgItemTextA> ; 取用户名
004012B4cmp eax,5 ; 判断用户名位数是否大于5位
004012B7jb CRACKME1.00401384
004012BDpush 80
004012C2lea eax,dword ptr ss:
004012C8push eax
004012C9push 3EE
004012CEpush dword ptr ds:
004012D4call <jmp.&user32.GetDlgItemTextA> ; 取假码
004012D9cmp eax,8 ; 判断假码位数是否为8位
004012DCjnz CRACKME1.00401384
004012E2lea edx,dword ptr ss:
004012E8push edx
004012E9call CRACKME1.00401470
004012EEpush eax
004012EFcall CRACKME1.00401386 ; 经过这个Call以后eax=12345678,我输入的假码,前面就是格式转换了:)
004012F4cmp eax,0
004012F7je CRACKME1.00401384
---------------------------------
004012FDxor edx,edx
004012FFxor eax,52476433 ; 12345678 xor 52476433=4073324B
00401304xor eax,52472456 ; 4073324B xor 52472456=1234161D
00401309sub eax,4000000 ; 1234161D-4000000=0E34161D
---------------------------------
假码的一小段计算,最后结果为0E34161D-------->①
0040130Emov ebx,1
00401313rol ebx,10 ; 经过rol 10后ebx=10000
00401316lea esi,dword ptr ss:
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00401319cmp byte ptr ds:,0
0040131Cje short CRACKME1.0040132B
0040131Emovzx edx,byte ptr ds: ; 中为假码,按位取假码参与运算
00401321rol edx,10
00401324add eax,edx
00401326sub eax,ebx
00401328inc esi
00401329jmp short CRACKME1.00401319
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这1段循环计算看着有点头晕,自己跟一遍其实很简单,以我的为例
假码经过前面1段计算后的值①为0E34161D,我的用户名为"x80x88",用户名各位ASCII码16进制和为1C8,用户名位
数为6位,则这段的计算为0E34161D+(1C8 rol 10)+6*10000=0FF6161D-------->②
0040132Bmov ebx,eax ; EAX=0FF6161D
0040132Dror ebx,10 ; 高低位互换,此时EBX=161D0FF6
00401330cmp bx,0C390 ; 比较上面计算结果的高4位是否为C390,即0FF6与C390比较,第1次验证
00401335jnz short CRACKME1.00401384 ; 可以知道高位必须为固定值C390
00401337mov dword ptr ss:,eax
0040133Dmov ecx,4 ; ECX赋值4,置循环次数
00401342xor edx,edx
00401344xor ebx,ebx
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
00401346cmp ecx,0
00401349je short CRACKME1.00401355
0040134Bmov bl,al
0040134Dadd edx,ebx
0040134Fror eax,8
00401352dec ecx
00401353jmp short CRACKME1.00401346
★★★★★★★★★★★★★★★★★★★★★★★★★★★★
这段循环取前面一个循环的计算结果②为0FF6161D计算,即1D+16+F6+0F=138为EDX中的最后值
00401355cmp edx,285 ; 比较上面循环的计算结果是否为285,此处为138与285进行比较
0040135Bjnz short CRACKME1.00401384 ; 第2处验证
0040135Dlea ebx,dword ptr ss: ; 将我们的计算结果②0FF6161D赋值给EBX
00401363call 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----->我们的真码
00401365cmp edi,0
00401368jnz short CRACKME1.00401384
0040136Apush 1040
0040136Fpush CRACKME1.00402240 ; keygen me - b2c_2k5
00401374push CRACKME1.00402254 ; congrats u did it :)\nnow code me a keygen and write a tut as alway..
00401379push dword ptr ds:
0040137Fcall <jmp.&user32.MessageBoxA> ; 注册成功提示
00401384leave
00401385retn
--------------------------------------------------------------------------------
【经验总结】
没啥经验,感觉写文章好累:)
--------------------------------------------------------------------------------
【版权声明】: 本文原创于x80x88, 转载请注明作者并保持文章的完整, 谢谢!
2009年02月04日 10:41:34
[ 本帖最后由 x80x88 于 2009-2-4 16:01 编辑 ] 写得很好
写文章确实很累
【文章标题】: ZAPLINE (CM--第八天)算法分析
改成ZAPLINE 转载(CM--第八天)算法分析 Z版真是细心认真:lol ,谢谢提醒,已经修改了!Z版的原贴中有大牛放出了注册机源码,大家去学习一下吧!:D
[ 本帖最后由 x80x88 于 2009-2-4 16:07 编辑 ] 欢迎多多发布算法分析教程,加精鼓励! 膜拜下大牛,杀手啊! 膜拜中。。。。嘎嘎。。X80X88兄出关了。。。 写的不错,虽然比较简单,但是很详细。适合入门的 很有深度的教學!
感謝大大的分享. 重新下載被刪除的檔案.不好意思!
页:
[1]