前段时间花了一个星期时间马马虎虎算是对汇编入了门吧(好吧,其它我还是什么都不懂),最近又开始对汇编有点兴趣了,于是想试下反汇编的感觉并尝试自己修改下指令
据
说对一个程序反汇编后再修改的方法是以十六进制的方式打开程序,然后再通过一些工具找到相关的位置再用相关工具计算出偏移量等然后再做修改,不过我从来没
搞过反汇编,对汇编也是一知半解的样子,所以就没那么专业了,至于能不能直接使用汇编的助记符修改我还不知道,估计应该是有这样的工具吧,不过我没搜索
过,所以只尝试下十六进制下以汇编指令的十六进制形式进行修改了,如果有那样的修改方法我希望你能够告诉我,谢谢
在linux下反汇编我们可以使
用gdb这个调试器也可以使用objdump这个工具,当然还有其它工具,不过这里我就不说了,然后用十六进制打开文件我们可以使用xxd,我们通过在
vim内部调用xxd来对文件进行十六进制模式下修改,当然还有其它的十六进制编辑器,这里我也就不说了,因为我也就是玩玩,毕竟最近还在学习Win32
API(我真蛋疼),下面就从一个简单的程序开始吧
这
是我们使用xxd打开后的十六进制形式,我们打开我们要修改的指令处,怎么找你应该看得出来吧,使用vim自身的查找功能,很简单的,然后我们就可以进行
修改了,将我们的e9 d2 ff ff ff替换掉后面的b8 00 00 00
00(这个还是替换掉好,虽然我这里是先替换然后在后面将先前指令再补上去的,但是这是因为我们的程序后面有大量的nop指令,所以可以覆盖,但是如果没
有的话那么如果我们直接在里面添加的话会导致程序一团乱,这个大家自己可以亲身体会下
修改完成后我们再
:%!xxd -r
其它的命令和前面一样,-r参数表示我们修改完后回到上一层,也就是我们刚用二进制形式打开可执行文件的那种状况,当然现在已经是被我们修改过后的程序了,当然不要忘记保存,不保存也是瞎忙活了
现在我们再次执行一下程序看看效果
下面我们再反汇编一下这个已经被我们修改过的文件看下,我们可以看出来我们在主函数中调用printf函数指令后的指令正是一个跳转指令,我们可以看到它后面要跳到的地址,正确无误
好了,到这里就全部结束了,如果你有时间去折磨和研究你可以试试修改为其它的指令来达到不同的目的,甚至于搞一些破坏,破解什么的
转自:http://blog.163.com/lixiangqiu_9202/blog/static/535750372012727102618226/
原文:http://www.cnblogs.com/IceSword-syy/p/3940611.html