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技术(二)的更多相关文章

  1. Android Native Hook技术(一)

    原理分析 ADBI是一个著名的安卓平台hook框架,基于 动态库注入 与 inline hook 技术实现.该框架主要由2个模块构成:1)hijack负责将so注入到目标进程空间,2)libbase是 ...

  2. 使用cydia substrate 来进行android native hook

      cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook 我是在网上找到的supermathhook这个项目,在他基 ...

  3. 利用Cydia Substrate进行Android HOOK(二)

    在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...

  4. 使用Cydia Substrate 从Native Hook Android Native世界

    同系列文章: 使用Cydia Substrate 从Native Hook Android Java世界 使用Cydia Substrate Hook Android Java世界 一.建立工程 手机 ...

  5. Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook

    前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...

  6. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  7. Android Native 内存泄漏系统化解决方案

    导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...

  8. Hook技术

    hook钩子: 使用技术手段在运行时动态的将额外代码依附现进程,从而实现替换现有处理逻辑或插入额外功能的目的. 它的技术实现要点有两个: 1)如何注入代码(如何将额外代码依附于现有代码中). 2)如何 ...

  9. Android Native jni 编程入门

    在某些情况下,java编程已经不能满足我们的需要,比如一个复杂的算法处理,这时候就需要用到jni(java native interface)技术: jni 其实就是java和c/cpp之间进行通信的 ...

随机推荐

  1. 解决Eureka Server不踢出已关停的节点的问题

    eureka端: eureka.server.enable-self-preservation (设为false,关闭自我保护主要) eureka.server.eviction-interval-t ...

  2. servlet初认知(持续更新中)

    一:前言: 一个Servlet程序其实就是一个实现了Java特殊接口的类,它由支持Servlet(具有Servlet引擎)的WEB服务器调用和启动运行.一个Servlet程序负责处理它对应的一个或者多 ...

  3. 十、 持久层框架(MyBatis)

    一.基于MyBatis动态SQL语句 1.if标签 实体类Product的字段比较多的时候,为了应付各个字段的查询,那么就需要写多条SQL语句,这样就变得难以维护. 此时,就可以使用MyBatis动态 ...

  4. Linux中环境变量文件

    一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...

  5. java后台判断浏览器的版本

    public static void main(String[] args) {              String agent=request.getHeader("User-Agen ...

  6. iOS性能优化总结

    iOS性能优化总结.关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化.电量优化. 安装包瘦身.启动优化.网络优化等. 关于iOS 性能优化梳理: 基本工具.业务优化.内存 ...

  7. Wireshark:No interfaces found解决方法(Windows 10)

    启动Wireshark时有时会报“No interfaces found”,找不到网卡进行截包.造成这种情况的原因可能有两个,一是npf服务没启动,二是当前用启对网卡没有拦截权限. 一.npf服务未启 ...

  8. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  9. spring事务管理(详解和实例)

    原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...

  10. summary_16th Nov, 2018

    一. 编程语言的分类: a. 机器语言:直接使用二进制指令去编写程序,必须考虑硬件细节 b:汇编语言:用英文标签取代二进制指令去编写程序,必须考虑硬件细节 c:高级语言:用人类能理解的方式编写程序,通 ...