首页
社区
课程
招聘
[原创]inlineHook学习分析
发表于: 2018-4-3 12:52 16863

[原创]inlineHook学习分析

2018-4-3 12:52
16863

最近在应聘某大厂的安全岗位时,面试官问到了一些有关hook的知识, 在简单分析了下F8和ele7enxxh大牛的开源代码之后, 有了这篇文章.

本文引用了f8left和ele7enxxh两位大牛项目中的一些代码.还有部分代码引用自substrate项目.

文章:

项目:

MainActivity:

我们会将会测试Hook 这个"stringFromJNI()"函数.

在native层, 我们的main.cpp中

会在JNI_OnLoad中有一个init函数

在Hook.cpp我们来看一下init函数:

可以看到, 我们实例化了一个FAInHook对象, new FAInHook().

并调用了registerHook函数来注册对getStr的hook.

我们在使用是还会用到的doInHook:

现在可以看到, 我们主要的任务就是分析registerHookdoInHook这两个函数的实现.

我们现在主要分析registerHook函数.

先来分析参数:
在Hook之前我们首先要注册这个函数

函数申明:

参数(原始函数地址, 新函数地址, 调用原始函数).

函数主要流程:

注册函数信息, 计算hook stub.

首先判断originFunAddrnewFunAddr是否是函数地址.

auto info = getHookInfo(originFunAddr); 得到函数信息

然后判断函数是否已经被Hook.

检查判断指令类型(thumb or arm or x86 ...)

hook_map是一个std::map<Elf_Addr, FAInHook::HookInfo*>的map类型. find函数会返回返回一个迭代器, 可以用it->firstit->second来访问它的成员(key和value). 这个过程其实对已经注册过的hook函数的处理.

auto type = FAHook::Instruction::getFunctionType(orginalFunAddr);

下面是getFunctionAddr的实现, 可以看到. 判断指令类型的方式, 是通过自己定义宏来实现的. 当然, 在Arm指令中, 我们还要是否该指令为thumb指令.

在看HookInfo.h时, 我们可以看到FAHook是一个namespace, 而里面主要包含了一个HookInfo的类:

我们先来分析它的构造函数:

这里运用了c++中的构造函数初始化列表来初始化类成员.

分析createStub(info)
我们这里分析FAHook::ThumbInstrution::createStub(FAHook::HookInfo *info):

thumbInstruction.cpp的实现:

基础知识:

reinterpret_cast<uint16_t*> 为类型转换

为什么要修正pc相关指令?

inlineHook原理图, 来源于gslab.

inlineHook原理图 ---  来源于gslab

调用 used += MSGetInstructionWithThumb(reinterpret_cast<uint8_t *>(area) + used);
MSGetInstructionWithThumb: 参数为(uint16_t*).
返回结果: 为这条指令是多少字节的指令.(4 or 2)

T$32bit$i的作用: (指令(ic) & 1110 0000 0000 0000) && (ic & 0001 1000 0000 0000 != 0x0000);
第一个判断为确定高位3个bit(即bit[15], bit[14], bit[13])为1. 第二个判断为确保bit[12], bit[11]有值(即至少这两位有 1 位为 1).

其实就是判断是该thumb指令是否为thumb32指令,
thumb32指令的判断依据是 b[15:11] 为 0b11101或0b11110或0b11111.

MSGetInstructionWithThumb:

T$32bit$i:

有4个方法:

有4个field:

我们现在分析一下createExecMemory(uint32_t size):

createExecMemory:

hookAll():

进而转到Hook函数

分析enableJumpStub(info):

可以看到, 在得到了origAddrstubAddrlen之后,我们会进入到patch函数patchMemory, 根据我们前面的分析, 它会patch原函数的入口指令的前(8 or 10?)个字节.

patchMemory:

首先会调用unProtectMemory函数来将对应内存修改为(rwx), 然后调用memcpy来修改内存, 最后调用protectMemory来修改对应内存为(r-x).

现在我们就基本对该项目进行了简单的分析, 我这里总结一下:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
http://ele7enxxh.com/Android-Arm-Inline-Hook.html
http://gslab.qq.com/portal.php?mod=view&aid=168
https://github.com/ele7enxxh/Android-Inline-Hook
https://github.com/F8LEFT/FAInHook
static {
        System.loadLibrary("FHook");
    }

