so逆向筑基-hook init init_array 和JNI_OnLoad

0x01 init init_array JNI_OnLoad是什么

在共享库被加和卸载时自动执行的函数,主要用于做一些初始化操作。

init 函数优先于 init_array 函数执行。

JNI_OnLoad:加载库文件的时候,如果代码中有此函数,就会自动执行。执行的时机晚于 init 和 init_array



0x02 使用方式

这里我们在 zzcracker.cc 中增加 init 和 init_array jni_load

1. init 函数

  注意:在 IDA 中反编译出来看到的 init 函数名字为 .init_proc

extern "C" void _init() {

    LOGD("SO INIT METHOD");

}


2. init_array

  这里定义 3 个 init_array 函数

__attribute__ ((constructor, visibility("hidden"))) void initArrayTest1() {

            LOGD("initArrayTest1");

}

__attribute__ ((constructor, visibility("hidden"))) void initArrayTest2() { 

        LOGD("initArrayTest2"); 

}


__attribute__ ((constructor, visibility("hidden"))) void initArrayTest3() { 

     LOGD("initArrayTest3"); 

}

3. 定义 JNI_OnLoad

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; vm->GetEnv((void **) &env, JNI_VERSION_1_6); LOGD("JNI_Onload JNIEnv %p", env); return JNI_VERSION_1_6; }

上面的代码定义了 4 个函数,我们从输出的日志中可以查看函数执行的顺序


IDA 中查看 init_array

ctrl+s 查看短信息,可以看到 .init_array的信息


点击跳转就可以看到我们定义的单个 init_array 定义的位置。


分别点击每个函数


按 F5 转换成 伪 C 代码,很明显就是我们写的 init_array 函数啦


IDA 查看 init

在 IDA 左边的符号表搜索 init 。搜索结果里面的 .init_proc 就是我们的目标函数。


点击跳转进入汇编指令然后 F5 进位伪 C 代码。奈斯!就是我们的 init 函数啦

IDA 查看 JNI_OnLoad

在 IDA 的导出表页面搜索 JNI

点击 JNI_OnLoad 跳转


可以看到我们定义的 LOGD 日志输出(其他的代码可以忽略,不是本文的重点)

分别 hook 以上三个函数

so 是通过系统的 dlopen进行加载的,在 android 7.0 之后使用的是 android_dlopen_ext 。这个函数是在 libdl.so 中。因为 init 和 ini_array 执行的时机很早,且执行过一次之后就不再执行。因为我们需要在 android_dlopen_ext 运行过程中hook


第一步: Hook android_dlopen_ext

hook 到这个函数之后,要对  so的名字进行过滤,只 hook 需要的 so 。



第二步:hook callConstructorAdd

通过android源码分析 init 和 init_array 是在 callConstructorAdd 中被调用的。所以我们需要先找到这个函数并 hook 。

callConstructorAdd 在android编译之后, 是放在手机 system/bin/linker64 动态库中。把 linker64 用 IDA 打开,并在符号表中搜索 constructor。得到导出的符号:__dl__ZN6soinfo17call_constructorsEv

然后通过 frida 遍历 so 的符号表,找到我们的目标函数 __dl__ZN6soinfo17call_constructorsEv 并hook上。


第三步: HOOK init 和 init_array 函数啦

下面 hook init 和init_array 都是使用了 Interceptor.replace 对原函数进行替换。模拟了我们在 init 或者 init_array 中有反调试检测。把这个函数直接替换掉,让其无法检测,就达到了 bypass 的目的。

1. hook init


2.hook init_array



第四步: hook JNI_OnLoad

JNI_Onload 执行的时机比较晚,在 dlopen 离开的时候再进行 hook就可以了




这里我们就直接 Interceptor.attach 进行 hook 做一个简单的打印日志,不替换原函数了。

hook前的android 日志输出


hook 后的日志输出

先看 frida 的hook 日志

在 so 加载之前 hook 上 dlopen 函数。

然后点击加载 so ,可以看到我们正常 hook 到 init init_array 和 JNI_OnLoad 啦。


android 的日志没有 init 和 init_array 的日志输出啦。说明我们 hook 成功。


以上,就是 hook init init_array JNI_OnLoad 的原理以及实现啦。多谢各位看官的时间!如果有什么问题可以再评论区提出。有写的不好的地方,希望大家包含咯!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容