美文网首页JS破解&&Android逆向
基于LIEF的InlineHook实现

基于LIEF的InlineHook实现

作者: 约你一起偷西瓜 | 来源:发表于2021-03-10 13:01 被阅读0次
    前言

    之前用 LIEF 最多也就是添加一个依赖so,偶然细读了一下 LIEF的文档 ,意外发现他还有一些花里胡哨的操作,比如合并段,新增导出函数,修改导出函数之类的,于是就有了这篇文章

    简介

    使用ndk编译,提供代码so,再使用lief合并代码进原始so,最后在对汇编代码稍作修改即可完成最原滋原味的inlinehook

    具体操作
    lief的基本使用
    import lief
    
    def swap(obj,sym1,sym2):
        s1 = obj.get_symbol(sym1)
        s2 = obj.get_symbol(sym2)
        temp = s2.name
        s2.name = s1.name
        s1.name = temp
    
    if __name__ == '__main__':
    
        lib_src = lief.parse("libnative-lib.so")
        lib_code = lief.parse("libcodeProvider.so")
        print(lib_code)
    
        # 互换导出函数地址
        swap(lib_src,"Java_com_lzy_lieftest_MainActivity_Test1","Java_com_lzy_lieftest_MainActivity_Test2")
    
        # libcodeProvider.so 的第二个段(包含.text节)添加进 libnative-lib.so
        segment_added = lib_src.add(lib_code.segments[1])
    
        # 合并进来的两个函数依旧为其添加导出函数(方便我们查找)
        code_test3 = lib_code.get_symbol("test3")
        code_innerCallFunctionRep = lib_code.get_symbol("innerCallFunctionRep")
        lib_src.add_exported_function(segment_added.virtual_address + code_test3.value, "test3Rep")
        lib_src.add_exported_function(segment_added.virtual_address + code_innerCallFunctionRep.value, "innerCallFunctionRep")
    
        lib_src.write("libnative-lib1.so")
    
    使用BL替换BL

    nop之间的代码就是我们正式的hook代码(ndk编译的那部分代码),这部分代码如果使用到got表的函数需要手动去修正一下,比如上截图的日志函数
    这么操作的话可拓展性就非常的大,多余的参数零时变量什么的,你都可以进入hook函数的时候去申请更大的栈空间用来存放,退出的时候也记得恢复

    使用B替换
    未修改前

    在跳走的empFunction中我们就有空位随意的写入汇编指令
    跳走之后被替换部分的汇编跳转记得手动修复一下跳转地址

    上文中举例的Demo so很小,所以直接就用bl/b跳转,但是这里需要注意Arm的B系列指令跳转范围只有±32MB,Thumb的B系列指令跳转范围只有±256字节,所以遇到实际问题往往so都是比较大的,考虑使用ldr pc来进行跳转,参考inlinehook的这篇文档http://ele7enxxh.com/Android-Arm-Inline-Hook.html

    使用 add pc 替换任意位置

    这里简单的讲解一下0xdf34的值是怎么算的:
    代码执行到0xdf30时,pc的值应该是等0xdf38,所以0xdf34位置的值应该是 0x40b3c - 0xdf38

    总结

    用到lief做这样的inlinehook,目前还没有发现有什么好的实际用处,但是可以帮我们用实践去更好的理解inlinehook的原理,很多东西看着简单,一看就懂,但是真的自己做起来才会发现细节多坑,实践大于理论 ...

    相关文章

      网友评论

        本文标题:基于LIEF的InlineHook实现

        本文链接:https://www.haomeiwen.com/subject/ugrkqltx.html