public native String stringFromJNI();
jstring stringFromJNI(
        JNIEnv *env,
        jobject ) {
     doInHook();
    // doGotHook();
    return env->NewStringUTF(getStr());
}

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void *reserved) {
    JNIEnv* env = nullptr;
    jint resultstr = -1;
    if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    auto jclazz = env->FindClass("com/example/l0phtg/hookstudyf8/MainActivity");
    JNINativeMethod natives[] = {
            {"stringFromJNI", "()Ljava/lang/String;", (void*)stringFromJNI}};
    env->RegisterNatives(jclazz, natives, 1);
    env->DeleteLocalRef(jclazz);

    init();

    return JNI_VERSION_1_6;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-4-3 16:51 被LOphTg编辑 ,原因: 更正文章内容
收藏
免费 2
支持
分享
最新回复 (24)
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
小白第一次发帖,    现在发现格式有问题,见谅见谅
2018-4-3 12:55
0
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
格式编辑好了
2018-4-3 12:58
0
雪    币: 783
活跃值: (1121)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
4
我F8老师  一统安卓  叱咤逆界
2018-4-3 13:08
0
雪    币: 440
活跃值: (1163)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
我F8老师    一统安卓    叱咤逆界
2018-4-3 13:49
0
雪    币: 775
活跃值: (3420)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
6
我F8老师        一统安卓        叱咤逆界
2018-4-3 13:52
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
前排声明一下,核心的inline部分我是抄别人的
2018-4-3 13:58
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
部分代码看着眼熟,和我的开源项目有关吗?
2018-4-3 14:11
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
thumb修复那段是substrate模块里的代码,  只是跳板换了LDR.W, https://github.com/jevinskie/substrate
最后于 2018-4-11 15:17 被Rprop编辑 ,原因:
2018-4-3 14:32
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
ele7enxxh 部分代码看着眼熟,和我的开源项目有关吗?
再声明一下,这个FAInHook的项目核心部分代码都是抄一位大神的  @ele7enxxh,喜欢的请移步到他的github上去。
这里我只是做了很微不足道的封装工作,还请楼主把标题改一下,把标题里我的名字去掉。
另外,上面的声明已经在FAInHook的项目里的readme.md加上。
我的github  @F8LEFT里面还有其他不错的开源项目,近期内也有打算再开一个有趣的东东,欢迎大家关注。
2018-4-3 15:48
0
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好的,我把内容和标题再修改一下。
2018-4-3 16:15
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
F8    6666
2018-4-3 16:18
0
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
currwin 前排声明一下,核心的inline部分我是抄别人的
抱歉,给各位大佬添麻烦了。    如果有需要的话,我会将文中部分代码删除。
2018-4-3 16:30
0
雪    币: 44
活跃值: (179)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
很想知道,面试的哪个大厂
2018-4-4 09:33
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
currwin 再声明一下,这个FAInHook的项目核心部分代码都是抄一位大神的 @ele7enxxh,喜欢的请移步到他的github上去。 这里我只是做了很微不足道的封装工作,还请楼主把标题改一下,把标题里我的 ...
哈哈,赞!要技术更要品格。
2018-4-4 09:57
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
LOphTg 抱歉,给各位大佬添麻烦了。 如果有需要的话,我会将文中部分代码删除。
这篇文章写得挺不错的,对于代码分析我个人是支持的,不然项目开源出来也就没有任何意义了。
只是不能随便把别人的名字挂在标题上,无论好事还是坏事,下次要注意一点。
2018-4-4 10:49
0
雪    币: 94
活跃值: (2397)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
好分享,比什么少月发的贴质量高多了~
2018-4-4 11:13
0
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
currwin 这篇文章写得挺不错的,对于代码分析我个人是支持的,不然项目开源出来也就没有任何意义了。 只是不能随便把别人的名字挂在标题上,无论好事还是坏事,下次要注意一点。
好,以后一定注意。
2018-4-4 13:40
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢分享
2018-4-4 14:00
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
各位老师都好谦虚,谢谢分享
2018-4-4 22:40
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
2018-4-5 01:21
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
写的很好 学习下
最后于 2018-8-4 20:11 被deathinfo编辑 ,原因:
2018-8-4 20:06
0
雪    币: 18549
活跃值: (2352)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习了
最后于 2018-8-5 11:38 被会飞的锅编辑 ,原因:
2018-8-4 22:22
0
雪    币: 7
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我F8老师        一统安卓        叱咤逆界 !嘿嘿,默默地看了一个多小时,虽然不怎么明白,但先顶再收藏,或许以后能看明白了呢!多谢大佬!
2018-8-12 21:34
0
游客
登录 | 注册 方可回帖
返回
//