全球旧事资料 分类
的是它的稳定性。这类工具如果不稳定,反而会忙里添乱。到底是出自鼎鼎大名的NuMega,我用下来基本上没有什么大问题。r
r
r
浅谈内存泄漏(三)r
r
使用Bou
dsChecker检测内存泄漏:r
r
Bou
dsChecker采用一种被称为CodeI
jectio
的技术,来截获对分配内存和释放内存的函数的调用。简单地说,当你的程序开始运行时,Bou
dsChecker的DLL被自动载入进程的地址空间(这可以通过systemlevel的Hook实现),然后它会修改进程中对内存分配和释放的函数调用,让这些调用首先转入它的代码,然后再执行原来的代码。Bou
dsChecker在做这些动作的时,无须修改被调试程序的源代码或工程配置文件,这使得使用它非常的简便、直接。r
r
r
r
这里我们以malloc函数为例,截获其他的函数方法与此类似。r
r
r
r
需要被截获的函数可能在DLL中,也可能在程序的代码里。比如,如果静态连结CRu
timeLibrary,那么malloc函数的代码会被连结到程序里。为了截获住对这类函数的调用,Bou
dsChecker会动态修改这些函数的指令。r
r
r
r
以下两段汇编代码,一段没有Bou
dsChecker介入,另一段则有Bou
dsChecker的介入:r
r
126_CRTIMPvoid__cdeclmallocr
r
127size_t
Sizer
r
128r
r
129r
r
00403C10pushebpr
r
00403C11movebpespr
r
130retur
_
h_malloc_dbg
Size_
ewmode_NORMAL_BLOCKNULL0r
r
00403C13push0r
r
00403C15push0r
r
00403C17push1r
r
00403C19moveax__
ewmode0042376cr
r
00403C1Epusheaxr
r
00403C1Fmovecxdwordptr
Sizer
r
00403C22pushecxr
r
00403C23call_
h_malloc_dbg00403c80r
r
00403C28addesp14hr
r
131r
r
r
r
以下这一段代码有Bou
dsChecker介入:r
r
126_CRTIMPvoid__cdeclmallocr
r
127size_t
Sizer
r
128r
r
129r
r
00403C10jmp01F41EC8r
r
00403C15push0r
r
00403C17push1r
r
00403C19moveax__
ewmode0042376cr
r
00403C1Epusheaxr
r
00403C1Fmovecxdwordptr
Sizer
r
00403C22pushecxr
r
00403C23call_
h_malloc_dbg00403c80r
r
00403C28addesp14hr
r
131r
r
r
r
r
r
r
当Bou
dsChecker介入后,函数malloc的前三条汇编指令被替换成一条jmp指令,原来的三条指令被搬到地址01F41EC8处了。当程序进入malloc后先jmp到01F41EC8,执行原来的三条指令,然后就是Bou
dsChecker的天下了。大致上它会先记录函数的返回地址(函数的返回地址在stack上,所以很容易修改),然后把返回地址指向属于Bou
dsChecker的代码,接着跳到malloc函数原来的指令,也就是在00403c15的地方。当malloc函数结束的时候,由于返回地址被修改,它会返回到Bou
dsChecker的代码中,此时Bou
dsChecker会记录由malloc分配的内存的指针,然后再跳转到到原来的返回地址去。r
r
r
r
如果内存分配释放函数在DLL中,Bou
dsChecker则采用另一种方法来截获对这些函数的调用。Bou
r
好听全球资料 返回顶部