一、對section header進行混淆
由於linker不會對section header進行加載,所以對section header進行改動,不會影響so文件正常加載到內存,因此有些程序對section header進行了混淆,導致IDA無法正常進行靜態分析。
混淆方法:
1.將section header table中的addr、offsize等字段值清0,如果清空的是dynsym段,就會使IDA無法找到函數符號
2.對section header中的name字段進行修改,可以更改段名
二、對Program header進行混淆
linker在加載so文件的時候會用到LOAD段,但是沒有直接用到其他段的數據,比如說Dynamic段中的數據,在linker源碼中會通過switch的方式對Dynamic中的字段進行賦值,也就是說如果對Dynamic中的字段進行復制混淆一樣不會影響linker進行加載,因爲同樣的字段,後面的會覆蓋前面的,但這樣的靜態混淆有個明顯的缺陷,同字段的值,一定是最後一個是有效的。
三、so文件的修復
3.1 最簡單的修復方式
如果elf header中的section header offset是一個異常的值,IDA加載時會報錯,並且無法正常的靜態分析
最簡單的修改方法是將以下幾個值清0,這樣IDA就不會報錯,但是修復的程序非常有限
3.2 手動修復
雖然section header的addr完全清0了,但是恢復並不是沒有辦法
section header的0段addr和off永遠是0。
sectioin header的1段size是0x13,對比Program header的INTERP段可以看出,它的size也是13,就可以猜測對應的是INTERP段,所以section header的1段addr和offset是0x134
有了1段的addr和offset就可以根據size和align計算出下一個段的addr和offset
計算到段13的時候,發現0x8b88+340=0x8ec8,這時候根據LOAD段,可以得知它的地址其實應該包含到第二個LOAD段中了,它的offset是9da8,addr是ada8
當修正到段[23]時,修改值是45da4,第二個LOAD段的offset+filesize=45da4,所以下面的段[24]的修正需要採用另一種方法
注意到這個段的類型是NOBITS,它的段名應該是.bss,而bss的後面的段是comment段
可以看到comment段和bss段的offset是一樣的
所以修改如下
對address的修正
最後幾個address爲0
在010中找到對應的字段全部修正,保存,再用IDA打開。
修復前
修復後