标 题: 【原创】OD跟crackme算法(带链接、带讲思路)
作 者: beancurd
时 间: 18:50 2013-12-27
工具: OD,calc
【作者声明】: 本文完全是个人的心得与体会,其中错误和不当之处,欢迎大家多多批评指正。
今天看KSSD,看到“书呆彭”的教程:“我的断点心得帮初学者进阶”http://www.pediy.com/kssd/index.html,看了看他的
讲解,其中我看 例1时,“书呆彭”只讲到了怎么下断,怎么跑到关键代码。但后面的算法分析没有继续。我以前没跟过算法
,猜测“书呆彭”的示例程序算法应该不会太难。所以尝试跟踪一下,新手可以也来看看(此crackme地址
http://www.pediy.com/kssd/pediy10/79148/553755/chap6-1-1-01.zip)。
好,接上面“书呆彭”运行程序后,bp GetDlgItemTextA 下断。可以看到:
断点, 条目 1
地址=00401182
模块=crackme
激活=始终
反汇编=JMP DWORD PTR DS:[<&USER32.GetDlgItemTextA>]
然后F9运行,输入8个F(在代码中可以看到是8个,不然它会自动补齐2)点击Check按钮。跑到crackme领空,F8跟进,跑到USER32领空,ALT+m在.text下断。返回反汇编窗口F9,然后返回crackme控件,到达关键CALL关键代码区。
004010B0 |. E8 14000000 CALL crackme.004010C9 ; 关键CALL
“书呆彭”讲的不错。F7单步跟进。
004010C9 /$ 56 PUSH ESI
004010CA |. 57 PUSH EDI
004010CB |. 51 PUSH ECX
004010CC |. 33F6 XOR ESI,ESI
004010CE |. 33FF XOR EDI,EDI
004010D0 |. B9 08000000 MOV ECX,8 ; 第一段程序:8个字符12345678
004010D5 |. BE 44304000 MOV ESI,crackme.00403044 ; ;此处开始取字符对输入的注册码进行计算。
004010DA |> 8036 32 /XOR BYTE PTR DS:[ESI],32 ; XOR 32
004010DD |. 46 |INC ESI ; SI加1
004010DE |.^ E2 FA \LOOPD SHORT crackme.004010DA ; 循环8位变换后变为变量 1A 2A 3A 4A 5A 6A 7A 8A
004010E0 |. BE 44304000 MOV ESI,crackme.00403044 ; 第二段程序:读取变换完的8个字符
004010E5 |. B9 04000000 MOV ECX,4 ; 四个字
004010EA |> 8A06 /MOV AL,BYTE PTR DS:[ESI] ; AL低位
004010EC |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1] ; BL高位
004010EF |. 32C3 |XOR AL,BL ; 异或高低位
004010F1 |. 8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL ; 异或结果存放40304C
004010F7 |. 83C6 02 |ADD ESI,2
004010FA |. 47 |INC EDI
004010FB |.^ E2 ED \LOOPD SHORT crackme.004010EA ; 循环变换后存放40304C开始4字节,变量A B C D
004010FD |. BE 4C304000 MOV ESI,crackme.0040304C ; 第三段程序:A B C D 异或
00401102 |. 8A06 MOV AL,BYTE PTR DS:[ESI]
00401104 |. 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
00401107 |. 32C3 XOR AL,BL ; 读取A B 并异或成变量E
00401109 |. 8A5E 02 MOV BL,BYTE PTR DS:[ESI+2]
0040110C |. 8A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040110F |. 32D9 XOR BL,CL ; 读取C D 并异或成变量F
00401111 |. 32C3 XOR AL,BL ; 异或E F 成变量G
00401113 |. B9 08000000 MOV ECX,8 ; 第四段程序:
00401118 |. BE 44304000 MOV ESI,crackme.00403044 ; 读取1A 2A 3A 4A 5A 6A 7A 8A
0040111D |> 3006 /XOR BYTE PTR DS:[ESI],AL ; 与G异或
0040111F |. 46 |INC ESI
00401120 |.^ E2 FB \LOOPD SHORT crackme.0040111D ; 所有1A 2A 3A 4A 5A 6A 7A 8A 与G异或后存原处
00401122 |. B9 08000000 MOV ECX,8
00401127 |. BE 44304000 MOV ESI,crackme.00403044 ; ASCII "FFFFFFFF"
0040112C |. BF 08304000 MOV EDI,crackme.00403008
00401131 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] ; 开始逐字符判断注册码是否正确
00401133 |. 3A07 |CMP AL,BYTE PTR DS:[EDI] ; 此处BYTE PTR DS:[EDI]就是非明码的注册码。跟算法就是要从此暗码倒推开始。
00401135 |. 75 1D |JNZ SHORT crackme.00401154
00401137 |. 46 |INC ESI
00401138 |. 47 |INC EDI
00401139 |.^ E2 F6 \LOOPD SHORT crackme.00401131
0040113B |. 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040113D |. 68 35304000 PUSH crackme.00403035 ; |crackme 1.0
00401142 |. 68 10304000 PUSH crackme.00403010 ; |good work cracker
00401147 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = 00820068 ('Pusillus Crackme 1.0',class='#32770')
0040114D |. E8 3C000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401152 |. EB 17 JMP SHORT crackme.0040116B
00401154 |> 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401156 |. 68 35304000 PUSH crackme.00403035 ; |crackme 1.0
0040115B |. 68 22304000 PUSH crackme.00403022 ; |bad serial, sorry!
00401160 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = 00820068 ('Pusillus Crackme 1.0',class='#32770')
00401166 |. E8 23000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
恩,我UDD注释很清楚了,总结下算法:
假设输入8个字符变量 X Y Z H I J K L
源程序正向流程:
第一段程序后: 32X 32Y 32Z 32H 32I 32J 32K 32L (XOR 计算符号省略)
第二段程序后:32X 32Y 32Z 32H 32I 32J 32K 32L A B C D
其中A=32X32Y ;B=32Z32H; C=32I32J ; D=32K32L;
第三段程序后:A XOR B= E ; C XOR D =F; G=E XOR F;
其中 E= A XOR B =32X32Y32Z32H;F=C XOR D=32I32J32K32L; G=E XOR F=32X32Y32Z32H32I32J32K32L;
第四段程序后:
32X XOR G=71;
32Y XOR G=18;
32Z XOR G=59;
32H XOR G=1B;
32I XOR G=79;
32J XOR G=42;
32K XOR G=45;
32L XOR G=4C;
即:
32X 32X32Y32Z32H32I32J32K32L=71;
32Y 32X32Y32Z32H32I32J32K32L=18;
32Z 32X32Y32Z32H32I32J32K32L=59;
32H 32X32Y32Z32H32I32J32K32L=1B;
32I 32X32Y32Z32H32I32J32K32L=79;
32J 32X32Y32Z32H32I32J32K32L=42;
32K 32X32Y32Z32H32I32J32K32L=45;
32L 32X32Y32Z32H32I32J32K32L=4C;
后续就是关于XOR的8元一次方程:
32YZHIJKL=71;
32XZHIJKL=18;
32XYHIJKL=59;
32XYZIJKL=1B;
32XYZHJKL=79;
32XYZHIKL=42;
32XYZHIJL=45;
32XYZHIJK=4C;
计算后得到X=5A;Y=33;Z=72;H=30;I=52;J=69;K=6E;L=67;
变换成ASCII码后为:Z3r0Ring 。
19:50 2013-12-27 记录一下(dazi),并对老婆说声抱歉,耽误和你一起吃晚饭了。并对“书呆彭”说声感谢。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!