在网上找了好久的获得函数大小方法,也没找到很好的方法,在看雪论坛上看的也就是递归找返回点,将所有返回插入一个链表,然后根据最下面的返回点确定函数末尾得到大小。
还有同学一直说的可以遍历符号文件pdb来得到函数大小,我也没有尝试过-_-
最近在看IDA Pro权威指南,刚好看到IDC脚本,当发现可以通过脚本语言函数 GetFunctionAttr(addr,FUNCATTR_END) 得到函数结束地址,真的是特别兴奋,因为困惑好久的问题终于解决了,就是检测InLine的时候该检测多少字节,网上的方法大多都是检测前5个字节,但是很多杀软的hook点都在函数中间的很猥琐的地方,但是PC Hunter又能检测出来,应该是通过函数大小比较的。
将Ntoskrnl.exe拖入IDA之后,按Shift+F2,打开IDC脚本界面,写入下面的这段脚本
1 #include<idc.idc> 2 static main() 3 { 4 auto addr,end,name,number; 5 addr = 0; 6 for(addr = NextFunction(addr);addr != BADADDR ; addr = NextFunction(addr)) 7 { 8 name = Name(addr); 9 end = GetFunctionAttr(addr,FUNCATTR_END); 10 number = end-addr; 11 Message("L\"%s\",%x\n",name,number); 12 } 13 }
这样,就能在输出界面打印各个函数的名称和大小了,这里由于没有找到比较字符的函数,所以打印的是所有ntoskrnl.exe函数的大小和名称,如果 要找SSDT函数就要自己一个个去找了。
越用IDA越觉得这款反汇编引擎的强大,继续努力吧。
时间: 2024-11-03 22:05:28