Android Native Hook技术(二)
Hook技术应用
已经介绍了安卓 Native hook 原理,这里介绍 hook 技术的应用,及 Cyida Substrate 框架。
分析某APP,发现其POST请求数据经过加密,我们希望还原其明文。经分析,加密是在so中的 Java_com_imohoo_jni_Main_abc() 函数内完成的。
该函数通过 getkey() 和 getIV() 分别生成加密密钥与IV,然后使用AES加密请求数据。
简单逻辑如下:
v_iv = getIV((int)env, a5);
v14 = getkey((int)v11, a5);
--
aes_key_setup(v14, &v_key, 128);
--
aes_encrypt_cbc((int)dec, size, (int)enc, (int)&v_key, 128, v_iv);
分析 getIV() 与 getkey() 函数的实现,其经过强混淆,并且生成的key又经过 aes_key_setup() 函数变换。静态分析变换过程其使用了部分运行时动态修改的内存,静态分析出结果机率为0。
但由上面代码执行流程,发现通过hook aes_encrypt_cbc() 函数,就能简单的拿到IV与加密key
使用 Cydia Substrate 框架来完成这个任务,主要代码如下:
#include <android/log.h>
#include <substrate.h>
#include <stdio.h>
#define LOG_TAG "KEYHOOK"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
MSConfig(MSFilterExecutable, "/system/bin/app_process")
void (*original_getnewkey) (char* in, int len, char *out, char *key, int key_len, char *iv);
void replaced_getnewkey (char* in, int len, char *out, char *key, int key_len, char *iv)
{
LOGI("ENC_KEY [%s]", key);
LOGI("IV [%s]", iv);
LOGI("PlainText [%s]", in);
original_getnewkey(in, len, out, key, 128, iv);
}
void* lookup_symbol(char* libraryname, char* symbolname)
{
void *imagehandle = dlopen(libraryname, RTLD_GLOBAL | RTLD_NOW);
if (imagehandle != NULL){
void * sym = dlsym(imagehandle, symbolname);
if (sym != NULL){
return sym;
}
else{
LOGI("(lookup_symbol) dlsym didn't work");
return NULL;
}
}
else{
LOGI("(lookup_symbol) dlerror: %s",dlerror());
return NULL;
}
}
void cigi_hook(void *orig_fcn, void* new_fcn, void **orig_fcn_ptr)
{
MSHookFunction(orig_fcn, new_fcn, orig_fcn_ptr);
}
MSInitialize {
LOGI("Cydia Init");
void *getnewkey_t = lookup_symbol("/data/app-lib/com.imohoo.shanpao-1/libshanpao_jni.so", "aes_encrypt_cbc");
cigi_hook(getnewkey_t, (void*)&replaced_getnewkey, (void**)&original_getnewkey);
}
代码显示了 hook 系统与应用 so 之间的区别,我们的 substrate 模块运行在 app_process 的上下文中,也就是 zygote 进程。所有的 Android 应用进程都由它 fork 而来,而这个进程中并没有加载 libshanpao_jni.so 这个库,因此直接查找 aes_encrypt_cbc 符号肯定是找不到的。
我的解决办法是在 zygote 中使用 dlopen() 主动加载之。根据so加载原则,fork出的APP进程启动后,将会使用我们加载的 libshanpao_jni.so 库。
这是一个有用的技巧。
该 hook 框架的一个完整工程,参考 github 上的 DumpDex,该工程通过 hook 系统 dalvik 运行时 libdvm.so 的 _Z12dexFileParsePKhji 函数实现脱壳。
如何自己创建这样一个工程,参考莫灰灰博客。
Android Native Hook技术(二)的更多相关文章
- Android Native Hook技术(一)
原理分析 ADBI是一个著名的安卓平台hook框架,基于 动态库注入 与 inline hook 技术实现.该框架主要由2个模块构成:1)hijack负责将so注入到目标进程空间,2)libbase是 ...
- 使用cydia substrate 来进行android native hook
cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook 我是在网上找到的supermathhook这个项目,在他基 ...
- 利用Cydia Substrate进行Android HOOK(二)
在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...
- 使用Cydia Substrate 从Native Hook Android Native世界
同系列文章: 使用Cydia Substrate 从Native Hook Android Java世界 使用Cydia Substrate Hook Android Java世界 一.建立工程 手机 ...
- Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook
前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...
- Android热修复技术原理详解(最新最全版本)
本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- Hook技术
hook钩子: 使用技术手段在运行时动态的将额外代码依附现进程,从而实现替换现有处理逻辑或插入额外功能的目的. 它的技术实现要点有两个: 1)如何注入代码(如何将额外代码依附于现有代码中). 2)如何 ...
- Android Native jni 编程入门
在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni(java native interface)技术: jni 其实就是java和c/cpp之间进行通信的 ...
随机推荐
- NOSQL -- mongoDB的了解与安装(Wins10)
NOSQL -- mongoDB的了解与安装 首先看看什么是nosql: 我的理解:非关系型数据库,大多是以map形式存储,map<key,value>,适合存储,查询.redis也是no ...
- maven plugins
<build> <finalName>lessons</finalName> <plugins> <plugin> <groupId& ...
- 设计模式:java及spring观察者模式(有利于代码解耦)
http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...
- easyui中如何为validatebox添加事件(onblur、onclick等)
在我们一般html的input标签,textbox事件可以直接使用onblur().onclick()事件,但是在easyui的validatebox没有onblur事件, 如果我们需要为valida ...
- IO库----IO类,文件输入输出,string流
一.IO类 1.IO库类型和头文件表: 头文件 类型 iostream istream,wistream 从流读取数据 ostream,wostream 向流写入数据 iostream,wiostre ...
- linux系统管理 vi编辑器
Vim是vi improved的缩写是vi的改进版本,vi被认为是事实上的标准编辑器 所有版本的Linux都带有vi编辑器 占用的资源少 与ed,ex等其他编辑器相比,vi对用户更加友好 进入vi编辑 ...
- css 中的grid布局基础
CSS Grid Layout为CSS引入了一个二维网格系统.网格可用于布局主要页面区域或小型用户界面元素. 网格是一组交叉的水平和垂直线 - 一组定义列,其他行.元素可以放在网格上,以行或者列为标准 ...
- Kafka.net使用编程入门(三)
这个世界既不是有钱人的世界,也不是有权人的世界,它是有心人的世界. 一些有用的命令 1.列出主题:kafka-topics.bat --list --zookeeper localhost:2181 ...
- 稀疏 部分 Checkout
To easily select only the items you want for the checkout and force the resulting working copy to ke ...
- 二叉排序树,Binary_Sort_Tree,C++完整实现
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...