在很久很久以前,有几个加密过的小程序
然后,他们被我破解了….
之前我已经破解了第一个加密程序了,现在我们来破解第二个
“01”打开之后是这样
好像有一种开保险柜的既视感…
运行程序后我们发现每次点击这三个按钮,按钮上的数字就会相应的加1
根据程序运行的结果来看,我们猜测应该的确是要输入正确的密码,才可以点亮下面的确定按钮
那我们就来看代码
找了一圈没有找到我们熟悉的main函数…额….对啊!这是MFC程序找个球的main函数。
所以,MFC程序怎么搞呢?我们可以进去winmain函数中去找自己需要的那段代码,只不过这样比较麻烦,有太多的编译器生成的代码。比较简单的方法就是找特征。
什么是找特征呢?特征就是一个函数特有的一串opcode码,好的特征可以直接帮我们定位到想要找的那段代码。
那么怎么提取特征呢?这样就需要用到工具去查看这个程序使用的是什么连接器啦,
编译器 连接器
VC2003 7.0, 7.1
VS2005 8.0
VS2008 9.0
VS2010 10.0
VS2012 11.0
VS2013 12.0
VS2015 14.0
VS2017 14.1
这是节本的一些连接器对应的编译器版本,这里只介绍Visual Studio编译器,我们为什么要知道这些呢?
因为编译器每更新一次,他对代码的优化就会有所不同,生成的opcode也肯定不同,如果我们要通过特征码来找切入点的话,我们就需要知道他的编译器的版本,再通过这个编译器写出相同的代码,通过查看编译器中的反汇编来提取特征码。
但是我们不太可能直接知道这款软件是用什么编译器写的,所以我们可以通过查看连接器的方法来推断出他是用的是什么编译器写的程序。
知道了如何提取特征码后我们就需要推测出我们要找的关键代码处使用了什么函数。
这个程序既然是通过按按钮来增加按钮的数字,那我们就找他的按钮消息处理函数就好
通过工具我们看到这个程序的连接器版本是12.0,那么他的编译器使用的就是VS 2013,我们就要通过VS来编写一个MFC程序来查看按钮消息的处理函数
敏感部位要打码,不然容易暴露身份~
我们看到按钮消息处理函数的反汇编了,但是有一个问题我们要想一下,如果我们直接使用这个OnBnClickdOK()这个函数的opcode码合适么?
这个函数使我们自己写的,所以每个程序中的OnBnClickdOK()这个函数的opcode码肯定是不相同的,那我们就要通过相同的特征来找到这段代码怎么办呢?
这时我们应该从这个函数开始往上回溯,看看是哪个函数调用的这个OnBnClickdOK()函数,如果是系统调用的,那么我们可以取哪里提取特征码
我们往上一层找,找到一个AfxDispatchCmdMsg 函数,这个函数是用来分发消息的,那么我们没有调用过,肯定就是系统调用的啦,所以可以从这里找特征码,点击进去查看反汇编
我们看到这里,图中用红线圈住的都是可以找特征码的地方,我们就提取前三行吧,把opcode提取出来 “8B F4 8B 4D 08 FF 55 F8”
然后我们就可以拿着这个钥匙去OD里面找我们想要找的那串代码了
复制那串特征码,在OD中查找二进制字符串,就会跳到对应的位置,Ctrl + L 就会跳到下一个特征码相同的地方,我们就一个一个的看
有没有觉得用红线圈出来的这块代码和我们提取特征码的那三行代码很像~
对!我们找到的就是那三行代码。(我有三行祖传的代码给你看一下!)那么这个CALL中肯定就是OnBnClickdOK()函数函数啦~进去看一下
看到这些就看到了胜利的曙光,就这么四个CALL,我们挨个进去看一下,找到哪里是更改程序的地方,就找到密码了。
然后我们在第二个CALL中看到了这么一串代码。
好像是[ebp - 0x8]这个地址每次和0xC比较完之后,下一次就会是[ebp + 0x8 + 4]这个地址和0x8比较,在下一次就是[ebp + 0x8 + 4 + 4]这个地址在和0x5比较,这里有三个值在比较,感觉比较可疑~
我们通过修改寄存器满不足他跳转的条件来显示不满足所有条件之后的结果
好像是被点亮了!!!
那我们回来看一下那三个数值 0xC 0x8 0x5
成功点亮了!
所以密码就是 12, 8 和 5