如何将一个导入的函数添加到现有的Android SO库中?

时间:2016-09-19 20:09:36

标签: android import shared-libraries elf

我目前正在为现有的SO库(适用于Android的GTA SA)开发SO插件加载程序。 Android上的SO库是Unix ELF文件。 没有库的源代码我不能简单地在源代码中添加导入的函数并再次编译SO库。

有libGTASA.so,我想编辑和修改导入表,添加一个新符号RunSOpluginLoader,它将在libFastman92pluginLoader.so中实现,它已经在加载libGTASA.so之前加载,由Java代码( classes.dex)我也修改了。

对于Windows上的EXE文件,有很多程序可以编辑导入,我会使用LordPE。 对于ELF文件,我需要一个不同的解决方案,但是我找不到它。

我尝试使用HT编辑器,它应该打开并编辑ELF文件,但是在HT编辑器中打开libGTASA.so后几秒钟,应用程序就会崩溃。

我需要一个解决方案来向SO库添加导入,最好是在Windows上运行的解决方案,但如果没有,那么我愿意在Linux系统上进行。

正确添加导入后,我将在libGTASA.so中编辑一些ARM代码,以实际调用新导入的函数。

本质:
libGTASA.so - 我想在这个文件中添加一个导入的符号RunSOpluginLoader。

1 个答案:

答案 0 :(得分:0)

在我写完问题后的几天,我想出了如何完成这项任务。 我在C ++和程序中编写了一个简单的ELF文件管理器类,它执行以下操作:

  • 加载ELF文件 - 创建标题,部分和程序段的表示,动态表(由PT_DYNAMIC指出)
  • 添加了新部分(.fastman92_code,权限为RWX)
  • 添加了涵盖新部分的新计划细分
  • 我注意到程序段必须对齐,我对齐了32768并且它有效。
  • 将新字符串添加到字符串表(由this-> header.e_shstrndx指向),字符串" fastman92.code",它是节名称。
  • 部分被重新定位并将在文件末尾写入,elfManager.header.e_shoff必须更新。
  • 重新定位.dynstr(DT_STRTAB指向的部分),向其添加两个importedentries:
    {" libFastman92pluginLoader.so"}, {" ProcessPluginLoading"}
  • 重新定位.dynsym,将这两个条目添加到数组中。
  • 来自动态表的DT_JMPREL指向的重新分配部分,在我添加的Jni_OnLoad函数附近添加了一个指向ProcessLoadingPlugin的条目
  • 重新定位了程序段,添加了PT_DYNAMIC条目,这是必要的,因为程序段是第一个可加载段的一部分。它们不再是虚拟地址为0x0的段的一部分。
  • 添加了一个简单的函数,替换了Jni_OnLoad,它将调用导入的符号ProcessPluginLoading,它在libFastman92pluginLoader.so中实现,然后从.init_array执行函数,然后调用real作为原始的Jni_OnLoad。符号" Jni_OnLoad"必须指出我的一些功能。
  • 编辑动态表,添加DT_NEEDED,字符串偏移量指向" libFastman92pluginLoader.so"
  • 编辑动态表,禁用.init_array,将其大小设置为零(InitArraySzIt-> d_un.d_val = 0;)其中auto InitArraySzIt = elfManager.FindFirstEntryInDynamicTableWithTag(0x1B);
  • 保存新的.so文件

如果您想了解更多信息或获取代码,请随时与我联系。