首页
社区
课程
招聘
[原创]新手论坛中的的一个CrackMe_0008的分析
发表于: 2014-1-23 16:16 12902

[原创]新手论坛中的的一个CrackMe_0008的分析

2014-1-23 16:16
12902

这篇拙文是我对happytown编写的CrackMe_0008的一些分析,废话不多直接进入正题。
  Peid载入后显示的是Nothing found 区段显示的是upx0,upx1,upx2,有可能被加壳了。
  Od载入后发现入口点一点不像upx的开头,估计被作者修改了开头。
  用peid的深度扫描发现是delphi写的,心里窃喜,请出dede神器。找到btnCheckClick事件,od Ctrl+G来到00455338处,下断。F9运行程序,随意输入帐号,密码也随意。然后就是单步分析。

首先密码有个判断是否是12位
004553D3  |.  BA 0C000000   mov edx,0xC
004553D8  |.  8B45 F4       mov eax,[local.3]
004553DB  |.  E8 54FBFFFF   call CrackMe_.00454F34  ; 进入,应该是判断密码是否12位
004553E0  |.  803B 00       cmp byte ptr ds:[ebx],0x0
004553E3      0F84 73050000 je CrackMe_.0045595C

这里是真正密码的计算并且与输入的密码判断
004553EC  |.  50            push eax
004553ED  |.  B9 06000000   mov ecx,0x6
004553F2  |.  BA 01000000   mov edx,0x1
004553F7  |.  8B06          mov eax,dword ptr ds:[esi]         读出作者事先定义的const类型字符串的首地址
004553F9  |.  E8 76EFFAFF   call CrackMe_.00404374        取出字符串中的第n个,n为需要判断的密码字符第n个
004553FE  |.  8B45 F8       mov eax,[local.2]                把字符的首地址给EAX
00455401  |.  E8 AEF8FFFF   call CrackMe_.00454CB4        计算字符的ASCII码累加结果放入EAX中,设为key1
00455406  |.  50            push eax
00455407  |.  8B45 FC       mov eax,[local.1]
0045540A  |.  E8 A5F8FFFF   call CrackMe_.00454CB4        计算帐号字符的ASCII码累加,设为key2
0045540F  |.  5A            pop edx
00455410  |.  E8 47FAFFFF   call CrackMe_.00454E5C        之前计算的key1和key2做xor运算,结果为key3
00455415  |.  BA 0A000000   mov edx,0xA
0045541A  |.  E8 45FAFFFF   call CrackMe_.00454E64        key3除以0xA,余数为k
0045541F  |.  8D55 F0       lea edx,[local.4]
00455422  |.  E8 F928FBFF   call CrackMe_.00407D20        k=k+0x30                   ;  
00455427  |.  8D45 EC       lea eax,[local.5]
0045542A  |.  50            push eax
0045542B  |.  B9 01000000   mov ecx,0x1
00455430  |.  BA 01000000   mov edx,0x1
00455435  |.  8B45 F4       mov eax,[local.3]
00455438  |.  E8 37EFFAFF   call CrackMe_.00404374        取出密码的第n位字符的ascii码值
0045543D  |.  8B55 F0       mov edx,[local.4]
00455440  |.  8B45 EC       mov eax,[local.5]
00455443  |.  E8 4CFBFFFF   call CrackMe_.00454F94        判断k与密码第n位字符的ascii码值是否相同,否则悲剧。
00455448  |.  803B 00       cmp byte ptr ds:[ebx],0x0
0045544B      0F84 0B050000 je CrackMe_.0045595C               

后面的11次判断与上述类似,只是每次取的字符串都不相同,字符串如下
解释下,字符串就是第一次取ORACLE,第二次取BenQ。
"ORACLE-BenQ-HP-IBM-SIEMENS-CISCO SYSTEMS-intel-Sun-DELL-SYBASE-Maxtor-lenovo"

如果上面分析没看懂,可以看下面我对这个算法的总结(我知道我写得比较乱)
设const为所取字符,num为帐号,consult为结果
计算const的每个字符ascii码累加=x
计算num的每个字符ascii码累加=y
Xor x,y
x=x%0xA
x=x+0x30
x就是密码的第n位的ascii码

当然,判断还未结束
当判断完12位密码后,来到第13个判断
004558C9  |.  E8 DAF3FFFF   call CrackMe_.00454CA8        F7进入
004558CE  |.  3D FE010000   cmp eax,0x1FE
004558D3      0F85 83000000 jnz CrackMe_.0045595C

