大家好,我是第一次写破解文章,有什么不足之处欢迎大家指出来,我实验用的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
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法