找回密码
 注册

QQ登录

只需一步,快速开始

用 SEH 技术实现 API Hook

[复制链接]
发表于 2008-9-28 16:37:47 | 显示全部楼层 |阅读模式
阅读本文之前,我先假设读者已经知道了 SEH 和 API Hook 的基本概念,因为我不打算在此进行扫盲工作。什么?你不懂什么叫 SEH 和 API Hook ?那……先去找点资料看看吧,到处都有哦,推荐读物:Jeffrey Richter 大牛的《Windows核心编程》。(没话可说,研究系统底层编程的葵花宝典,必备!)<BR><BR>另外值得补充的是,API Hook 跟一般的 Hook 是一点关系都没有的,虽然它们都是“Hook”,但是在技术上却有着天壤之别。啊……不明白?先去看看葵花宝典吧……<BR><BR>呵呵,废话不多说了,让我们开始吧。<BR><BR>经常研究 Crack 的朋友一定会知道 INT 3 这个指令。(你不知道?我倒……) 这个指令在软件调试中非常有用,因为我们可以利用它来设置特定的断点(BreakPoint),当程序遇到 INT 3 指令的时候,将会产生一个断点异常,这个异常在 Windows.inc 里面定义为 EXCEPTION_BREAKPOINT ,对应值是 080000003h 。Hoho,说了那么多,你想到什么了吗?<BR><BR>是的,聪明的你应该已经想到了!既然是异常,就肯定可以通过 SEH 来进行处理。于是我们可以这样做:在调用 API 之前,先设置一个断点,然后当 API 正式运行的时候,就会因为碰到 INT 3 指令而进入我们的异常处理模块,接着我们就可以在处理模块里面为所欲为了——是改变什么东西还是让它顺利通过,我没话说,看你喜欢吧……<BR><BR>简单地说,过程就是类似这样的:<BR><BR>程序遇到 INT 3 指令后,产生一个中断异常,这时 Windows 就拿着一份处理异常的活挨个问 SEH 链表上的回调函数:“你干不干?”,“不干”,“你呢?”,“我也不干”……当 Windows 终于问到我们定义好的断点异常处理函数后,他说:“让我来干好了!”,于是 Windows 就不会再问余下的人了,他把全权托给了我们的处理函数,至于我们的函数在之后做了什么手脚……呵呵,只有天知道!<BR><BR>明白了吗?其实在这里我们是利用了软件调试上的一个小技巧,实现了“伪 API Hook”。严格来说,这种方法不能算是真正的 API Hook ,但是由于我们可以在 SEH 回调函数中为所欲为,而系统不会发觉,所以也可以勉强算个数吧。<BR><BR>弄清楚原理后,剩下的就不难了。我们首先要保存目标 API 的入口地址,接着要设置一个 INT 3 指令,然后就在 SEH 的回调函数中进行地址修正等工作,最后万事倶备,只欠东风了。程序一运行,就进入了我们的 SEH 回调函数,呵呵,你爱怎么样就怎么样吧……<BR><BR>怎么样?一点都不难吧。罗里罗嗦地说了一大堆,可能有人会开始不耐烦了……呵,别着急,下面我就给出源代码。补充一句:本方法只是提供了一种新的思路,如果你在深入研究中发现了我的错误,或者有更好的解决方法,请给我来信啊,我的邮箱:<A title=欢迎来信探讨! href="mailto:lcother@163.net?subject=老罗,有关SEH实现API Hook的问题想跟你探讨。"><FONT color=#0000ff>mailto:lcother@163.net?subject=老罗,有关SEH实现API Hook的问题想跟你探讨。</FONT></A>。<BR><BR>(注意,本技术只能在 NT/2000/XP 平台下使用)<BR><BR>8 S/ b) R  [' G5 a7 A0 J
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
2 n8 c9 k8 `  w* r$ c: H9 c<TBODY>( I+ h' p- W, S  Y* H5 B. |
<TR>
# o8 d" e6 n3 a<TD><A name=L1><FONT color=#238e23>;*********************************************************</FONT><BR><A name=L2><FONT color=#238e23>;程序名称:用 SEH 技术实现 API Hook</FONT><BR><A name=L3><FONT color=#238e23>;适用系统:Win NT/2000/XP</FONT><BR><A name=L4><FONT color=#238e23>;作者:罗聪</FONT><BR><A name=L5><FONT color=#238e23>;日期:2002-11-22</FONT><BR><A name=L6><FONT color=#238e23>;出处:http://www.LuoCong.com(老罗的缤纷天地)</FONT><BR><A name=L7><FONT color=#238e23>;注意事项:如欲转载,请保持本程序的完整,并注明:</FONT><BR><A name=L8><FONT color=#238e23>;转载自“老罗的缤纷天地”(http://www.LuoCong.com)</FONT><BR><A name=L9><FONT color=#238e23>;*********************************************************</FONT><BR><A name=L10><BR><A name=L11><FONT color=#9932cd><B>.</B></FONT><FONT color=#802000>386</FONT><BR><A name=L12><FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>model</FONT> <FONT color=#ff0000>flat</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>stdcall</FONT><BR><A name=L13><FONT color=#ff0000>option</FONT> <FONT color=#ff0000>casemap</FONT><FONT color=#3080ca>:</FONT>none<BR><A name=L14><BR><A name=L15><FONT color=#ff8000>include</FONT> \masm32\include\windows.inc<BR><A name=L16><FONT color=#ff8000>include</FONT> \masm32\include\kernel32.inc<BR><A name=L17><FONT color=#ff8000>include</FONT> \masm32\include\user32.inc<BR><A name=L18><FONT color=#ff8000>includelib</FONT> \masm32\lib\kernel32.lib<BR><A name=L19><FONT color=#ff8000>includelib</FONT> \masm32\lib\user32.lib<BR><A name=L20><BR><A name=L21>WndProc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>proto</FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A name=L22>Error_Handler&nbsp;&nbsp; <FONT color=#ff0000>proto</FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A name=L23>SetHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>proto</FONT><BR><A name=L24><BR><A name=L25><FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>const</FONT><BR><A name=L26>IDI_LC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>equ</FONT> <FONT color=#802000>1</FONT><BR><A name=L27>IDC_CHECKBUTTON_HOOK&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>equ</FONT> <FONT color=#802000>3000</FONT><BR><A name=L28>IDC_BUTTON_ABOUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>equ</FONT> <FONT color=#802000>3001</FONT><BR><A name=L29>IDC_BUTTON_EXIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>equ</FONT> <FONT color=#802000>3002</FONT><BR><A name=L30><BR><A name=L31><FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>data</FONT><BR><A name=L32>szDlgName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"lc_dialog"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L33>szMsgAbout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"-= SEH for API Hook =-"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L34>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>"作者:罗聪(lcother@163.net)"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L35>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>"老罗的缤纷天地"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L36>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>"http://www.LuoCong.com"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L37>szMyText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#0000ff>"(哈哈,看到有什么不同了吗?)"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L38>szMsgHooked&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"MessageBoxIndirectA() has been hooked!"</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L39>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L40>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>"即将改变原来的 MessageBoxIndirectA() 的参数,"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L41>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>"请注意后面的对话框跟没有 Hook 之前有什么不同……"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L42>szCaption&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"SEH for API Hook by LC"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L43>szLibUser&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"user32"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L44>szProcMsgBoxInd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#0000ff>"MessageBoxIndirectA"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L45>dwAddress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>dd</FONT>&nbsp;&nbsp;<FONT color=#802000>0</FONT><BR><A name=L46>dwOldProtect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>dd</FONT>&nbsp;&nbsp;<FONT color=#802000>0</FONT><BR><A name=L47>bOldByte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#802000>0</FONT><BR><A name=L48>dwRetAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>dd</FONT>&nbsp;&nbsp;<FONT color=#802000>0</FONT><BR><A name=L49><BR><A name=L50><FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>data</FONT><FONT color=#3080ca>?</FONT><BR><A name=L51>hInstance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#3080ca>?</FONT><BR><A name=L52>mbp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSGBOXPARAMS&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#3080ca>&lt;</FONT><FONT color=#3080ca>&gt;</FONT><BR><A name=L53>szText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>db</FONT>&nbsp;&nbsp;<FONT color=#802000>1024</FONT> <FONT color=#ff0000>dup</FONT><FONT color=#ff00ff>(</FONT><FONT color=#3080ca>?</FONT><FONT color=#ff00ff>)</FONT><BR><A name=L54><BR><A name=L55><FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>code</FONT><BR><A name=L56>main<FONT color=#3080ca>:</FONT><BR><A name=L57>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 设置 SEH 链:</FONT><BR><A name=L58>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>assume</FONT>&nbsp;&nbsp;<FONT color=#ff0000>fs</FONT><FONT color=#3080ca>:</FONT>nothing<BR><A name=L59>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>push</FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>offset</FONT> Error_Handler<BR><A name=L60>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>push</FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>fs</FONT><FONT color=#3080ca>:</FONT><FONT color=#871f78>[</FONT><FONT color=#802000>0</FONT><FONT color=#871f78>]</FONT><BR><A name=L61>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT>&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>fs</FONT><FONT color=#3080ca>:</FONT><FONT color=#871f78>[</FONT><FONT color=#802000>0</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>esp</FONT><BR><A name=L62><BR><A name=L63>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT>&nbsp;&nbsp;GetModuleHandle<FONT color=#9932cd><B>,</B></FONT> NULL<BR><A name=L64>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT>&nbsp;&nbsp;&nbsp;&nbsp; hInstance<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L65>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT>&nbsp;&nbsp;DialogBoxParam<FONT color=#9932cd><B>,</B></FONT> hInstance<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>offset</FONT> szDlgName<FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><FONT color=#9932cd><B>,</B></FONT> WndProc<FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L66><BR><A name=L67>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 恢复原来的 SEH 链:</FONT><BR><A name=L68>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>pop</FONT>&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>fs</FONT><FONT color=#3080ca>:</FONT><FONT color=#871f78>[</FONT><FONT color=#802000>0</FONT><FONT color=#871f78>]</FONT><BR><A name=L69>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>pop</FONT>&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>eax</FONT><BR><A name=L70>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT>&nbsp;&nbsp;ExitProcess<FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L71><BR><A name=L72>WndProc <FONT color=#ff0000>proc</FONT> hWnd<FONT color=#3080ca>:</FONT>HWND<FONT color=#9932cd><B>,</B></FONT> uMsg<FONT color=#3080ca>:</FONT>UINT<FONT color=#9932cd><B>,</B></FONT> wParam<FONT color=#3080ca>:</FONT>WPARAM<FONT color=#9932cd><B>,</B></FONT> lParam<FONT color=#3080ca>:</FONT>LPARAM<BR><A name=L73>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> uMsg <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> WM_CLOSE<BR><A name=L74>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> EndDialog<FONT color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A name=L75><BR><A name=L76>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>elseif</FONT> uMsg <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> WM_INITDIALOG<BR><A name=L77>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> hWnd<BR><A name=L78>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>hwndOwner<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L79>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> LoadIcon<FONT color=#9932cd><B>,</B></FONT> hInstance<FONT color=#9932cd><B>,</B></FONT> IDI_LC<BR><A name=L80>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> SendMessage<FONT color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT> WM_SETICON<FONT color=#9932cd><B>,</B></FONT> ICON_SMALL<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L81>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 储存 API 的原入口地址:</FONT><BR><A name=L82>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> GetModuleHandle<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szLibUser<BR><A name=L83>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> GetProcAddress<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szProcMsgBoxInd<BR><A name=L84>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>dwAddress<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L85>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 保存原对话框的输出文字:</FONT><BR><A name=L86>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> lstrcpy<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szText<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szMsgAbout<BR><A name=L87><BR><A name=L88>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>elseif</FONT> uMsg <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> WM_COMMAND<BR><A name=L89>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> wParam<BR><A name=L90>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L91>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>shr</FONT> <FONT color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>16</FONT><BR><A name=L92>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>movzx</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>ax</FONT><BR><A name=L93>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> <FONT color=#ff0000>edx</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> BN_CLICKED<BR><A name=L94>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> <FONT color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> IDC_BUTTON_EXIT <FONT color=#3080ca>|</FONT><FONT color=#3080ca>|</FONT> <FONT color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> IDCANCEL<BR><A name=L95>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> EndDialog<FONT color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT> NULL<BR><A name=L96><BR><A name=L97>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>elseif</FONT> <FONT color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> IDC_BUTTON_ABOUT <FONT color=#3080ca>|</FONT><FONT color=#3080ca>|</FONT> <FONT color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> IDOK<BR><A name=L98>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>cbSize<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>sizeof</FONT> mbp<BR><A name=L99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> hInstance<BR><A name=L100>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>hInstance<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L101>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>lpszText<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>offset</FONT> szMsgAbout<BR><A name=L102>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>lpszCaption<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>offset</FONT> szCaption<BR><A name=L103>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>dwStyle<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> MB_OK <FONT color=#ff0000>or</FONT> MB_APPLMODAL <FONT color=#ff0000>or</FONT> MB_USERICON<BR><A name=L104>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>lpszIcon<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> IDI_LC<BR><A name=L105>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> MessageBoxIndirect<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> mbp<BR><A name=L106><BR><A name=L107>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>elseif</FONT> <FONT color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT color=#3080ca>=</FONT> IDC_CHECKBUTTON_HOOK<BR><A name=L108>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 把内存保护设置成 可读/可写/可执行:</FONT><BR><A name=L109>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> VirtualProtect<FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>dwAddress<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>1</FONT><FONT color=#9932cd><B>,</B></FONT> PAGE_EXECUTE_READWRITE<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> dwOldProtect<BR><A name=L110>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> IsDlgButtonChecked<FONT color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT> IDC_CHECKBUTTON_HOOK<BR><A name=L111>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>dwAddress<FONT color=#871f78>]</FONT><BR><A name=L112>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>test</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A name=L113>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> zero<FONT color=#3080ca>?</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#238e23>; uninstall hook</FONT><BR><A name=L114>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>cl</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>bOldByte<FONT color=#871f78>]</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; bOldByte = API 原入口地址</FONT><BR><A name=L115>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>byte</FONT> <FONT color=#ff0000>ptr</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>edx</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>cl</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 恢复 API 的原入口地址</FONT><BR><A name=L116>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> lstrcpy<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szMsgAbout<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szText&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 恢复原对话框的输出文字:</FONT><BR><A name=L117>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>else</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#238e23>; re-install hook</FONT><BR><A name=L118>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>cl</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>byte</FONT> <FONT color=#ff0000>ptr</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>edx</FONT><FONT color=#871f78>]</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; byte ptr [edx] = API 原入口地址</FONT><BR><A name=L119>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>byte</FONT> <FONT color=#ff0000>ptr</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>edx</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0CCh</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 断点异常(INT 3 指令)</FONT><BR><A name=L120>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>bOldByte<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>cl</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 储存 API 的原入口地址</FONT><BR><A name=L121>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT> lstrcat<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szMsgAbout<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szMyText&nbsp;&nbsp;<FONT color=#238e23>; 改变原对话框的输出文字:</FONT><BR><A name=L122>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A name=L123><BR><A name=L124>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A name=L125>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A name=L126>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>else</FONT><BR><A name=L127>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> FALSE<BR><A name=L128>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>ret</FONT><BR><A name=L129>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A name=L130>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> TRUE<BR><A name=L131>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>ret</FONT><BR><A name=L132>WndProc <FONT color=#ff0000>endp</FONT><BR><A name=L133><BR><A name=L134><FONT color=#238e23>;****************************************</FONT><BR><A name=L135><FONT color=#238e23>; 函数功能:处理异常错误</FONT><BR><A name=L136><FONT color=#238e23>;****************************************</FONT><BR><A name=L137>Error_Handler <FONT color=#ff0000>proc</FONT> <FONT color=#ff0000>uses</FONT> <FONT color=#ff0000>ecx</FONT> lpExceptRecord<FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> lpFrame<FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> lpContext<FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> lpDispatch<FONT color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A name=L138>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 输出 "API hooked":</FONT><BR><A name=L139>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>invoke</FONT>&nbsp;&nbsp;MessageBox<FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>mbp<FONT color=#9932cd><B>.</B></FONT>hwndOwner<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szMsgHooked<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT> szCaption<FONT color=#9932cd><B>,</B></FONT><FONT color=#3080ca>\</FONT><BR><A name=L140>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MB_OK <FONT color=#ff0000>or</FONT> MB_ICONINFORMATION<BR><A name=L141><BR><A name=L142>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 储存并改变 SetHook 函数的返回值:(经过修正)</FONT><BR><A name=L143>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; (想不明白?呵呵,用调试器跟踪一下吧,我也说不清楚,只能意会不能言传……)</FONT><BR><A name=L144>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>lpContext<FONT color=#871f78>]</FONT><BR><A name=L145>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><FONT color=#871f78>[</FONT>CONTEXT<FONT color=#9932cd><B>.</B></FONT>regEsp<FONT color=#871f78>]</FONT><BR><A name=L146>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>ecx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><BR><A name=L147>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>offset</FONT> SetHook<BR><A name=L148>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>dwRetAddr<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>ecx</FONT><BR><A name=L149><BR><A name=L150>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 把 API 原入口地址写回去,以便继续运行原 API:</FONT><BR><A name=L151>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; (跟踪一下吧,我实在是不知道怎么才能说得清楚……)</FONT><BR><A name=L152>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>dwAddress<FONT color=#871f78>]</FONT><BR><A name=L153>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>cl</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>bOldByte<FONT color=#871f78>]</FONT><BR><A name=L154>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>byte</FONT> <FONT color=#ff0000>ptr</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>cl</FONT><BR><A name=L155><BR><A name=L156>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 继续下一个 Execution:</FONT><BR><A name=L157>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> ExceptionContinueExecution<BR><A name=L158>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>ret</FONT><BR><A name=L159>Error_Handler <FONT color=#ff0000>endp</FONT><BR><A name=L160><BR><A name=L161><FONT color=#238e23>;****************************************</FONT><BR><A name=L162><FONT color=#238e23>; 函数功能:设置 API Hook</FONT><BR><A name=L163><FONT color=#238e23>;****************************************</FONT><BR><A name=L164>SetHook <FONT color=#ff0000>proc</FONT> <FONT color=#ff0000>uses</FONT> <FONT color=#ff0000>ecx</FONT><BR><A name=L165>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT>dwAddress<FONT color=#871f78>]</FONT><BR><A name=L166>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>cl</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><BR><A name=L167>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#ff0000>byte</FONT> <FONT color=#ff0000>ptr</FONT> <FONT color=#871f78>[</FONT><FONT color=#ff0000>eax</FONT><FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0CCh</FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#238e23>; 断点异常(INT 3 指令)</FONT><BR><A name=L168>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>mov</FONT> <FONT color=#871f78>[</FONT>bOldByte<FONT color=#871f78>]</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>cl</FONT><BR><A name=L169>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>jmp</FONT> <FONT color=#871f78>[</FONT>dwRetAddr<FONT color=#871f78>]</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#238e23>; 跳回经过 Hook 之后的 API 的返回地址(很重要!)</FONT><BR><A name=L170>SetHook <FONT color=#ff0000>endp</FONT><BR><A name=L171><BR><A name=L172><FONT color=#ff0000>end</FONT> main<BR><A name=L173><FONT color=#238e23>;********************&nbsp;&nbsp; over&nbsp;&nbsp;&nbsp;&nbsp;********************</FONT><BR><A name=L174><FONT color=#238e23>;by LC</FONT></A></TD></TR></TBODY></TABLE><BR>它的资源文件:<BR><BR>
7 x2 Z% S3 h! G3 c2 o, h! D& k<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
+ t4 l- D8 @  |% L<TBODY>( \* O8 }8 \* p' w8 t
<TR>9 f0 p# n) w2 Q! g
<TD>#include "resource.h"<BR><BR>#define IDI_LC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<BR>#define IDC_CHECKBOX_HOOK&nbsp;&nbsp; 3000<BR>#define IDC_BUTTON_ABOUT&nbsp;&nbsp;&nbsp;&nbsp;3001<BR>#define IDC_BUTTON_EXIT&nbsp;&nbsp;&nbsp;&nbsp; 3002<BR>#define IDC_STATIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1<BR><BR>IDI_LC&nbsp;&nbsp;ICON&nbsp;&nbsp;&nbsp;&nbsp;"lc.ico"<BR><BR>LC_DIALOG DIALOGEX 10, 10, 200, 50<BR>STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU<BR>CAPTION "SEH for API Hook by LC, 2002-11-22"<BR>FONT 8, "MS Sans Serif"<BR>BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;AUTOCHECKBOX&nbsp;&nbsp;&nbsp;&nbsp;"&amp;Hook MessageBoxIndirectA", IDC_CHECKBOX_HOOK, 5, 5, 190, 12<BR>&nbsp;&nbsp;&nbsp;&nbsp;PUSHBUTTON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"关于(&amp;A)", IDC_BUTTON_ABOUT, 5, 30, 90, 14, BS_FLAT | BS_CENTER<BR>&nbsp;&nbsp;&nbsp;&nbsp;PUSHBUTTON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"退出(&amp;X)", IDC_BUTTON_EXIT, 105, 30, 90, 14, BS_FLAT | BS_CENTER<BR>END</TD></TR></TBODY></TABLE><BR>没啥特别的,仔细一想就明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|本地广告联系: QQ:905790666 TEL:13176190456|Archiver|手机版|小黑屋|汶上信息港 ( 鲁ICP备19052200号-1 )

GMT+8, 2025-4-15 08:05

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表