logo资料库

IDApro反汇编程序教程.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
示例程序
运行IDA Pro
定位代码片断
修改程序文件
参考资料:
https://www.cnblogs.com/vento/archive/2013/02/09/2909579.html 利用 IDApro 反汇编程序 IDA Pro 是一款强大的反汇编软件,特有的 IDA 视图和交叉引用,可以方便理解程序逻辑 和快速定位代码片断,以方便修改。 IDA 视图 示例程序 下面会通过修改示例程序的输出字符串,来讲解如何使用 IDA Pro。 #include main() { int n; scanf ("%d",&n); if (n > 0) printf("a > 0"); //后面会用 IDA Pro 把'a'改成'n' else printf("n < 0"); } 编译后的程序下载:demo 运行 IDA Pro 运行 IDA Pro,并使用 PE 文件的方式打开示例的 test.exe 文件。IDA Pro 会新建一个工 程,并开始反汇编程序。反汇编完成后,在[IDA-View]窗口中,可以看到程序逻辑的树形 图,如下:
树形图把条件分支清晰地显示出来了,绿色线连着的表示条件为 true 时执行的逻辑,而红 色线表示条件为 false 时执行的逻辑。右下角有 IDA 视图的缩略图,在上面点击可以快速 定位到视图的指定位置。 IDA 的工具栏有几个按钮对定位代码很重要,如下图所示: 从左到右分别是: Open exports window:打开导出窗口 Open import window: 打开导入窗口 *Open names window:函数和参数的命名列表 *Open functions window:程序调用的所有函数窗口 *Open strings window: 打开字符串显示窗口, 会列出程序中的所有字符串,该窗口有助于你通过程序的运行输出逆向找出对应的代码片断。 定位代码片断 假设我们现在接到个任务,需修正程序,把输出“a > 0”修正为“n > 0”。示例程序比较简 单,直接看 IDA 视图我们就能找到需修改的代码片断,但实际处理时,可能程序有几 m 大, 通过一个个看 IDA 视图已没法有效找到相关的执行代码片断,这时怎么办? 使用字符串窗 口和 IDA 强大的交叉引用! 点击工具栏的[Open strings windows] (视图-打开子视图- 字符串)按钮,可以看到如下的程序字符串: 程序的字符串较少,可以很快地看到我们需要的字符串“a > 0”在数据段 00403003 位置。 假如字符串多到已不能肉眼定位查找,因为字符串窗口是没有查找功能的,这时需要借助其 他的文本编辑器,如 notepad,editplus 等。在字符串窗口内右键,选择菜单[copy]命令, 会把字符串窗口的所有内容复制到剪贴板,再粘贴到记事本中查找就可以了。 双击字符串 窗口的该行字符串,会跳转到 IDA 视图的 00403003 位置,如下图所示: 该位置的字符串后面会注释有 DATA XREF 的字样,这是程序中引用到该字符串的代码片 断的地址!在该行上右键,选择[Jump to cross reference...] (交叉引用列表)项,会立 即跳转到引用该字符串的代码片断位置!
最后定位的代码片断 上图显示的汇编指令即是我们要找的代码片断,这时点击[Hex View-A] (视图-打开子视图-十六进制转储)窗口,再去第一步的字符串窗口双击下 a>0 行,会切换到二进制浏览模式,并高亮了汇编代码的二进制格式指令,如下图所示: 已找到需修改的代码片断,剩下的只需把 a 改成 n。 修改程序文件 在 IDA 中,可以在[Hex View-A]窗口右键选择[Edit]来修改二进制指令。修改后通过右键 选择[Commit Change] (应用更改)可以看到修改后的 IDA 视图。但需要注意的是,这种 方式的修改并不会更新原始程序文件,实际只是修改了 IDA 的项目文件!IDA 中只适合做 一些验证性的修改,确保正确后再使用其他工具修改原始程序文件。 在 IDA 中验证修改正 确后,可以使用 UltraEdit 或 Hex Workshop 来修改原始程序文件。下面会以 UltraEdit 为例来说明如何修改。 用 UltraEdit 文件-打开.exe 程序文件,UltraEdit 会以 16 进制模式显示程序文件。 UltraEdit 显示的地址和 IDA 显示的地址是不同的,为了找到对应代码片断在 UltraEdit 中的实际地址,需要使用到 UltraEdit 的查找功能。在 IDA 中复制需修改的 16 进制模式显 示的指令,在 UltraEdit 中打开查找,粘贴并查找该 16 进制字符串,UltrEdit 会很快定位 到该指令处,如下图所示: 在 IDA 中使用右键来复制(或 ctrl+c)
在 UltraEdit 右键-查找 找到了 UltraEdit 的对应位置 现在我们要把“a > 0”改成“n > 0”,a 对应的 ASCII 码是 61,而 n 对应的 ASCII 码是 6E,只需把 61 改成 6E 就可以了,修改后保存。 再次运行,可以看到结果已改变! 示例只是修改了字符串,只需更改数据段内容就可以了,不用更改指令。假如需要更改指令, 需要参考< a href="http://courses.engr.illinois.edu/ece390/resources/opcodes.html#Main" >8086 指令操作表写出对应指今的 16 进制形式,再修改。 参考资料: http://blog.csdn.net/liquanhai/article/details/5479141 http://www.youtube.co m/watch?v=Gl2S0YPRb9shttp://www.woodmann.com/crackz/Tutorials/Flores1. htm http://courses.engr.illinois.edu/ece390/resources/opcodes.html#Mainhttp: //faydoc.tripod.com/cpu/conventions.htm
分享到:
收藏