so中节加密
c语言处理文件格式写好写点:
注意点:
- 加密时遍历节找到名字(存的是相对于字串节的地址偏移)加密,并将节偏移存到头的节偏移处,节大小和页数存到头的入口点处,为了方便解密时查找,同时这俩项对so加载无用。破坏section,但可从p节读出结构。
- 解密函数在init中解密,用属性声明为特殊段,init执行时文件已经加载,可以修改。
- linker等native的加载源码需要熟
- 头、节等都是基于装载地址映射的,节等按头加载,代码和数据用重定位定位。因此修改节内数据、节数据、头数据只要文件偏移+装载地址即可。
- c语言对文件格式读取与细节处理比java来的方便。清晰
- 操作步骤:写好so与解密函数,编译后用加密程序处理。
加密代码c:
解密代码:
so中函数加密
so函数:(被用)
过程:符号表导出->函数代码
保护:导出符号不可改->hook->加密代码
看下linker过程,有漏洞可以更强加密说不定
思路1:根据dynsym与dynstr定位到需要的函数地址,加密,解密时直接用指针函数就行。指针函数引用的地方会被重定位到dynsym指定地点(已经加载好的符号),所以解密方便。全局符号表先收集符号再重定位。
书中思路:根据dyn中的hash(用于快速导出)找到指定函数加密。
加密:
解密:书中的麻烦了,直接用指针函数就行。
参考http://xn--74q78i15hxv3arigm4e.cn/2018/06/29/android%E5%BA%94%E7%94%A8%E5%8A%A0%E5%9B%BA2/
修改导出:加载后,用符号表找到导出符号,修改其value。外部引用是先查符号表的。(不是看全局符号表?用时才加?如果查的是加载好的全局表应该改节无用)
修改导入:是改got表内的值。