| v16 = 280; sub_4085C0(&v12); sub_4016A0(&unk_431C34, 6); v16 = 90; sub_4085C0(&v12); v10 = v15 < 0x10; *((_DWORD *)v2 + 163) = 8; if ( !v10 ) j__free(v13); 看完了之后我们知道了真正做的是dispatch.dll中的init和uninit,下面我们再来看消息处理: void ****sub_401C60() { return &off_4316D0; } .rdata:004316D0 off_4316D0 dd offset off_432340 ; DATA XREF: sub_401C60o .rdata:004316D4 dd offset dword_4316D8 .rdata:004316D8 dword_4316D8 dd 113h ; DATA XREF: .rdata:004316D4o .rdata:004316DC dd 0 .rdata:004316E0 dd 0 .rdata:004316E4 dd 0 .rdata:004316E8 dd 11h .rdata:004316EC dd offset OnTimer .rdata:004316F0 dd 112h .rdata:004316F4 dd 0 .rdata:004316F8 dd 0 .rdata:004316FC dd 0 .rdata:00431700 dd 1Bh .rdata:00431704 dd offset OnSysCommand 。。。。。。。。。。。 先来看MFC里的相关知识,来说明这里为何这么做: 我们每添加一个消息,都会在消息映射里增加一条,例如 BEGIN_MESSAGE_MAP(CtestmfcDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, &CtestmfcDlg::OnBnClickedOk) ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CtestmfcDlg::OnNMRClickList1) END_MESSAGE_MAP() 而这里的第一行和最后一行为宏,对应GetMessageMap函数和结构体 struct AFX_MSGMAP { const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)(); const 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_PTR nSig; // signature type (action) or pointer to message # AFX_PMSG pfn; // routine to call (or special value) }; 从这里很显然的可以看到如何对应上消息响应了。。。。。。。不用解释了吧 如此,对照前面说的windows消息代码,结合exescope查看控件id,可以吧004316D8开始的AFX_MSGMAP_ENTRY标注成消息回调函数: OnTimer OnSysCommand OnPaint OnDragIcon OnSearch OnSelectSource OnTcnSelChange OnLvnColumnClick OnNMLVRClickList OnNMTCRClickList OnNMLVDoubleClick OnSize 现在你来告诉我,那些函数最重要?? |
https://www.0xaa55.com/forum.php?mod=viewthread&tid=1390