发表于 2014-4-17 23:59

申请ID:四步-像【申请通过】

1、申 请 I D:四步-像
2、个人邮箱:jie02751@163.com

最近学习逆向分析了一段时间,感觉需要加入论坛和大家交流了,之前觉得吾爱论坛不错,就想加入这个逆向大家庭.废话不多说,献上我的入门文章.
软件:nullz.exe(以前的一个crakeme软件)

拿到程序,首先使用peid查壳软件,发现没有壳,是Vc++的程序                              
                                                            接下来od打开程序,F9运行,来到程序的开始界面
                                                             发现username和company栏都不能输入,只有reg key可以输入,这个是需要输入注册码的地方。

点击输入注册码,然后点击ValidateRegistration key 按钮,出现下面注册信息提示:


此时在od中F12暂停程序,在查看选项中点击调用堆栈,准备使用堆栈回溯,出现以下界面:
这个时候的堆栈中应该是调用这个提示信息框的相关call的地址,包括主程序和系统函数的call。这个时候我们当然是跟随主程序的流程选择主程序的调用地址,因为我们只可以修改主程序,不可以修改系统函数的。

右键点击最后一行调用调用堆栈:   

点击显示调用,回到主程序领空

我们知道,在程序调用call时,堆栈中记录的是下一行代码的地址,我们观察右键点击的堆栈调用,堆栈记录的地址是00401A5E,我们在显示调用后回到程序领空,来到的就应该是00401A5E上面的一个地址,这里是00401A59,是一个call,显然他就是我们要找的推出错误信息的提示框。
一般在这个错误信息框上方会有个跳转,因为没有这个跳转,程序的正常执行就需要执行这个错误信息框,这是填入正确注册码后不允许出现的,我们向上看。

果然发现在这个call上面有个跳转接入执行了这个信息框,说明是错误的注册信息判断后导致跳转到这里执行这个错误的信息。
在往上看,在这个跳转接入前发现一个retn,判断这是个子call,用来判断注册码是否正确,如果正确,这个call在地址00401A4AC3 retn处结束,如果注册码错误,就执行错误信息框后在00401AF6 C3 RETN处结束。
我们直接向上来到判断跳转处,0040191f,修改这个跳转应该就可以达到注册的目的,选用最简单的办法:修改跳转地址,让他跳转后执行下一行代码,不过这只是我们的判断,需要验证一下。我们在跳转上一行下个断,F2.
重新运行程序。输入错误注册码,点击注册按钮,程序停在我们下的断处:

此时,F8一步就到达我们判断的注册码争取与否的跳转位置,上面我们判断这个跳转后的地址是错误信息的提示框,那如果不跳转,是不是应该是有注册成功的信息提示框呢?也就是说跳转下面的代码应该是注册码正确后的代码,我们来验证一下。
此时代码处是jnz,与其相关的标志位是zf,这时的值为0,我们把值置为1.跳转不成立,改为执行跳转一下 代码。



F8单步执行,当执行到00401A23时,出现一个提示信息框,是正确的注册信息提示框。说明我们的判断正确。

好。我们来修改关键跳,来达到我们可以随意注册的目的。
来到地址004019EF   . /75 5A         jnz short nullz.00401A4B,
我们只要修改这个跳转的地址,让它跳转后执行下一句代码,也就是正确的代码就达到我们随意注册码都可以注册的目的,右键--汇编,代码修改为004019EF   . /75 5A         jnz short nullz.004019ef。接下来右键—复制到可执行文件---全部复制—保存,收工完成。

程序运行界面:
突然发现,这个程序为好几个阶段,继续破解它的后几个阶段。
查看这个Crakeme的后几个阶段,是限制程序输入框的输入,但应该是还可以应用这个修改跳转来实现爆破注册。那我们就不费力气了,直接破解它的按钮失效,让它的这几个阶段都可以直接注册,空字符也可以注册。
Od载入程序,使用查找按钮的方法来破解。
按钮失效应该是使用EnableWindow或者EnableWindowItem方法

在命令窗口输入 bpEnableWindow 命令,下断然后ctrl+F12,重新运行程序。
程序运行到断点处停下运行。先前观察到有多个输入栏不能使用,估计需要多次调用这个断。
F8单步回到程序领空,发现调用来自这个call:00401762|.E853140000   call<jmp.&MFC42.#2642>


观察这个call在这一断有多个调用,此时程序运行到的地址是00401767,程序处于初始化的部分,观察这段代码,是以这一段代码为节点重复执行的
004017EC |.6A 00         push 0x1
004017EE |.68 EB030000   push 0x3EB
004017F3 |.8BCE          mov ecx,esi
004017F5 |.E8 C6130000   call <jmp.&MFC42.#3092>
004017FA |.8BC8          mov ecx,eax
004017FC |.E8 B9130000   call <jmp.&MFC42.#2642>
发现其中有一个跳转:


是跳过两段我们的api断点。
而且它跳过的代码与我判断的节点代码有点差别:
004017EC |.6A 00         push 0x0
004017EE |.68 EB030000   push 0x3EB
004017F3 |.8BCE          mov ecx,esi
004017F5 |.E8 C6130000   call <jmp.&MFC42.#3092>
004017FA |.8BC8          mov ecx,eax
004017FC |.E8 B9130000   call <jmp.&MFC42.#2642>
我们需要测试下这点区别有何不同,让这个jnz跳转执行,跳过两段代码。将zf标志位置1.
程序运转起来,初始界面有所不同,
原来那个代码是将username输入屏蔽输入了,也就是说push 0x0的作用是屏蔽输入,而push 0x1的作用是可以输入。那我们只要经这个阶段所有的0改为I不就可以了。
Ok,修该后保存后载打开,界面如下:

无论在哪个阶段,这几个输入框都可以输入,没有屏蔽了。
爆破注册部分和上面的爆破方法一样,这里就赘述了。



Hmily 发表于 2014-4-18 10:30

ID:四步-像
邮箱:jie02751@163.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

四步-像 发表于 2014-4-18 12:05

四步-像来报道!
Hmily大大,很感谢,我会努力学习为论坛做出贡献!!

小淫神 发表于 2014-4-19 15:44

楼主解说了那么久,不懂都不好意思了.....
页: [1]
查看完整版本: 申请ID:四步-像【申请通过】