Loading... > 本篇是关于《IDApro权威代码破解揭秘》的笔记。主要是一些IDA的实战技巧。 > 这部分由于涉及到调试的部分,我就不截图了。写一些要点。 ## 建立缓冲区 在IDA中,连续分配的局部变量,IDA默认都是一个一个分配的,这就导致如果是一个数组的话,识别起来会很困难,导致代码被曲解。方法是建立缓冲区。指定数组的首地址和大小,IDA便能自动进行优化,从而将很多零散的局部变量转换成基地址加偏移量的数组形式。 ## 断点 关于断点的内容,之前也写过。 [断点](http://cjynet.top/2017/10/10/python-learning/python-code-for-hacker/) ## hash寻找DLL 类似于一个windows的shellcode,例如对kernel32.dll的导出表进行遍历,同时对名字进行散列,与已知的散列值进行匹配,可以查找像`LoadLibrary()`、`GetProcAddress()`等函数的地址。详细说明可以Google[Skape. Understanding Windows Shellcode](https://www.google.com/search?newwindow=1&source=hp&ei=DoukWtOcM8fqjwO-k4G4Cw&q=Skape.+Understanding+Windows+Shellcode&oq=Skape.+Understanding+Windows+Shellcode&gs_l=psy-ab.3..35i39k1j0i8i10i30k1.634.634.0.942.2.1.0.0.0.0.300.300.3-1.1.0....0...1.1.64.psy-ab..1.1.299.0...0.SvzOoyuf560) ## hit marking 关于bin的流程分析,最常用的分析方式是hit marking。即记录对每个消息的判断树的调用路径,在每次函数或块的开始设置断点。当断点被触发时,记下访问顺序,同时让程序继续运行到下一个块。最后把触发断点的列表进行排序得到hit list,通过list中的函数,我们可以拼凑出消息的结构。 ### 编写hit marking 插件 主要就是掌握下IDApython脚本的编写,这部分以前也有学习过,不过没有系统学习,idapython的资料也比较少,可以Google[The Beginner's Guide to IDAPython](https://www.google.com/search?newwindow=1&ei=DemlWrn2FY_ujwPHlZPAAg&q=The+Beginner%27s+Guide+to+IDAPython&oq=The+Beginner%27s+Guide+to+IDAPython&gs_l=psy-ab.3...2939.2939.0.3567.1.1.0.0.0.0.0.0..0.0....0...1.1.64.psy-ab..1.0.0....0.fy73xpAo8kY) 关于内置的跟踪功能,使用idapython编写脚本进行自动化分析。下面给出书上的列题代码,但是我是试过之后,发现只设置了断点,而断点并没有启动,有点问题,而且每一个断点没有记录断点的经过次数,而这方面的资料比较少,目前我还不知道是怎么回事。 ```python # coding:utf-8 __author__='zjgcjy' from idaapi import * def test(): for i in xrange(get_func_qty()): f = getn_func(i) print "Function %s at 0x%x " % (GetFunctionName(f.startEA), f.startEA) add_bpt(f.startEA, 1, 4) SetBptAttr(f.startEA, BPTATTR_FLAGS, BPT_ENABLED | BPT_TRACE) # 这里必须设置BPT_ENABLED,否则没有作用。 print "[*] Set %d breakpoints." % GetBptQty() #for i in xrange(get_func_qty()): # b =bpt_t() # getn_bpt(i, b) # b.flags ^=BPT_BRK # b.flags |=BPT_TRACE # update_bpt(b) def main(): test() if __name__ == '__main__': main() ``` 主要的问题就是没有生成hit list,依然不知道函数或模块调用的次数,只有在断点列表中可以找到。在《IDApro权威指南》中也没有找到相应的说明。-\_- 附上第二个脚本,使用hook进行实时调试。可以自动定义FuncPath类中的处理函数。 ```Python # coding:utf-8 __author__='zjgcjy' from idaapi import * from idautils import * from idc import * count = 0 # 从DBG_Hooks类继承 class FuncPath(DBG_Hooks): # 断点处理函数 def dbg_bpt(self, tid, ea): global count count += 1 print "[*] Hit: 0x%08x the %d time" % (ea, count) # # # # return 1 # 移除先前的调试 try: if debugger: print("Removing previous hook ...") debugger.unhook() except: pass # 建立一个对象 debugger = FuncPath () # 将钩子装入IDA内建调试器 debugger.hook() current_addr = ScreenEA() # 遍历函数设置跟踪断点 for function in Functions(SegStart( current_addr ), SegEnd( current_addr )): AddBpt( function ) SetBptAttr( function, BPTATTR_FLAGS, BPT_ENABLED|BPT_TRACE) num_breakpoints = GetBptQty() print "[*] Set %d breakpoints." % num_breakpoints ``` ``` ``` Last modification:January 16th, 2021 at 01:36 pm © 允许规范转载 Support 确定不打赏一下支持博主吗 ×Close Appreciate the author Sweeping payments Pay by AliPay