将功能插入二进制应用程序(3d方,闭源)的最佳方法是什么.
目标应用程序在OSX上,似乎是使用gcc 3+编译的.我可以看到二进制文件中实现的函数列表,并调试和隔离了一个我想远程调用的特定函数.
具体来说,zoomByFactor(x,y)
当我从复杂的HIDevice接收某些数据时,我想调用这个函数 - 让它称之为void .
我可以轻松地将指令修改或注入二进制文件本身(即,修补不需要仅在RAM中进行).
作为一种"很好"的方式,你会推荐什么?
编辑:
我确实需要整个申请.所以我不能抛弃它并使用库.(对于那些需要道德解释的人:这是一个专有的CAD软件,其公司网站自2006年以来一直没有更新.我已经支付了这个产品(相当多的钱,实际上是什么)并且有项目我不能轻易从中迁移出来的数据.该产品很适合我,但我想使用我最近得到的新HID.我已经检查了应用程序的内部,我相当自信我可以用相关数据调用正确的函数并使其正常工作).
这是我到目前为止所做的,而且非常好.
我已经通过这个过程修改了部分应用程序:
xxd -g 0 binary > binary.hex cat binary.hex | awk 'substitute work' > modified.hex xxd -r modified.hex > newbinary chmod 777 newbinary
我正在做这种跳过箍,因为二进制几乎是100兆大.
我想的是我在主应用程序循环中的某个地方jmp,启动一个线程,然后返回main函数.
现在,问题是:我在哪里可以插入新代码?我需要修改符号表吗?或者,我怎样才能自动加载dylib,以便我需要做的唯一"黑客攻击"是将对正常加载的dylib的调用插入到main函数中?
对于那些对我最终做的事感兴趣的人,这是一个总结:
我看了几种可能性.它们属于运行时修补和静态二进制文件修补.
就文件修补而言,我基本上尝试了两种方法:
修改二进制代码段(__TEXT)中的程序集.
修改mach头中的load命令.
第一种方法需要有可用空间,或者可以覆盖的方法.它还具有极差的可维护性.任何新的二进制文件都需要再次手动修补它们,特别是如果它们的源代码稍微改变了.
第二种方法是尝试将LC_ LOAD_ DYLIB条目添加到mach头中.那里没有很多马赫编辑器,所以它很毛茸茸,但我实际上修改了结构,以便我的输入可见otool -l
.但是,这实际上并不起作用,因为有一个dyld: bad external relocation length
在运行时.我假设我需要使用导入表等进行处理.如果没有编辑器,这就太费力了.
第二条路径是在运行时注入代码.没有太多可以做到这一点.即使对于您可以控制的应用程序(例如,您启动的子应用程序).也许有一种方法可以fork()
启动初始化过程,但我从来没有这样做过.
有SIMBL,但这需要你的应用程序是Cocoa,因为SIMBL将构成一个系统范围的InputManager并选择性地加载bundle.我驳回了这个,因为我的应用程序不是Cocoa,而且,我不喜欢系统范围的东西.
接下来是mach_inject和mach_star项目.在google上还有一个名为PlugSuit的新项目,它似乎只是一个围绕mach_inject的薄包装.
Mach_inject提供了一个API来完成名称所暗示的.我确实在代码中发现了一个问题.在10.5.4中,mach_inject.c文件中的mmap方法要求使用MAP_READ或MAP_READ,否则mmap将失败.
除此之外,整个事情实际上与宣传的一样.我最终使用mach_ inject_ bundle来做我想要做的事情,将DYLIB静态添加到mach头:即在模块init上启动一个执行其脏业务的新线程.
无论如何,我把它变成了维基.随意添加,更正或更新信息.在OSX上几乎没有关于此类工作的信息.信息越多越好.