簡體   English   中英

如何在現有的Android SO庫中添加一個導入的函數?

[英]How to add one imported function to existing Android SO library?

我目前正在為現有的SO庫(適用於Android的GTA SA)開發SO插件加載程序。 Android上的SO庫是Unix ELF文件。 沒有該庫的源代碼,我不能簡單地在源代碼中添加導入的函數並再次編譯SO庫。

有一個libGTASA.so,我想編輯和更改導入表,添加一個新符號RunSOpluginLoader,該符號將在libFastman92pluginLoader.so中實現,該文件已由Java代碼(classes.dex ),我也進行了修改。

對於Windows上的EXE文件,有很多程序可以編輯導入,我會使用LordPE。 對於ELF文件,我需要一個不同的解決方案,但是在尋找解決方案時遇到了麻煩。

我嘗試使用HT編輯器,它應該打開並編輯ELF文件,但是libGTASA.so在HT編輯器中打開幾秒鍾后,應用程序便崩潰了。

我需要一個解決方案以將導入添加到SO庫,最好是可以在Windows上運行的解決方案,但是如果沒有解決方案,那么我願意在Linux系統上進行。

正確添加導入后,我將在libGTASA.so中編輯一些ARM代碼,以實際調用新導入的函數。

實質上:
libGTASA.so-我想將導入的符號RunSOpluginLoader添加到此文件。

在我寫了問題的幾天后,我就知道了如何完成這項任務。 我已經用C ++和程序編寫了一個簡單的ELF文件管理器類,該類執行以下操作:

  • 加載ELF文件-創建標題,節和程序段,動態表的表示(由PT_DYNAMIC指向)
  • 添加了新部分(.fastman92_code,具有RWX權限)
  • 添加了涵蓋新部分的新程序段
  • 我注意到程序段必須對齊,我對32768進行了對齊,然后它起作用了。
  • 在字符串表(由this-> header.e_shstrndx指向)中添加了新字符串,字符串“ fastman92.code”,這是節名。
  • 節被重新分配並將寫入文件的末尾,必須更新elfManager.header.e_shoff。
  • 重新分配.dynstr(DT_STRTAB指向的部分),向其中添加兩個導入的條目:
    {“ libFastman92pluginLoader.so”},{“ ProcessPluginLoading”}
  • 重新分配.dynsym,將這兩個條目添加到數組中。
  • 動態表中DT_JMPREL指向的重新分配部分,在我添加的Jni_OnLoad函數附近添加了一個條目以指向ProcessLoadingPlugin
  • 重新分配的程序段,則添加了PT_DYNAMIC條目,這是必要的,因為程序段較長,是第一個可裝入段的一部分。 它們不再是虛擬地址為0x0的段的一部分。
  • 添加了一個簡單的函數,替代了Jni_OnLoad,它將調用導入的符號ProcessPluginLoading,該函數在libFastman92pluginLoader.so中實現,然后從.init_array執行函數,然后真正調用原始的Jni_OnLoad。 必須將符號“ Jni_OnLoad”指向我的幾個函數。
  • 編輯動態表,添加了DT_NEEDED,其字符串偏移量指向“ libFastman92pluginLoader.so”
  • 編輯的動態表,禁用.init_array,將其大小設置為零(InitArraySzIt-> d_un.d_val = 0;),其中自動InitArraySzIt = elfManager.FindFirstEntryInDynamicTableWithTag(0x1B);
  • 保存一個新的.so文件

如果您想了解更多信息或獲取代碼,請隨時與我聯系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM