首页
社区
课程
招聘
[原创]一枚KeygenMe详细分析
发表于: 2013-5-15 22:02 11065

[原创]一枚KeygenMe详细分析

2013-5-15 22:02
11065

今天逛看雪论坛,看到有人推荐了一个网站,说里面有很多练手的东西,于是我就进去看了看。http://www.crackmes.de/,在这里感谢下提供网站的那位大牛。既然进去了,也就顺便找了个东西练手。话说好久都没有发表过文章了,于是我详细的分析了一个,在这里发表一下自己的逆向过程,如有不对的地方,希望大家指出来。

这个程序加了一个壳,但是很弱啊。直接用esp定律来到OEP,构建输入表的时候有点问题,我就没有脱了,直接找到关键的汇编代码处,进行分析吧。

0040135B   .  68 95010000   PUSH 195                                 ; /ControlID = 195 (405.)
00401360   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401363   .  E8 16030000   CALL <JMP.&user32.GetDlgItem>            ; \GetDlgItem
00401368   .  A3 90344000   MOV DWORD PTR DS:[403490],EAX
0040136D   .  16            PUSH SS
0040136E   .  81C3 8EA80800 ADD EBX,8A88E
00401374   .  42            INC EDX
00401375   .  83F2 3C       XOR EDX,3C
00401378   .  83E2 00       AND EDX,0
0040137B   .  17            POP SS                                   ;  段寄存器更改
0040137C   .  9C            PUSHFD
0040137D   .  58            POP EAX
0040137E   .  25 00010000   AND EAX,100
00401383   .  0BC0          OR EAX,EAX
00401385   .  F64424 01 01  TEST BYTE PTR SS:[ESP+1],1
0040138A   .  0F85 D8010000 JNZ KeygenMe.00401568
00401390   .  E8 A4020000   CALL KeygenMe.00401639
00401395   .  68 9C344000   PUSH KeygenMe.0040349C                   ;  ASCII "thankyou"
0040139A   .  6A 15         PUSH 15
0040139C   .  6A 0D         PUSH 0D
0040139E   .  FF35 90344000 PUSH DWORD PTR DS:[403490]
004013A4   .  FFD0          CALL EAX
004013A6   .  8BD0          MOV EDX,EAX                              ;  获取字符串长度
004013A8   .  42            INC EDX                                  ;  长度加1
004013A9   .  C1E2 03       SHL EDX,3                                ;  向左移3位,相当于乘上8,结果记为a
004013AC   .  BE 80000000   MOV ESI,80
004013B1   .  8D3C32        LEA EDI,DWORD PTR DS:[EDX+ESI]           ;  a加上常数0x80,记为b
004013B4   .  69D7 E6010000 IMUL EDX,EDI,1E6                         ;  b乘上0x1E6,结果记为c
004013BA   .  83E6 00       AND ESI,0
004013BD   .  87F2          XCHG EDX,ESI                             ;  将c的值放入esi
004013BF   .  33D2          XOR EDX,EDX
004013C1   .  81FE 505D0100 CMP ESI,15D50                            ;  判断esi的值是否大于0x15d50,大于则跳走
根据这一段可以逆推出字符串的最小长度,即:((0x15d50/0x1e6)-0x80)/8-1=6
004013C7   .  73 05         JNB SHORT KeygenMe.004013CE
004013C9   .  E9 9A010000   JMP KeygenMe.00401568
004013CE   >  83F8 0C       CMP EAX,0C                               ;  字条串长度不能大于12个字符
004013D1   .  0F87 91010000 JA KeygenMe.00401568
004013D7   .  68 CC344000   PUSH KeygenMe.004034CC
004013DC   .  68 9C344000   PUSH KeygenMe.0040349C                   ;  ASCII "thankyou"
004013E1      E8 2A030000   CALL KeygenMe.00401710                   ;  复制字符串到其它空间
004013E6   .  68 9C344000   PUSH KeygenMe.0040349C                   ;  ASCII "thankyou"
004013EB   .  E8 60FDFFFF   CALL KeygenMe.00401150
004013F0   .  50            PUSH EAX
004013F1   .  B8 9C344000   MOV EAX,KeygenMe.0040349C                ;  ASCII "thankyou"
004013F6   .  EB 06         JMP SHORT KeygenMe.004013FE
004013F8   >  8030 4E       XOR BYTE PTR DS:[EAX],4E                 ;  对每个字符进变换
004013FB   .  D020          SHL BYTE PTR DS:[EAX],1
004013FD   .  40            INC EAX
004013FE   >  8038 00       CMP BYTE PTR DS:[EAX],0
00401401   .^ 75 F5         JNZ SHORT KeygenMe.004013F8
00401403   .  5F            POP EDI
00401404   .  57            PUSH EDI
00401405   .  68 9C344000   PUSH KeygenMe.0040349C                   ;  ASCII "tL^@JnBv"
0040140A   .  E8 D8FDFFFF   CALL KeygenMe.004011E7                   ;  关键CALL
0040140F   .  8BD8          MOV EBX,EAX
00401411   .  53            PUSH EBX
00401412   .  EB 3B         JMP SHORT KeygenMe.0040144F