发现F7进入的函数只是取了一个值(0x1BA),于是在这个地址上下硬件写入断点,Ctrl+F2,F9多次运行,找到
00439BB8  |.  6A 14         push    14                                                        /Flags= SWP_NOZORDER|SWP_NOACTIVATE
00439BBA  |.  8B45 08       mov     eax, dword ptr [ebp+8]              |
00439BBD  |.  50            push    eax                                 Height
00439BBE  |.  8B45 0C       mov     eax, dword ptr [ebp+C]           ; |
00439BC1  |.  50            push    eax                              Width
00439BC2  |.  57            push    edi                                    Y
00439BC3  |.  56            push    esi                                       X = 1A3 (419.)
00439BC4  |.  6A 00         push    0                                           InsertAfter = HWND_TOP
00439BC6  |.  8B83 80010000 mov     eax, dword ptr [ebx+180]         ; |
00439BCC  |.  50            push    eax                               hWnd
00439BCD  |.  E8 4ECBFCFF   call    <jmp.&user32.SetWindowPos>       ; \SetWindowPos

Push  edi 也就是窗口的y坐标是0x1BA,所以,以此可以发现窗口坐标是否为0x1FE既是最后一个判断

这也就是本人所未能解决的问题,如何才能改变窗口y坐标到0x1FE,手动感觉有点难度虽然能不是不行,我想的是编程实现。我使用的是C语言,但是使用MoveWindow,SetWindowPos貌似都不行,如果有大神解决请一定告诉我,万分感谢。

以上就是小弟的分析,有不对的地方,请指出,谢谢


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 11
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
加油,你是最棒的!
2014-1-23 18:39
0
雪    币: 438
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞!一!个!
2014-1-23 23:47
0
雪    币: 6510
活跃值: (4389)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
带上附件啊....
2014-1-24 00:58
0
雪    币: 15
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
因为算法的最后还要判断窗口的y坐标是否为0x1FE,而我没有想到如何在keygen中改变它的位置,所以就算密码算对了也无法成功破解这个CrackMe。
软件链接在http://bbs.pediy.com/showthread.php?s=&threadid=19370
2014-1-25 14:02
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
6
楼主好人
2014-1-26 13:01
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看的不太懂
2014-2-2 06:40
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最后这个判断是怎么找到和窗口的Y坐标有关的?
2014-2-8 21:13
0
雪    币: 111
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
poppig 已经说了那个是窗口的长度,不是位置
2014-2-11 14:10
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我只想知道  是怎么分析出和窗口长度有关系的
2014-2-13 10:10
0
雪    币: 15
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
恩,我重新看了下,的确是窗口长度,谢谢指出
2014-2-17 16:38
0
雪    币: 15
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
在对key的判断完成后还有一个判断
004558C9  |.  E8 DAF3FFFF   call CrackMe_.00454CA8  F7进入
004558CE  |.  3D FE010000   cmp eax,0x1FE
004558D3      0F85 83000000 jnz CrackMe_.0045595C
其中
call CrackMe_.00454CA8 进入会发现从内存地址中取一个值放入EAX,后面就会比较。
然后我在这个地址下硬件写入断点,然后Ctrl+F2重载。(不过由于OD不同有些OD无法断下,我估计有可能是作者在写程序的时候是利用new一类的命令分配的内存,我换了2个OD才断下)
之后发现在程序调用函数MoveWindow这个函数后把它的一个参数存入上面的内存地址中,
MoveWindow中的参数就是窗口的x坐标,y坐标,窗口长度,窗口高度。
希望能看懂,小弟语言表达感觉略菜
2014-2-17 16:45
0
雪    币: 9
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
刚发完反应过来了。。 正在研究,支持了
2014-2-17 17:34
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
没有找到 MoveWindow函数
只知道
00439BDD  |.  8943 48       mov     dword ptr [ebx+48], eax     ;放入了最终要比较的值
上面这行是由
00433177  |.  FF93 84000000 call    dword ptr [ebx+84]    调用的
2014-2-18 12:04
0
雪    币: 15
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=Tartar;1261932]没有找到 MoveWindow函数
只知道
00439BDD  |.  8943 48       mov     dword ptr [ebx+48], eax     ;放入了最终要比较的值
上面这行是由
00433177  |.  FF93 84000000 call    dword...[/QUOTE]

不是MoveWindow的话就是SetWindowPos这个函数。。。具体哪个有点忘了
2014-2-20 12:55
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢!我明白了
2014-2-27 11:45
0
游客
登录 | 注册 方可回帖
返回