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

[原创]inlineHook学习分析

2018-4-3 12:52
17024

最近在应聘某大厂的安全岗位时,面试官问到了一些有关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).

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

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2D9k6e0N6W2L8Y4S2^5K9q4)9J5k6h3y4G2L8g2)9J5c8V1q4F1k6s2u0G2K9h3c8Q4x3X3c8m8M7X3#2Q4x3X3c8u0L8X3I4A6L8X3g2Q4x3X3c8t1L8$3!0C8i4K6u0W2K9s2c8E0L8l9`.`.
37fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3N6K6L8r3q4T1i4K6u0W2M7i4q4Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8%4u0@1j5h3I4Q4x3X3g2H3K9s2m8Q4x3@1k6E0L8$3c8Q4x3@1c8$3K9h3g2%4i4K6t1$3j5h3#2H3i4K6y4n7j5h3W2V1i4K6y4p5x3e0j5^5
68fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8r3f1%4k6h3&6^5P5r3S2Q4x3V1k6m8L8X3c8J5L8$3W2V1i4K6u0V1d9h3&6D9K9h3&6W2i4K6u0V1d9r3!0G2K9H3`.`.
fd8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6r3z5p5I4q4c8W2c8Q4x3V1k6r3b7f1W2F1d9r3!0G2K9H3`.`.
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
雪    币: 799
活跃值: (1236)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
4
我F8老师  一统安卓  叱咤逆界
2018-4-3 13:08
0
雪    币: 439
活跃值: (1943)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
我F8老师    一统安卓    叱咤逆界
2018-4-3 13:49
0
雪    币: 1357
活跃值: (4218)
能力值: ( 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
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
部分代码看着眼熟,和我的开源项目有关吗?
2018-4-3 14:11
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
thumb修复那段是substrate模块里的代码,  只是跳板换了LDR.W, 6baK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6B7k6i4k6A6L8Y4y4C8K9h3g2Q4x3V1k6K6N6h3u0K6N6s2u0S2N6r3f1`.
最后于 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
活跃值: (239)
能力值: ( 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
活跃值: (3097)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
好分享,比什么少月发的贴质量高多了~
2018-4-4 11:13
0
雪    币: 166
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
currwin 这篇文章写得挺不错的,对于代码分析我个人是支持的,不然项目开源出来也就没有任何意义了。 只是不能随便把别人的名字挂在标题上,无论好事还是坏事,下次要注意一点。
好,以后一定注意。
2018-4-4 13:40
0
雪    币: 300
活跃值: (2772)
能力值: ( 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
雪    币: 22239
活跃值: (2697)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回