文章目录
一、注入流程
二、注入工具的 main 函数分析
一、注入流程
开始分析 【Android 逆向】Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ) 博客中的 tool 工具代码 ;
tool 工具使用前 , 先获 取要注入的目标进程 进程号 , 使用
dumpsys activity top|grep pid
命令获取当前前台进程的进程号 ;
在 /data/system/debug/ 目录中 ( 之前将所有注入相关的文件都拷贝到该目录中 , 并赋予 777 权限 ) , 执行
./tool 2222
命令 , 即可 向目标进程注入 SO 动态库 ; 其中 2222 就是要注入 SO 动态库的 目标进程 进程号 ;
二、注入工具的 main 函数分析
该应用涉及到 CPU 寄存器操作 , 因此需要确定应用运行在指定的 CPU 架构中 , 使用
#if defined(__i386__)
判定当前的运行环境的 CPU 架构 ;
判断参数是否合法 , 正常情况下执行 ./tool 2222 命令 , 有 2 个参数 , 如果参数个数不是 2 个 , 直接报错 ;
/* 验证 参数个数是否合法 , 如果参数个数不是 2 个 , 报错 */ if (argc != 2) { printf("Usage:%s pid\n", argv[0]); return 0; }
调用 atoi 函数 , 将参数 1 字符串数据 , 转为 pid_t 进程号类型 ;
pid_t target_pid; /* 字符串转 int */ target_pid = atoi(argv[1]); if (-1 == target_pid) { printf("Can't find the process\n"); return -1; }
获取进程号之后 , 开始 执行 SO 动态库注入 操作 :
// 注入 /data/system/debug/libbridge.so 路径的动态库 inject_remote_process(target_pid, "/data/system/debug/libbridge.so", "load", NULL, 0);
main 函数完整代码 :
int main(int argc, char** argv) { #if defined(__i386__) /* 正确情况下应该进入该分支 */ LOGW("__i386__\n"); #else /* 该应用是针对 x86 开发的 , 如果进入到这个分支就出错了 */ LOGW("__arm__\n"); #endif pid_t target_pid; /* 验证 参数个数是否合法 , 如果参数个数不是 2 个 , 报错 */ if (argc != 2) { printf("Usage:%s pid\n", argv[0]); return 0; } /* 字符串转 int */ target_pid = atoi(argv[1]); if (-1 == target_pid) { printf("Can't find the process\n"); return -1; } printf("%s %s\n", __DATE__, __TIME__); // 注入 /data/system/debug/libbridge.so 路径的动态库 inject_remote_process(target_pid, "/data/system/debug/libbridge.so", "load", NULL, 0); return 0; }