004011E7  /$  55            PUSH EBP
004011E8  |.  8BEC          MOV EBP,ESP
004011EA  |.  53            PUSH EBX
004011EB  |.  56            PUSH ESI
004011EC  |.  33C0          XOR EAX,EAX
004011EE  |.  40            INC EAX
004011EF  |.  33DB          XOR EBX,EBX
004011F1  |.  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]
004011F4  |>  837D 0C 00    /CMP DWORD PTR SS:[EBP+C],0
004011F8  |.  74 3B         |JE SHORT KeygenMe.00401235              ;  判断长度是否满足要求
004011FA  |.  817D 0C B0150>|CMP DWORD PTR SS:[EBP+C],15B0
00401201  |.  77 05         |JA SHORT KeygenMe.00401208
00401203  |.  8B55 0C       |MOV EDX,DWORD PTR SS:[EBP+C]
00401206  |.  EB 05         |JMP SHORT KeygenMe.0040120D
00401208  |>  BA B0150000   |MOV EDX,15B0
0040120D  |>  2955 0C       |SUB DWORD PTR SS:[EBP+C],EDX
00401210  |>  85D2          |/TEST EDX,EDX
00401212  |.  74 0C         ||JE SHORT KeygenMe.00401220
00401214  |.  4A            ||DEC EDX                                ;  长度减1
00401215  |.  33C9          ||XOR ECX,ECX                            ;  ecx清0
00401217  |.  8A0E          ||MOV CL,BYTE PTR DS:[ESI]               ;  依次取各个字符
00401219  |.  03C1          ||ADD EAX,ECX                            ;  得到的值加上eax
0040121B  |.  46            ||INC ESI
0040121C  |.  03D8          ||ADD EBX,EAX                            ;  将结果存入ebx中
0040121E  |.^ EB F0         |\JMP SHORT KeygenMe.00401210
00401220  |>  B9 F1FF0000   |MOV ECX,0FFF1                           ;  做除法
00401225  |.  33D2          |XOR EDX,EDX                             ;  将edx清0,便于保存结果
00401227  |.  F7F1          |DIV ECX                                 ;  进行除法
00401229  |.  52            |PUSH EDX
0040122A  |.  8BC3          |MOV EAX,EBX                             ;  将ebx赋值给eax,进行下一轮除法
0040122C  |.  33D2          |XOR EDX,EDX
0040122E  |.  F7F1          |DIV ECX                                 ;  进行除法
00401230  |.  8BDA          |MOV EBX,EDX                             ;  将结果放入ebx
00401232  |.  58            |POP EAX
00401233  |.^ EB BF         \JMP SHORT KeygenMe.004011F4
00401235  |>  C1E3 10       SHL EBX,10                               ;  将ebx左移16位
00401238  |.  0BC3          OR EAX,EBX                               ;  将eax接在ebx的后16位,形成一个32位的数
0040123A  |.  5E            POP ESI
0040123B  |.  5B            POP EBX
0040123C  |.  C9            LEAVE
0040123D  \.  C2 0800       RETN 8


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

上传的附件:
收藏
免费 5
支持
分享
最新回复 (13)
雪    币: 108
活跃值: (44)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
顶一个
2013-5-15 23:07
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
菜鸟表示很有压力啊...
2013-5-15 23:55
0
雪    币: 437
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
顶一下,谢谢分享
2013-5-16 08:32
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
5
感谢大牛围观,有机会一起交流。。
2013-5-16 08:53
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
6
呵呵,慢慢学,有不懂的地方我们可以一起讨论。
2013-5-16 08:54
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你说的这个网站真不知道,现在知道了
2013-5-16 14:01
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯,还需要不断学习啊
2013-5-16 16:10
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
其实一般都不会怎么看破文的,看了就没意思了
2013-5-16 16:57
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
噢噢 又是哪个Greedy Fly做的啊,我上次好像也做过它的
2013-5-16 17:07
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
11
呵呵,我一般先自己做,做了再看看别人的分析,对比一下就有可能有进步 了。。
2013-5-16 22:08
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了!最近有技术含量的原创帖不多,支持楼主一下
2013-5-16 22:51
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
想问一下前面这一大串是想做什么用的?
0040136D   .  16            PUSH SS
0040136E   .  81C3 8EA80800 ADD EBX,8A88E
00401374   .  42            INC EDX
00401375   .  83F2 3C       XOR EDX,3C
00401378   .  83E2 00       AND EDX,0
0040137B   .  17            POP SS                                   ;  段寄存器更改
0040137C   .  9C            PUSHFD
0040137D   .  58            POP EAX
0040137E   .  25 00010000   AND EAX,100
00401383   .  0BC0          OR EAX,EAX
00401385   .  F64424 01 01  TEST BYTE PTR SS:[ESP+1],1
2013-5-17 23:18
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
14
这段代码我没去深究,因为与算法无关,我以为是花指令,懒得去看。如果有大牛知道还请指教一下。
2013-5-21 14:11
0
游客
登录 | 注册 方可回帖
返回
//