如何用IDA找到这个程序中特定函数地址
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用IDA找到这个程序中特定函数地址相关的知识,希望对你有一定的参考价值。
在IDA反汇编窗口中记下函数开始内存地址,结束内存地址,然后转到“Hex -View”窗口记下二进制文件偏移量,最后使用WinHex打开二进制文件,找打对应位置,可以复制出来十六进制数据。 参考技术A 比起用Win32SDK写的程序,要分析MFC应用程序要麻烦不少。在前者,只要找到注册窗口类的地方就知道其WinProc的位置。那里是程序的控制中心,只要顺藤摸瓜就可以找到你感兴趣的地方。对于用MFC写的程序,这一切都变得复杂起来了。这时,所有的消息都是通过一套复杂的机制来完成分发的。他们是通过分发数据表来找到最终函数地址的. 详细请参阅MFC的源代码。 常见的消息分发数据是由以下的宏来生成的: ON_WM_SIZE() ON_NOTIFY(TCN_SELCHANGE, ID_TABBOARD, OnBoardSelchange) ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_TIMER() ON_COMMAND(ID_REDRAW_ALL, OnRedrawAll) 这里简单说一下如何找到二类消息的处理函数。一类是WM_XXX型消息,如WM_LBUTTONDOWN,另一类是WM_COMMAND型消息. 对于第一类,它的调用栈是: CMyView::OnLButtonDown <--最终目标 CWnd::OnWndMsg <--找到这个函数就接近最终目标了 CWnd::WindowProc AxfCallWndProc AxfWndProc AxfWndProcBase 以WM_LBUTTONDOWN为例 #define ON_WM_LBUTTONDOWN() / WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, / (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT, CPoint))&OnLButtonDown , AfxSig_vwp = 0x31 对于VC6.0 Release 版本,可搜索 C0 24 F0 83 C0 2F 48 83 F8 30 0F 87 C6 02 找到CWnd::OnWndMsg。 进入CWnd::OnWndMsg后,找到 case 0x30(IDA 中的case 0x30其实是 case 0x31)处的 call ebx 将进入你真正感兴趣的地方! 这里必须用条件断点Dword(ESP+0x0c) == 0x201, (注WM_LBUTTONDOWN == 0x201) 否则这个断点总会遇到. 找WM_COMMAND消息处理的地方 对于第二类,它的调用栈是: CMyDoc::OnCmdXXX <--最终目标 _AxfDispatchCmdMsg <--找到这个函数就接近最终目标了 CCmdTarget::OnCmdMsg CDocument::OnCmdMsg CView::OnCmdMsg CFrameWnd::OnCmdMsg CWnd::OnCommand CFrameWnd::OnCommand CWnd::OnWndMsg CWnd::WindowProc AxfCallWndProc AxfWndProc AxfWndProcBase ON_COMMAND定义如下 #define ON_COMMAND(id, memberFxn) / WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn , 其中的AfxSig_vv = 12 搜索 71 74 5C 48 48 74 53 83 E8 0A 74 46,将找到_AfxDispatchCmdMsg函数,在case 12 的地方设断点并运行,当程序需要处理OnCmdXXX的时候,控制就会跑到这里,单步进入就可以了。Keil中如何用Keil中如何用汇编调用C函数?
如图所示,我在汇编中用IMPORT声明,调用C函数,但是编译提示错误,请问是什么原因?
检查C文件是否加入项目。检查C文件中是否有这两个函数的原型声明。 参考技术A 关注这个问题
以上是关于如何用IDA找到这个程序中特定函数地址的主要内容,如果未能解决你的问题,请参考以下文章
急!如何用findwindow函数找到所有打开的窗口,然后用sendmessag