假设有一个包含sprintf()的错误程序,我想将其更改为snprintf,所以它没有缓冲区溢出。我如何在IDA中执行此操作?使用IDA修补EXE
回答
你真的不想使用来自IDA pro的信息进行这种改变。
尽管IDA的反汇编质量相对较高,但其质量不足以支持可执行重写。将调用转换为sprintf以调用snprintf需要将新参数推入堆栈。这需要引入一条新的指令,这会影响可执行映像中所有跟随它的EA的EA。更新这些有效地址需要非常高质量的拆卸。特别是,你需要能够:
- 确定可执行哪些地址数据,以及哪些代码
- 确定哪些指令操作数的符号(地址引用)和指令操作数是数字。
Ida不能(可靠地)给你这些信息。另外,如果可执行文件与crt静态链接,它可能不包含snpritnf,这将使手动执行重写变得非常困难。
有几种潜在的解决方法。如果在进行调用的函数中(或之后)有足够的填充,则可能只能重写单个函数。或者,如果您有权访问对象文件,并且这些对象文件是使用/ GY开关编译的(假设您使用的是Visual Studio),那么您可能能够编辑该对象文件。但是,编辑目标文件可能仍然需要大量修复。
但是,如果您有权访问目标文件,那么您可能也有权访问源代码。改变来源可能是你最好的选择。
不需要在任何接近该功能的地方提供可用空间,只要您可以在某处找到(或制作)一些空间在适当的章节中,您可以用JMP将原始函数中的某些内容替换为您的新指令序列。但是,说实话,OllyDbg如何做到这一点更容易。 – SamB 2010-07-15 19:30:04
你是对的..你不一定需要在功能附近有空间。但我不会主张频繁做,因为这可能会对业绩产生不利影响(地区差)。对于一个打电话给sprintf的人来说,这没关系。但是,如果你有很多打电话给sprintf的话,那么你不想在整个地方引入一堆疯狂的跳跃。 – 2010-07-16 02:23:51
- 1. 用IDA修补iphone calculator.app进行测试
- 2. 如何使用IDA/pro修补iPhone应用程序?
- 3. IDA Pro CommandLine补丁程序
- 4. 使用纯WIX修补
- 5. 创建使用IDA
- 6. 使用方法修补程序覆盖类修补程序(修饰符)
- 7. IDA Pro的汇编指令修改
- 8. 如何使用unittest修补方法io.RawIOBase.read?
- 9. 使用模拟修补功能
- 10. 被修补
- 11. 使用Java修改exe资源?
- 12. 使用C#EXE修改不同C#EXE文件的资源
- 13. 更改修补程序中的文件名或编辑修补程序,使修补程序保持有效
- 14. 寻找一个修补程序实用程序可以生成exe文件
- 15. 编辑(补丁)在IDA的二进制文件临
- 16. 如何使用修复bug的修补程序
- 17. 修补程序datetime.timedelta.total_seconds
- 18. 修补流星default_connection
- 19. Lua + SWIG Monkey修补
- 20. 修补红宝石
- 21. Esky修补程序
- 22. 修补程序/修补程序的构建和交付方法
- 23. MSI修补程序未针对修补版本(错误2356)
- 24. 要在Android中创建九个可修补的修补程序?
- 25. 如何在Windows上完成修补MQ修补程序
- 26. 使用ida pro提取函数
- 27. 如何在IDA中使用JMP?
- 28. 为什么bds.exe大地址感知和dcc32.exe不是?我可以修补dcc32.exe头,它可以工作吗?
- 29. 修补程序错误:“检测到未反向的修补程序!跳过修补程序。”
- 30. 避免修补程序命令询问要修补哪个文件“文件修补”错误
这是一个相当大的改变,因为你需要改变整个调用堆栈...你试图与开发者交谈吗? – kennytm 2010-02-20 06:39:22
我的项目并未停止,我想修复这个错误以保护我自己 – 2010-02-22 04:12:30