在进行安全研究中,我们需要经常使用ida等工具对app的so进行动态调试。这其中遇到的最大问题可能就是app加了反调试、反root等保护手段对应用运行环境进行检测,而这些手段往往是在我们附加进程之前就已经加载了的,所以不能通过ida等调试工具直接附加进程的方式来调试这些so,因而需要我们自己实现加载器来加载目标so文件。

下面就是我们写的一个简单的加载器代码:

 #include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> int main(){
printf("Loading libs\n");
int (*pt2Function)(void) = NULL;
//pointer to a void function - change this to match method sig
void* sdl_library = dlopen("/system/libtarget.so", RTLD_LAZY);
if (sdl_library == NULL) {
// report error ...
printf("Unable to load library\n");
char *errstr;
errstr = dlerror();
if (errstr != NULL)
printf ("A dynamic linking error occurred: (%s)\n", errstr);
} else {
printf("Lib loaded, getting dlysm\n");
void* initializer = dlsym(sdl_library,"JNI_OnLoad");
if (initializer == NULL) {
// report error ... printf("Unable to get address of JNI_OnLoad\n");
char *errstr;
errstr = dlerror();
if (errstr != NULL)
printf ("A dynamic linking error occurred: (%s)\n", errstr);
} else {
// cast initializer to its proper type and use
printf("calling get process\n");
//asm("BKPT #0");
pt2Function = initializer;
printf("got get process, setting up\n");
printf("Ok, lets Calling the function");
int result = pt2Function();
printf("Result of call is %d", result);
//asm("BKPT #0");
}
}
return ;
}

  从代码中可知,我们的目标是JNI_Onload函数,这是因为反调试和系统环境检测功能代码往往是在JNI_Onload函数中设置的。我们可以控制该函数指针指向任意so文件的导出函数然后调用它。

  这个代码可以在任意标准Linux系统下编译运行。我们使用dlopen()函数动态加载library库,dlsym()函数控制指针指向我们需要测试的导出函数,然后直接调用目标函数,传递任意参数给它,以便跟踪执行流程,甚至进行fuzz,漏洞利用。
  要对上述代码进行编译,还需编写Android.mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# give module name
LOCAL_MODULE := soloader
# list your C files to compile
LOCAL_SRC_FILES := soloader.c
# Build executables instead of a library for android.
include $(BUILD_EXECUTABLE)

  通过Android studio创建Android工程,将soloader.c和Android.mk文件置于src/mian/jni目录下,通过ndk-build进行编译,然后在/libs/armeabi目录下就可以找到编译好的soloader了。然后通过adb命令push到/system目录(需要先remount),就可以执行了。

  本文根据https://www.trustwave.com/Resources/SpiderLabs-Blog/Custom-Native-Library-Loader-for-Android/进行翻译。

自己实现so加载器的更多相关文章

  1. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  2. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  3. AngularJs2与AMD加载器(dojo requirejs)集成

    现在是西太平洋时间凌晨,这个问题我鼓捣了一天,都没时间学英语了,英语太差,相信第二天我也看不懂了,直接看结果就行. 核心原理就是require在AngularJs2编译过程中是关键字,而在浏览器里面运 ...

  4. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

  5. 删除 Windows 旧 OS 加载器

    装过多个系统,然后又删除掉了,系统启动引导时,又把以前的废弃的系统引导给带了出来,试过多种方式,以下方法是最好的. 开始->运行->cmd bcdedit /v 查看要删除的"W ...

  6. KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器

    无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...

  7. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  8. AMD加载器实现笔记(五)

    前几篇文章对AMD规范中的config属性几乎全部支持了,这一节主要是进一步完善.到目前为止我们的加载器还无法处理环形依赖的问题,这一节就是解决环形依赖. 所谓环形依赖,指的是模块A的所有依赖项的依赖 ...

  9. AMD加载器实现笔记(四)

    继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道m ...

  10. AMD加载器实现笔记(三)

    上一篇文章中我们为config添加了baseUrl和packages的支持,那么这篇文章中将会看到对shim与paths的支持. 要添加shim与paths,第一要务当然是了解他们的语义与用法.先来看 ...

随机推荐

  1. 手机自动化培训:Appium介绍

    手机自动化培训:Appium介绍 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  2. POPTEST学员就业面试题目!!!!!

    POPTEST学员就业面试题目!!!!!   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.(欢迎大家咨询软件测试工程师就业培训 ...

  3. 使用U盘安装ubuntu 12.04(使用大白菜u盘启动工具)

    家里有个u盘启动盘,用大白菜U盘工具做的. 1.把iso文件放到u盘里,把ISO文件中的casper目录下的vmlinuz和initrd拷贝到u盘根目录下: 2.修改启动顺序,选u盘启动: 3.启动时 ...

  4. MyEclipse常见错误

    1.Could not create the view: An unexpected exception was thrown java.lang.NullPointerException     a ...

  5. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  6. 倒排索引的AND操作

    这是一道来自百度的面试题.倒排索引的AND操作. 倒排索引是以关键词作为索引项来索引文档的一种机制,如图中Brutus.Calpurnia.Caesar为关键词,2.4.8等等为文档ID. 现在有一个 ...

  7. ios富文本的简单使用 AttributedString

    富文本,顾名思义就是丰富的文本格式,本文demo使用NSMutableAttributedString //获取富文本 NSMutableAttributedString*attributeStrin ...

  8. MySQL用户认证及权限grant-revoke

    一.MySQL用户认证: 登录并不属于访问控制机制,而属于用户身份识别和认证: 1.用户名-user 2.密码-password 3.登录mysqld主机-host 实现用户登录MySQL,建立连接. ...

  9. B/S 和 C/S两种架构

    一: 什么是B/S(Browser/Server)架构? 应用系统完全放在应用服务器上, 并通过应用服务器同数据库服务器进行通信,系统界面 是通过浏览器来展现的. T是浏览器模式. 优点: 1)客户端 ...

  10. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...