mfc的逆向,同时搭配多种算法
如何找按钮对应的函数
在MFC中,程序使用消息机制来实现操作响应,下面是消息映射表的结钩,我们想要的某个控件的消息处理函数,就存放在该结构体的pfn中。nID与控件的ID相同。
struct AFX_MSGMAP{
AFX_MSGMAP * pBaseMessageMap;
AFX_MSGMAP_ENTRY * lpEntries;
}
struct AFX_MSGMAP_ENTRY{
UINT nMessage; //Windows Message
UINT nCode //Control code or WM_NOTIFY code
UINT nID; //control ID (or 0 for windows messages)
UINT nLastID; //used for entries specifying a range of control id's
UINT nSig; //signature type(action) or pointer to message
AFX_PMSG pfn; //routine to call (or specical value)
}
第一步:用resource hacker查找资源。得到资源对应的编号,本图:确定对应1,取消对应2,消息框对应1000。
第二步:IDA打开,Search>immediate value(快捷键:Alt+I),打开一个消息框
查找0xE8(消息框对应的ID是1000,16进制 字节表示就取后两位 E8,勾选Find all occurrences(查找所有事件))
点击ok开始查找,查找结果:
第三步:创建本地类型
View–>Open Subviews–>Local Types(视图–>打开子窗口–>本地类型)(快捷键 shift+F1) Inaert键插入,在输入框里输入下面的内容:
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT_PTR nSig;
void (*pfn)(void);
};
struct AFX_MSGMAP
{
const AFX_MSGMAP *(__stdcall *pfnGetBaseMap)();
const AFX_MSGMAP_ENTRY *lpEntries;
};
点击ok,成功插入新的本地类型
新增的两种类型分别右键Synchronize to idb,同步到本文件中(新增两种类型,要操作两次)
第四步:修改数据为新定义结构体格式。
选中第二步找到的数据,Edit>Structs>Struct var
修改成功,找到按钮对应的函数。
无法按下确认键?
输入长度为66,可以按下确认键。