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练习
- 171114 逆向-以CM为例学习MFC机制
- WPS如何制作指定大小的表格以宽2cm高1cm的表格为例
- MFC消息机制逆向追踪
- MFC消息机制逆向追踪
- 【MFC】:MFC如何加函数,以OnInitDialog为例
- 以Android环境为例的多线程学习笔记(二)-----------------锁和条件机制
- 【逆向】第一次逆向的小CM
- [MFC]Socket基础——以TCP为例
- 171024 逆向-以Xp0int的so fun为例利用Zjdroid安卓脱壳
- 171028 逆向-以CM41为例进行Dll注入(上)
- 171029 逆向-以CM41为例进行Dll注入(中)
- 171031 逆向-以CM41为例进行Dll注入(下)
- 学习的全球化,以Unix为例
- 以MAD为例学习ENVI编程
- 以ontouch为例说明android事件发送机制
- 以按键事件为例阐述消息传递机制
- Java反射机制(以数据库读取为例)
- iOS 缓存机制 (以SDWebImage 缓存图片为例)
- leetcode: 729. My Calendar I,731. My Calendar II
- page页面跳转到子页面和category页面跳转到子页面有区别:
- Effective Java中文版(第2版).pdf 免费下载
- hash初步学习
- 常用css 属性
- 171114 逆向-以CM为例学习MFC机制
- 从修改公司网站开始弄懂每一行代码
- HTTP权威指南.pdf 免费下载
- Java核心技术 卷II 高级特性 第9版(中文).pdf 免费下载
- hrbust 1013及short int ,int 区别
- mysql操作介绍
- Mariadb编码问题
- 安装mysqlldb连接数据库
- 安装和使用MongoDB