📄 2_4 实例:hook管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm
字号:
<P>取消某个函数的HOOK操作和设置操作相反,主要是在数组中查到要操作的函数的相关记录信息,将源函数起始位置处的6个字节恢复,清除数组中的对应记录信息。编码如下。</P>
<P style="LINE-HEIGHT: 14pt">/** 取消某个函数的钩子函数设置</P>
<P style="LINE-HEIGHT: 14pt">@param HANDLE hApiHook——由ApiHook_Init()函数生成的句柄 </P>
<P style="LINE-HEIGHT: 14pt">@param DWORD dwSrcFuncAddr——源函数地址 </P>
<P style="LINE-HEIGHT: 14pt">@return INT (by default)<SUB>
</SUB>——返回-1表示失败;返回0表示在HOOK数组中的序号</P>
<P style="LINE-HEIGHT: 14pt">*/</P>
<P style="LINE-HEIGHT: 14pt"><B>INT ApiHook_UnSetByAddr(HANDLE
hApiHook</B><B>,</B><B>DWORD dwSrcFuncAddr)</B></P>
<P style="LINE-HEIGHT: 14pt">{</P>
<P style="LINE-HEIGHT: 14pt">UINT i;</P>
<P style="LINE-HEIGHT: 14pt">DWORD dwOldProtect;</P>
<P style="LINE-HEIGHT: 14pt">DWORD dwNewProtect;</P>
<P style="LINE-HEIGHT: 14pt">DWORD lpSrcFunc;</P>
<P style="LINE-HEIGHT: 14pt">APIHOOK *pApiHook = (APIHOOK *)hApiHook;</P>
<P style="LINE-HEIGHT: 14pt">if ( NULL == hApiHook )</P>
<P style="LINE-HEIGHT: 14pt">{</P>
<P style="LINE-HEIGHT: 14pt">return-1;</P>
<P style="LINE-HEIGHT: 14pt">}</P>
<P style="LINE-HEIGHT: 14pt">for ( i = 0; i < pApiHook->uMaxFunctions; i++
)</P>
<P style="LINE-HEIGHT: 14pt">{</P>
<P style="LINE-HEIGHT: 14pt">if ( pApiHook->pHookData[i].dwSrcFuncAddr ==
dwSrcFuncAddr )</P>
<P style="LINE-HEIGHT: 14pt">{</P>
<P style="LINE-HEIGHT: 14pt">break;</P>
<P style="LINE-HEIGHT: 14pt">}</P>
<P style="LINE-HEIGHT: 14pt">}</P>
<P style="LINE-HEIGHT: 14pt">if ( i == pApiHook->uMaxFunctions )</P>
<P style="LINE-HEIGHT: 13.8pt">{</P>
<P style="LINE-HEIGHT: 13.8pt">return-1;</P>
<P style="LINE-HEIGHT: 13.8pt">}</P>
<P style="LINE-HEIGHT: 14.2pt">lpSrcFunc =
pApiHook->pHookData[i].dwSrcFuncAddr;</P>
<P style="LINE-HEIGHT: 14.2pt">/* 将lpSrcFunc指向的内存属性修改为可以读写的 */</P>
<P style="LINE-HEIGHT: 14.2pt">if ( VirtualProtect( (
LPVOID)lpSrcFunc,6,PAGE_EXECUTE_READWRITE,</P>
<P style="LINE-HEIGHT: 14.2pt">&dwOldProtect ) == 0 )</P>
<P style="LINE-HEIGHT: 14.2pt">{</P>
<P style="LINE-HEIGHT: 14.2pt">return-1;</P>
<P style="LINE-HEIGHT: 14.2pt">}</P>
<P style="LINE-HEIGHT: 14.2pt">memcpy( (void
*)lpSrcFunc,pApiHook->pHookData[i].byHeaderCode,6 );</P>
<P style="LINE-HEIGHT: 14.2pt">/* 恢复lpSrcFunc指向的内存属性 */</P>
<P style="LINE-HEIGHT: 14.2pt">if ( VirtualProtect(
(LPVOID)lpSrcFunc,6,dwOldProtect,&dwNewProtect ) == 0 ) </P>
<P style="LINE-HEIGHT: 14.2pt">{</P>
<P style="LINE-HEIGHT: 14.2pt">return-1;</P>
<P style="LINE-HEIGHT: 14.2pt">}</P>
<P style="LINE-HEIGHT: 14.2pt">pApiHook->pHookData[i].wFlag = 0;</P>
<P style="LINE-HEIGHT: 14.2pt">if ( pApiHook->pHookData[i].pszDllName )</P>
<P style="LINE-HEIGHT: 14.2pt">{</P>
<P style="LINE-HEIGHT: 14.2pt">free(pApiHook->pHookData[i].pszDllName);</P>
<P style="LINE-HEIGHT: 14.2pt">pApiHook->pHookData[i].pszDllName = NULL;</P>
<P style="LINE-HEIGHT: 14.2pt">}</P>
<P style="LINE-HEIGHT: 14.2pt">if ( pApiHook->pHookData[i].pszFuncName )</P>
<P style="LINE-HEIGHT: 14.2pt">{</P>
<P style="LINE-HEIGHT: 14.2pt">free( pApiHook->pHookData[i].pszFuncName
);</P>
<P style="LINE-HEIGHT: 14.2pt">pApiHook->pHookData[i].pszFuncName = NULL;</P>
<P style="LINE-HEIGHT: 14.2pt">}</P>
<P style="LINE-HEIGHT: 14.2pt">return (INT)i;</P>
<P style="LINE-HEIGHT: 14.2pt">}</P>
<H3><A name=_Toc122884731></A>2.4.3 HOOK功能的应用简介</H3>
<P>HOOK功能是一项非常重要的功能,是软件工程师必须掌握的技术。HOOK功能在实际中应用非常广泛,如词典软件、安全软件及各种系统软件中均会用到;还有一些C语言语法不能实现的功能也可以用HOOK来实现,如C++标准模板库中就用到了内存配置器的概念,即用户可以自己指定内存分配方法,可以使用自己的内存分配函数来进行内存管理。在C语言中,这个功能从语法上要求用函数指针作为回调函数等来实现,但是有很多已经写好的模块是不能随便修改接口的,如果要让这些模块在不修改的基础上使用自定义内存管理算法,就必须使用HOOK功能。可以对malloc(),free()等内存管理函数设置HOOK,使它们跳转到自定义的内存管理函数即可。</P>
<P>HOOK功能还有一项非常重要的用途就是在白盒测试方面,像单元测试需要打桩,传统的打桩方法是将源文件中需要打桩的函数用桩函数替代,这个工作虽然可以通过工具来实现,但还是比较麻烦;如果使用HOOK来打桩则可以避免修改源文件,只要将桩函数设置成钩子函数,比传统的方法简洁多了。</P>
<H3><A name=_Toc122884732></A>2.4.4 HOOK使用的注意事项</H3>
<P>使用HOOK时要特别小心,使用不当很容易导致程序崩溃。比如要HOOK
malloc()和free()函数,如果HOOK的时机不当,会导致HOOK了的free()函数去释放未被HOOK的malloc()的内存,引起程序崩溃。</P>
<H2 style="TEXT-ALIGN: center" align=center><A name=_Toc116222484>本</A> 章 小
结</H2>
<P>本章主要用数组来实现栈的设计、队列的设计和排序表的设计,并在排序表中介绍了快速排序算法和二分查找算法的实现。对于查找,有些人觉得二分查找法在数据较大时可能不够快,确实有比二分查找更快的算法,本书第4章中讲的哈希表的查找就是比二分查找更快的算法,但二分查找法在数组上实现非常简单,在实际中还是经常会用到。当然有些初学者可能会纳闷,数学中不是讲过黄金分割法比二分法更快吗?要知道,计算机里面处理整数运算比浮点数运算可是要快好多倍,采用黄金分割法在数学理论上比二分法快,但实际中需要用到浮点数运算,自然比不上二分法的速度了。</P>
<H2 style="TEXT-ALIGN: center" align=center>习题与思考</H2>
<P>1. 编程调用栈操作函数压入100万个随机整数,再全部弹出来,打印出花费的总时间。</P>
<P>2. 编程将100万个随机整数插入到SortTable中,再调用快速排序函数排序,打印出排序花费的时间。</P>
<P>3. 编程将1~100万的整数一次插入排序表里,调用二分查找函数将1~100万这100万个数依次查找一遍,打印出花费的时间。</P>
<P>4.
编码实现动态环形队列DeQue的弹出尾部节点函数DeQue_PopTail()和插入头部函数DeQue_InsertHead()函数。</P></DIV><!-- page -->
<DIV class=page style="TEXT-ALIGN: center"><A
href="http://book.csdn.net/bookfiles/65/100651879.shtml">上一页</A> <A
href="http://book.csdn.net/bookfiles/65/index.html">首页</A> <A
href="http://book.csdn.net/bookfiles/65/100652553.shtml">下一页</A> </DIV>
<DIV
style="BORDER-RIGHT: #0b5f98 1px solid; BORDER-TOP: #0b5f98 1px solid; MARGIN: 0px auto; BORDER-LEFT: #0b5f98 1px solid; WIDTH: 700px; BORDER-BOTTOM: #0b5f98 1px solid">
<DIV
style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FLOAT: left; PADDING-BOTTOM: 1px; WIDTH: 16px; COLOR: white; PADDING-TOP: 1px; BACKGROUND-COLOR: #0b5f98">图书导读
</DIV>
<DIV
style="PADDING-LEFT: 2px; FLOAT: right; WIDTH: 670px; LINE-HEIGHT: 16pt; TEXT-ALIGN: left"><!--导读-->
<H1 id=divCurrentNode2
style="PADDING-LEFT: 2px; FONT-SIZE: 12px; WIDTH: 100%; COLOR: #b83507; TEXT-ALIGN: left">当前章节:<A
href="http://book.csdn.net/bookfiles/65/100651880.shtml"><FONT color=red>2.4
实例:HOOK管理功能的实现 </FONT></A></H1>
<DIV id=divRealteNod2 style="PADDING-LEFT: 2px">
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100651877.shtml">2.1 栈 </A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100651878.shtml">2.2 队列 </A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100651879.shtml">2.3 排序表 </A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652553.shtml">5.1.1
普通树的描述方法</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652554.shtml">5.1.2
树的操作接口设计</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652555.shtml">5.1.3
树的遍历算法</A></DIV></DIV></DIV></DIV>
<DIV class=clear> </DIV></DIV>
<DIV class=todayCommend style="WIDTH: 100%">
<DIV class=title>
<H5>同类图书推荐</H5></DIV>
<DIV class="blank6 clear"></DIV>
<DIV class=content id=divSameSort>
<LI style="FLOAT: left; WIDTH: 20%"><A title="数据挖掘原理与应用—— SQL Server 2005数据库"
href="http://book.csdn.net/bookfiles/242/"><IMG height=112
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/TS00124727__.jpg"
width=80 border=0></A>
<P><A title="数据挖掘原理与应用—— SQL Server 2005数据库"
href="http://book.csdn.net/bookfiles/242/">数据挖掘原理与应用—...</A></P></LI>
<LI style="FLOAT: left; WIDTH: 20%"><A title="Oracle PL/SQL 专家指南"
href="http://book.csdn.net/bookfiles/241/"><IMG height=112
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/TS00124725__.jpg"
width=80 border=0></A>
<P><A title="Oracle PL/SQL 专家指南"
href="http://book.csdn.net/bookfiles/241/">Oracle PL/SQL 专家指...</A></P></LI>
<LI style="FLOAT: left; WIDTH: 20%"><A title="Microsoft SQL Server2005开发指南"
href="http://book.csdn.net/bookfiles/240/"><IMG height=112
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/TS00124697__.jpg"
width=80 border=0></A>
<P><A title="Microsoft SQL Server2005开发指南"
href="http://book.csdn.net/bookfiles/240/">Microsoft SQL Server...</A></P></LI>
<LI style="FLOAT: left; WIDTH: 20%"><A title=精通SQL——结构化查询语言详解
href="http://book.csdn.net/bookfiles/235/"><IMG height=112
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/TS00124582__.jpg"
width=80 border=0></A>
<P><A title=精通SQL——结构化查询语言详解
href="http://book.csdn.net/bookfiles/235/">精通SQL——结构化查询...</A></P></LI>
<LI style="FLOAT: left; WIDTH: 20%"><A title="Oracle 10g DBA宝典"
href="http://book.csdn.net/bookfiles/188/"><IMG height=112
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/TS00123307__.jpg"
width=80 border=0></A>
<P><A title="Oracle 10g DBA宝典" href="http://book.csdn.net/bookfiles/188/">Oracle
10g DBA宝典</A></P></LI></DIV></DIV><!-- 评论 -->
<DIV class=clear></DIV>
<DIV class=todayCommend style="WIDTH: 100%">
<DIV class=title>
<H5>网友热评</H5></DIV>
<DIV class="blank6 clear"></DIV>
<DIV class=content style="OVERFLOW: scroll; WIDTH: 99%; TEXT-ALIGN: left">
<SCRIPT
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/NewsCsdnNetJsReferences.htm"
type=text/javascript></SCRIPT>
</DIV></DIV><!-- 今日推荐 -->
<DIV class=clear></DIV>
<DIV id=tagad style="TEXT-ALIGN: left">
<DIV id=csdn_zhaig_ad_yahoo style="WIDTH: 99%"></DIV>
<SCRIPT type=text/javascript>
ad_width=468;
ad_height=60;
adcss=2;
unionuser=22;
ad_type='j';
count=3;
</SCRIPT>
<SCRIPT
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/showads.js"
type=text/javascript></SCRIPT>
<SCRIPT
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/tag.js"
type=text/javascript></SCRIPT>
</DIV></DIV><!-- 页脚 -->
<DIV id=foot><IMG height=0 alt=""
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/readbook.htm"
width=0> </DIV>
<STYLE>#CFBig {
CLEAR: both; FONT-SIZE: 12px; MARGIN: auto; WIDTH: 770px; FONT-FAMILY: Tahoma, sans-serif; TEXT-ALIGN: center
}
#CFBig #CFContent {
MARGIN: auto; WIDTH: 500px; TEXT-ALIGN: center
}
#CFBig #CFContent P {
MARGIN: 2px
}
#CFBig HR {
COLOR: #4682b4; HEIGHT: 1px
}
#CFBig #CFBiaoShi {
FLOAT: right; WIDTH: 40px
}
#CFBig A:link {
COLOR: #000; TEXT-DECORATION: none
}
#CFBig A:visited {
COLOR: #000; TEXT-DECORATION: none
}
#CFBig A:hover {
COLOR: #369; TEXT-DECORATION: none
}
#CFBig A:active {
COLOR: #000; TEXT-DECORATION: none
}
</STYLE>
<!-- 页脚 -->
<DIV style="TEXT-ALIGN: center">
<DIV id=CFBig>
<HR>
<DIV id=CFContent>
<DIV id=CFBiaoShi><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
height=48 alt=""
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/BiaoShi.gif"
width=40 border=0></A> </DIV>
<P><A href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A>-<A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A>-<A
href="http://www.csdn.net/map/map.shtm">网站地图</A>-<A
href="http://www.csdn.net/help/help.asp">帮助</A>-<A
href="http://www.csdn.net/intro/intro.asp?id=9">联系方式</A>-<A
href="http://job.csdn.net/Jobs/f9c75c9f2ad14404a604669b757b9ed0/viewcompany.aspx">诚聘英才</A>-<A
href="http://www.csdn.net/english/">English</A>-<A
href="javascript:navigate('mai'%20+%20'lto:'%20+%20'webm'%20+%20'aster@c'%20+%20'sdn.n'+'et?subject=向CSDN报告问题')">问题报告</A></P>
<P>北京百联美达美数码科技有限公司 版权所有 京 ICP 证 020026 号</P>
<P>Copyright © 2000-2006, CSDN.NET, All Rights Reserved</P></DIV>
<HR>
</DIV></DIV>
<SCRIPT type=text/javascript>document.write("<img src=http://counter.csdn.net/pv.aspx?id=115 border=0 width=0 height=0>");</SCRIPT>
<SCRIPT language=JavaScript
src="2_4 实例:HOOK管理功能的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/counter.js"></SCRIPT>
<!-- /页脚 --></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -