【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

简介: 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

文章目录

一、注入流程

二、注入工具的 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;
}


目录
相关文章
|
Shell Linux C语言
函数和进程之间的相似性
在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。
198 0
|
弹性计算 运维 监控
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
655 17
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
796 13
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
651 4
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
708 4
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
862 4
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
1217 4
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
515 1
|
NoSQL Linux 程序员
进程管理与运行分析
进程管理与运行分析
195 0