进击的Android注入术《二》
继续
注入
分类
- 静态注入,针对是可运行文件,比方平时我们改动ELF,DEX文件等等,相关的辅助工具也非常多,比方IDA、JEB、ApkTool等等;
- 动态注入,针对是进程,比方改动进程的寄存器、内存值等等;
本质
- 查看变量值
- 改动变量值
- 跟踪进程跳转
- 查看进程调用堆栈
- 等等
目的
- 增强目标进程的功能;
- 修复目标进程缺陷;
- 劫持目标进程函数;
- 窃取目标进程数据;
- 篡改目标进程数据;
过程
- ATTATCH,指定目标进程,開始调试;
- GETREGS,获取目标进程的寄存器,保存现场;
- SETREGS,改动PC等相关寄存器,使其指向mmap;
- POPETEXT,把so path写入mmap申请的地址空间;
- SETRESG,改动PC等相关寄存器,使其指向dlopen;
- SETREGS,恢复现场;
- DETACH,解除调试,使其恢复;
- 使用gcc的预编译指令__attribute__ ((__constructor__)),作用是让so被载入后,函数被自己主动运行;
__attribute__ ((__constructor__)) void Main() { LOGI(">>>>>>>>>>>>>I am in, I am a bad boy 1!!!!<<<<<<<<<<<<<<"); void* handle = dlopen("libinso.so", RTLD_NOW); void (*setA_func)(int) = (void (*)(int))dlsym(handle, "setA"); if (setA_func) { setA_func(999); } }
- 使用c++全局对象初始化,其构造函数会被自己主动运行;
void Main(); static void* _main(void*){ Main(); return NULL; } class EntryClass { public: EntryClass() { pthread_t tid; pthread_create(&tid, NULL, _main, NULL); pthread_detach(tid); } } boy;
演示样例一
Host代码
/* * inso.h * * Created on: 2014年6月24日 * Author: boyliang */ __attribute__ ((visibility ("default"))) void setA(int i); __attribute__ ((visibility ("default"))) int getA();
/* * inso.c * * Created on: 2014年6月24日 * Author: boyliang */ #include <stdio.h> #include "inso.h" static int gA = 1; void setA(int i){ gA = i; } int getA(){ return gA; }
/* * demo1.c * * Created on: 2014年6月24日 * Author: boyliang */ #include <stdio.h> #include <unistd.h> #include "inso.h" #include "log.h" int main(){ LOGI("DEMO1 start."); while(1){ LOGI("%d", getA()); setA(getA() + 1); sleep(2); } return 0; }
libmyso.so代码
/* * myso.c * * Created on: 2014年6月24日 * Author: boyliang */ #include <stdio.h> #include <stddef.h> #include <dlfcn.h> #include <pthread.h> #include <stddef.h> #include "log.h" __attribute__ ((__constructor__)) void Main() { LOGI(">>>>>>>>>>>>>I am in, I am a bad boy 1!!!!<<<<<<<<<<<<<<"); void* handle = dlopen("libinso.so", RTLD_NOW); void (*setA_func)(int) = (void (*)(int))dlsym(handle, "setA"); if (setA_func) { setA_func(999); } }
调用
I/TTT ( 594): DEMO1 start. I/TTT ( 594): 1 I/TTT ( 594): 2 I/TTT ( 594): 3 I/TTT ( 594): 4 I/TTT ( 594): 5 I/TTT ( 594): 6 I/TTT ( 594): 7 I/TTT ( 594): >>>>>>>>>>>>>I am in, I am a bad boy 1!!!!<<<<<<<<<<<<<< I/TTT ( 594): 999 I/TTT ( 594): 1000 I/TTT ( 594): 1001当运行./poison /data/local/tmp/libmyso.so 594后,输出中立即出现了特定字符串,而且打印的数据一下子变成了999,证明我们注入成功了。
演示样例代码
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。