首页
社区
课程
招聘
5
[原创]基于LIEF实现InlineHook
发表于: 2021-3-10 17:31 10237

[原创]基于LIEF实现InlineHook

2021-3-10 17:31
10237

前言

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

简介

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

具体操作

lief的简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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")


 

由上脚本合并so的代码段
下面介绍一下三种inlinehook姿势


使用BL替换BL

 

 

 

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

使用B替换

 

 


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2021-3-10 18:14 被唱过阡陌编辑 ,原因:
收藏
免费 5
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-30 08:47
灯-等灯等灯~
为你点赞~
2021-11-5 16:57
crackwiki
为你点赞~
2021-4-8 23:42
alienhe
为你点赞~
2021-3-18 11:15
_air
为你点赞~
2021-3-10 23:53
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册