171114 逆向-以CM为例学习MFC机制

来源:互联网 发布:我的知颜母亲大学写生 编辑:程序博客网 时间:2024/05/16 18:55

1625-5 王子昂 总结《2017年11月14日》 【连续第410天总结】
A. 谜之CrackMe
B.
来源就不说啦,总之是个MFC程序,运行界面如下
这里写图片描述
可以看到没有确认按钮,一般来说是由定时器消息或Text内容改变消息触发Check函数

确认无壳后拖入IDA查找字符串,轻松定位到sub_401CD0
这里写图片描述
但是向上查找交叉引用却发现落入一个偏移中,无从下手了
对其下断,进行动态调试也没有触发断点

说明这个函数被调用是有条件的

于是转换思路,选择GetWindowText这个API进行下断,果然断到:
这里写图片描述
向上查看交叉引用,发现有很多次

于是在OD中关注GetWindowTextA的取回输入的验证码时的调用堆栈,锁定sub_401ad0
这里写图片描述

刚开始没反应过来v9+96和v9[24]是什么东西,没头没尾的……
后来下断、观察汇编才发现是同一个值
被IDA反编译给坑了:v9的类型是Dword,4字节,于是v9[24] = *(v9 + 24*size) =*(v9 + 96)

也就是说
*(v9+96)称为flag
flag的初值为0(2+1%3)
于是Get两个Text并比较长度

当输入值为5时,对0、2、4作差(-0-1)
后跳入Label_15,将flag改为1
然后对1、3作差(-1-1)
再跳入Label_15,将flag改为2

于是进入校验部分,strcmp两个Text
也就是说要求input作差后==admin(所以注册码为bfnko)
成功后调用sub_4d7d49,其中有一个SendMessage,发送了0x401消息(自定义)来触发校验函数

至此,大概流程就结束了

不过当然不会这么简单啦
除了正向断GetWindowText的API,跟踪输入流找到校验的方法以外,还可以通过逆向回溯消息发送的方法来找到成功的条件

之前对sub_401CD0函数的跟踪到表就断了,这次好好研究了一下MFC的机制,再战结构体

大概能猜测它是一个类似虚表的东西,由一个指针指向函数指针数组的开头,然后通过偏移来调用
那么问题就是找到是什么消息触发了它,这个偏移机制是怎么来的
查询了一番发现这里的讲解比较详细:http://blog.csdn.net/SilverMagic/article/details/40621107
简单来说有一个消息映射表,其中有一个指针指向消息映射结构体数组,每个结构体中保存了消息值、控件ID和响应函数的地址

我们之前跟踪到的地方就是映射结构体,通过向IDA添加结构体并标识可以令其识别:
这里写图片描述
另外还可以通过工具来直接查找:
这里写图片描述
可以看到它准确的识别出了消息0x401,指向了sub_401cd0函数
sub_401AD0的调用则是定时器TIMER引起的

知道了0x401消息,只要直接搜索立即数即可:
这里写图片描述
也能追到Timer函数中的SendMessage

C. 明日计划
RE练习

原创粉丝点击