首页
社区
课程
招聘
[原创]OD跟crackme算法(带链接、带讲思路)
发表于: 2013-12-27 19:49 4511

[原创]OD跟crackme算法(带链接、带讲思路)

2013-12-27 19:49
4511
标 题: 【原创】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),并对老婆说声抱歉,耽误和你一起吃晚饭了。并对“书呆彭”说声感谢。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我想付费请高手逆向出一个为加壳的小软件的算法
2013-12-27 20:55
0
雪    币: 2
活跃值: (155)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了。
2013-12-28 12:09
0
雪    币: 611
活跃值: (778)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
作为菜鸟 要学的太多了 掩面
2013-12-28 12:56
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
突然看到 http://bbs.pediy.com/showthread.php?t=77367   “书呆彭”分析过了。后面还给出了算法重现。很不错。
2013-12-28 13:41
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
方法讲得还比较详细,不过这个复杂度不高,希望有更加高复杂度的例子来做实验
2013-12-28 17:30
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
新人报道,希望大家多多帮助谢谢
2013-12-30 11:58
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我来学习下。
2013-12-30 13:57
0
雪    币: 2741
活跃值: (2176)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
写得不错,,,
2015-4-28 23:15
0
游客
登录 | 注册 方可回帖
返回
//