Android进程注入,又名so注入。对于一些防护不严的应用,可以加载自定义的so文件,执行恶意代码。本文采用第三方代码对一款APP进行注入,供安全测试之用。正如余弦所言,run it 优先,之后再究其原理。
create: 2018-10-23 01:17:07
- 准备工作
原理简介:https://www.cnblogs.com/goodhacker/p/3920365.html
项目地址:https://github.com/yurushao/droid_injectso
直接去bin目录下载两个编译好的文件,一个是注入工具injector、另一个是待加载的代码libtest.so。
然后push到手机data/local/tmp/
目录中,chmod 755 injector
赋予可执行权限。
- 锁定目标
启动待注入APK,通过如下命令找到对应的进程号24900和25002。
> ps |grep gamehall
u0_a92 24900 181 1085880 280960 ffffffff 4010f73c S com.xxx.gamehalltv
u0_a92 25002 181 913632 54256 ffffffff 4010f73c S com.xxx.gamehalltv:ipc
- 执行注入
> ./injector -p 25002 -l /data/local/tmp/libtest.so
- 验证注入
从libtest.so源码中可知,当注入成功后,会打印Logcat输出"lib loaded ..."和进程号信息。根据这些信息可以对注入情况做下验证。
#include <unistd.h>
#include <sys/types.h>
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "inject-test", __VA_ARGS__))
void _init(char *args)
{
LOGI("lib loaded ...");
}
void so_entry(char *p)
{
pid_t pid = getpid();
LOGI("pid: %d", pid);
}
用grep过滤一下logcat结果,与预期一致,注入成功。
> logcat |grep inject
I/inject-test(25002): lib loaded ...
I/inject-test(25002): pid: 25002
更通用的方法是查看内存映射,下面显示的也是注入成功的情况。
> cat /proc/25002/maps |grep libtest.so
779e2000-779e5000 r-xp 00000000 b3:1c 652251 /data/local/tmp/libtest.so
779e5000-779e6000 r--p 00002000 b3:1c 652251 /data/local/tmp/libtest.so
779e6000-779e7000 rw-p 00003000 b3:1c 652251 /data/local/tmp/libtest.so
结语
玩转ptrace(一)翻译得一坨翔,不如把英语学好,直接看原文:
个人感悟:是在进程号中注入自己的so,和原APP应用有没有so没关系。是把恶意so注入到进程,而不是把恶意so注入到原app的原生so中。
学习步骤:先执行,把流程打通。然后详细地分析其原理,接着分析别人的代码,编写自己的代码。最后是防护原理及防护代码!并再次验证,确定注入失败则防护成功。
网友评论