首页
社区
课程
招聘
[旧帖] [原创]我做出的第一个crackme 0.00雪花
发表于: 2009-4-4 13:31 2199
申请推荐此帖 编辑 删除

[旧帖] [原创]我做出的第一个crackme 0.00雪花

2009-4-4 13:31
2199
大家好,我是第一次写破解文章,有什么不足之处欢迎大家指出来,我实验用的crackme不能添加在附件中,只有先写一下我的分析了
.先用PEID查一下壳,很幸运,这是一个无壳的程序.
运行程序,随便输入用户名和注册码,查看错误提示,发现提示为 "fail"
第二步,用OD载入,查找所有字符串
文本字串参考位于 Crack_Me:.text
地址       反汇编                                    文本字串
004015C1   push    00403038                          ASCII "User Name is empty!"
0040160C   push    00403028                          ASCII "Great! pf! pf!"
0040161A   push    00403020                          ASCII "fail!"
004016A7   push    00403050                          ASCII "C:\"
00401899   push    0040304C                          ASCII "%s"
00401B7C   push    ebp                                  (初始 CPU 选择)
00401CF1   push    10000                              UNICODE "=::=::\"
此时鼠标双击ASCII "fail!",窗口自动跳至下面,这是我们分析的重点地方
004015F5     50            push    eax                              ; s2
004015F6     8B4424 08     mov     eax, dword ptr [esp+8]           ;
004015FA     50            push    eax                              ; s1
004015FB     FF15 C8214000 call    dword ptr [<&MSVCRT._mbscmp>]    ; 此处调用比较函数///此处按F2下断
00401601     83C4 08       add     esp, 8
00401604     85C0          test    eax, eax
00401606     6A 00         push    0
00401608     6A 00         push    0
0040160A     75 0E         jnz     short 0040161A
0040160C     68 28304000   push    00403028                         ;  ASCII "Great! pf! pf!"
00401611     8BCE          mov     ecx, esi
00401613     E8 FC040000   call    <jmp.&MFC42.#4224>
00401618     EB 15         jmp     short 0040162F
0040161A     68 20304000   push    00403020                         ;  ASCII "fail!"
0040161F     8BCE          mov     ecx, esi
00401621     E8 EE040000   call    <jmp.&MFC42.#4224>
00401626     6A 00         push    0
从此可以看出程序调用的字符串比较函数,我们在调用字符串比较函数的时候设置了断点,因此程序运行到此会停止,这时就可以查看s1和s2的内容了,我们把程序运行一下,用户名为xiao,密码为111,按确定后,程序自动停止在断点处,查看右下角的窗口:

0012F898   004015EA  Crack_Me.004015EA
0012F89C   00383CA0  s1 = "TU6oOdQNgZDguq03c19C"
0012F8A0   00383C50  s2 = "111"
0012F8A4   73DDB064  offset MFC42.#4234
0012F8A8   00383CA0  ASCII "TU6oOdQNgZDguq03c19C"
0012F8AC   0012F9DC  指向下一个 SEH 记录的指针
0012F8B0   00401E38  SE处理程序
从这里可以看出,s1是正确的密码,s2是我们输入的密码,好了,我们应该破解成功了,试一下吧!嗯!用户名xiao,密码TU6oOdQNgZDguq03c19C,点击确定,"Great!pf!pf!"我们成功了.

再次用OD载入程序,这回把用户名改为简单一点的,还是和上面一样下断点,找出新的s1
多做几组实验:
用户名为1时,密码为FN6BgCXWWYEFSxK3c19C
用户名为2时,密码为23gMrdMZcxDn7z03c19C
用户名为3时,密码为YeFY9EioHwDguq03c19C
用户名为4时,密码为IJQdDnPV4fuvvX03c19C

我们再换个思路中找算法,重新用OD载入,开始运行,在用户名文本框里输入1,密码输入123,点击确定,这时会跳出"fail"提示,先不要点确定,而是要按下F12暂停程序运行,再点击K键,查看调用堆栈,以下是调用堆栈表
地址       堆栈       函数过程                              调用来自                      结构
0012F344   77D19418   包含ntdll.KiFastSystemCallRet         USER32.77D19416               0012F378
0012F348   77D2770A   USER32.WaitMessage                    USER32.77D27705               0012F378
0012F37C   77D249C4   USER32.77D2757B                       USER32.77D249BF               0012F378
0012F3A4   77D3A956   USER32.77D2490E                       USER32.77D3A951               0012F3A0
0012F664   77D3A2BC   USER32.SoftModalMessageBox            USER32.77D3A2B7               0012F660
0012F7B4   77D663FD   USER32.77D3A147                       USER32.77D663F8               0012F7B0
0012F80C   77D664A2   USER32.MessageBoxTimeoutW             USER32.77D6649D               0012F808
0012F840   77D50877   ? USER32.MessageBoxTimeoutA           USER32.77D50872               0012F83C
0012F860   77D5082F   ? USER32.MessageBoxExA                USER32.77D5082A               0012F85C
0012F87C   73D8DE23   ? USER32.MessageBoxA                  MFC42.73D8DE1D                0012F878
0012F894   00401626   ? <jmp.&MFC42.#4224>                  Crack_Me.00401621
我们在最后一个调用处设置断点,再重新运行一次程序,又有新发现了,在右下角的窗口里出现下面内容
0012F8A4   73DDB064  offset MFC42.#4234
0012F8A8   00383CA0  ASCII "FN6BgCXWWYEFSxK3c19C"----------这个就是注册码!
0012F8AC   0012F9DC  指向下一个 SEH 记录的指针
我们在注册码那一行单击右键,选择"数据窗口跟随",这样便转到右面的数据窗口,找到下面内容
00383CA0  46 4E 36 42 67 43 58 57 57 59 45 46 53 78 4B 33  
00383CB0  63 31 39 43   
对应的内容是:                                   
FN6BgCXWWYEFSxK3
c19C
再次可以找到注册码.
虽然我可以找出注册码,但是还不能找出程序的加密算法,我想拿到论坛跟大家一起讨论一下,让大家帮我分析一下.另外我也想成为看雪学院的注册会员,呵呵,希望老大能够接受我哦.我的邮箱是
oasis15@sina.com

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 5198
活跃值: (1138)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
2
验证通过,邀请码己发
2009-4-4 16:21
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习,开始自己的第一个crackme
2011-11-29 23:10
0
游客
登录 | 注册 方可回帖
返回
//