记:破解MFC小程序03

8 篇文章 0 订阅
5 篇文章 0 订阅

在很久很久以前,有几个加密过的小程序
然后,他们被我破解了….

这里写图片描述

我们这次破解第四个程序

打开程序我们看到这样的界面

这里写图片描述

这不是和第三个程序一样的界面么?
莫非是一样的逻辑?这么简单么?我们看一下反汇编就知道了,套路还和前两个是一样的,我们之前保存了一个按钮响应函数的特征码,就用这个特征码 就可以找到我们想要看的代码,如果没有看前面三篇文章的话,请移步这里 http://blog.csdn.net/DSQSYSPA/article/details/78294719,这里有详细的介绍为什么保存特征码,怎么提取特征码,以及特征码有什么用。

之前的特征码: 8B F4 8B 4D 08 FF 55 F8

又断在我们熟悉的 int3 CALL这里了,那我们就进去这个CALL里面看一下,找到我们熟悉的按钮消息处理函数

这里写图片描述

我们看到这么一大串 mov,第一反应就是…不看这段了,接着往下看吧

好吧,那我们接着进CALL里查看代码,对了,这里一定要动态的调试,不然你只会看到父类的虚函数

我们发现第一个CALL上面有一个跳转条件,好像是[eax + 0xE4]必须等于9时才不会把第一个CALL 跳过去,我们这么勤劳的AV工程师,当然是直接修改寄存器进入CALL,一进去好像看到了很熟悉的代码

这里写图片描述

好像看到了九个按钮的值在和正确密码比较对不对!
好,我们根据跳转条件推断出正确密码应该是:0 1 1 0 1 0 1 0 1

哈哈,这么简单么?!!!

输入密码后……

这里写图片描述

WHAT?!!! 怎么没有亮(懵逼脸),漏了些什么么?

回想一下~对了!进入这个关键函数好像还有一个条件!

[eax + 0xE4]必须等于9时才可以进入关键函数,好吧,那段又长又~~长的代码终究还是要看的….MMP

这里写图片描述

首先先把[ebp - 0x8]这个地址赋给了eax寄存器,接下来我们看到
cmp dowrd ptr ds:[eax + 0xC0],0x0
这显然是把eax当做了一个基址,就是[ebp - 0x8]是基址。[eax + 0xC0]和 0x0比较,如果[eax + 0xC0]不等于0就跳转,我们仔细研究这段代码

这里写图片描述

是不是在判断 [eax + 0xC0] 这个地址的值如果等于0,就会用一个中间变量 [ebp - 0xD0] 给 [eax + 0xC0] 赋值为1,如果 [eax + 0xC0] 等于1,就会赋值为0,这个就是我们按下按钮之后按钮改变值的地方,那我们接着看

这里写图片描述
接着就是判断我们更改过以后的按钮的值是否为0,那我们现在这个按钮的值肯定是1啦,我们不跳转,然后又把[基址 + 0xE4]这个地址的值给ecx(以后[ebp - 0x8]就成为基址),然后赋给中间变量 [ebp - 0xD0] ,接着跳转到图中画红线的位置,然后又把中间变量 [ebp - 0xD0] 里保存的值赋给了eax,eax又给了 [edx + 0x110] ,然后这个值又赋给了ecx,之后我们看到当前按钮改变后的值赋给了eax,然后这个按钮的当前状态会赋给 [edx + ecx * 4 + 0xE8]这个地址,诶~这个地址好像不是固定的,我们网上看一下这个工事中涉及到的寄存器都保存的什么值,edx保存的是我们的基址,ecx保存的则是 [eax + 0xE4] 中的值,那么这个 [eax + 0xE4] 中保存的到底是什么值呢?很纳闷,那我们带着这个疑惑接着往下看吧。

接下来又把 [eax + 0xE4] 这个值赋给了ecx,一直赋来赋去的要晕了~
然后!我们看到这个值变了!只要他改变我们就可以通过改变的值来判断他是做什么用的

这里写图片描述

[eax + 0xE4] 和我们当前按钮的状态相加了,当前按钮的状态是 1,他俩相加之后又把结果赋了回 [eax + 0xE4],那么我们想了按钮只有两种状态,1 和 0,如果 [eax + 0xE4] 和 0 相加那他的值就不会有改变

这里写图片描述

我们紧接着看,和按钮当前状态相加之后的 [eax + 0xE4] 和0x9去比较了,如果 [eax + 0xE4] 等于9我们就可以直接进入关键函数,那么!

相当于说每次按钮被点击之后如果值为1, [eax + 0xE4]的值也会加1,那么 [edx + ecx * 4 + 0xE8] 这个地址中 ecx就是 [eax + 0xE4] 的值,而 [edx + ecx * 4 + 0xE8] 这个地址赋的是当前按钮被改变之后的值,如果这次按钮改变之后是1,那么下一次就会在 [edx + ecx * 4 + 0xE8] 这个地址的基础上再加4个字节的地方依然把这次按钮被改变之后的值赋值给那个地址,好像这块地址也保存了一份按钮的值。

我们再往上看,如果按钮一开始为1 呢?

这里写图片描述

会把 0 赋值给按钮,然后我们看到 [eax + 0xE4] 这里的值赋值给了ecx,ecx又减了1,这个ecx的值是个临时变量在下面的程序中就是 [edx + ecx * 4 + 0xE8] 中 ecx 的值,我们回想一下,当按钮按下之后会改变按钮的值,为1会变为0,为0会变为1,然后如果按钮改变之后的值为1 ,就会在 [edx + ecx * 4 + 0xE8] 这个地址附上按钮改变之后的值。如果按钮改变之后的值为0,那么 [edx + ecx * 4 + 0xE8] 中的ecx就会减1,意思就是会把前一个按钮的值变为当前按钮改变之后的值,为0。值有按钮被点击之后变为1,[eax + 0xE4] 这个地址的值才会加1,为0不会加,当[eax + 0xE4] 的值为9时,就会进入到关键函数。

我们再进一次关键函数看看

这里写图片描述

我们看到一个比较熟悉的地址,好像就是我们上一层的基址,查看ebp寄存器之后计算偏移,发现的确是基址,基址加C0,加C4,加C8这些偏移好像就是 [edx + ecx * 4 + 0xE8] 中 ecx为0,为1,为2时的地址,啊~原来程序不是和界面上的这些按钮的值来比较的,而是通过一种算法,一种如果点击0,内存中一块和按钮相对应的空间的值会变为1,每次这个地址都会加1,来保存下一次点击按钮设置的值,点击0,则上一次被改变的那个地址就会变为0,我们知道了算法,也知道了密码。
密码是: 0 1 1 0 1 0 1 0 1

然后我们知道了算法,那我们可以每个值对应每个按钮来解这道题,如果是 0,我们就点击两下,如果为1,就点击一下

这里写图片描述

当当~切记,由于[eax + 0xE4]这个地址的值没有减法,所以从程序点开之后一定不能点错任何一下,否则即使是进去关键函数,你设置的密码也是不对的

这几个小程序就这样被我给搞定了~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值