Android内存数据读取与修改/内存代码注入/内存dump

本文详细介绍了Android逆向分析中常见的内存操作,包括内存数据读取与修改、内存代码注入和内存dump。通过实例展示了如何在IDA中进行内存修改、寄存器值的调整、NOP函数以及改变执行流程。同时,提到了内存注入的ptrace流程,并讨论了使用IDC脚本进行动态调试时dump内存的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android的逆向时,对内存数据的操作主要有三种:内存数据读取与修改,内存代码注入,内存dump。之前对这三种操作的概念比较模糊,因此找了些资料整理如下,加深自己的理解。





修改数据

修改内存数据

修改内存数据需要在十六进制窗口中进行编辑,可先将反汇编窗口与十六进制窗口同步。如下图所示,在反汇编窗口中点击鼠标右键弹出菜单,选中Synchronize with选项,在子菜单中可以选择反汇编窗口同步的窗口或寄存器,这里选择同步Hex View-1窗口,即与十六进制窗口同步。窗口同步后在反汇编窗口中跳转到指定地址十六进制窗口也会跟随着跳转到指定地址,方便我们对内存数据进行查看和编辑。

右键菜单同步窗口选项

在需要修改内存数据时,可以在十六进制窗口中跳转到需要修改的内存地址处,点击鼠标右键,如下图所示,在弹出的菜单中点击Edit选项,即可以直接在十六进制窗口中进行编辑。

### 如何在Android上使用GDB生成和分析coredump文件 #### 配置环境准备 为了能够在Android设备上利用GDB进行core dump的生成分析,需先确保已安装适当版本的Android NDK以及设置好开发环境。对于C++开发的应用而言,这一步骤尤为关键[^2]。 #### 启用Core Dump功能 针对较新版本的Android系统(如P及以上),核心转储(coredump)支持已被集成到操作系统内部。要激活此特性并允许应用崩溃时创建core dump文件,可以通过修改`/proc/sys/kernel/core_pattern`来指定core文件存储路径及其命名模式[^3]。 例如,在具有root权限的情况下执行如下命令可将core dumps放置于特定目录: ```bash echo "/data/local/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern ``` 此处`%e`代表执行文件名而`%p`表示进程ID。 #### 编译带有调试信息的应用程序 当通过NDK构建项目时,应启用编译选项以保留完整的调试符号表。这样做的目的是为了让后续借助gdb工具读取core dump变得更为容易。具体来说可以在`Application.mk`中加入以下配置项: ```makefile APP_CFLAGS += -g -O0 ``` 上述指令告知编译器尽可能多地嵌入源码级别的元数据,并关闭优化措施以便更精确地映射机器指令回原始代码片段。 #### 使用ADB启动目标app并远程GDB连接 一旦应用程序部署完毕并且处于等待状态,就可以采用adb shell方式进入终端界面进而触发一次预期中的crash事件从而获取相应的core dump样本;之后再运用预先设定好的脚本来加载该二进制镜像连同其关联的核心转储一起送至本地计算机上的GNU Debugger实例里做进一步剖析工作[^1]。 下面给出一段Python脚本作为示范,用于自动化处理以上流程: ```python import os,subprocess,time,json,re def get_device_info(): result=subprocess.run(['adb','devices'],stdout=subprocess.PIPE).stdout.decode('utf-8') devices=[line.split('\t')[0]for line in result.strip().splitlines()[1:]if 'device' in line] return json.dumps({'devices':devices}) def setup_gdbserver(app_package_name,port=5039): subprocess.call(f'adb shell am force-stop {app_package_name}',shell=True) time.sleep(2)# wait for app to stop completely pid_output=subprocess.check_output( f'adb shell pgrep -f {re.escape(app_package_name)}',stderr=subprocess.STDOUT, universal_newlines=True) pids=re.findall(r'\d+',pid_output) if not pids: raise Exception("Failed to find PID of the application.") main_pid=pids[-1] gdb_server_command=f"gdbserver :{port} --attach {main_pid}" print(f'Setting up GDB server with command:{gdb_server_command}') adb_shell_process=subprocess.Popen( ['adb','-s',json.loads(get_device_info())['devices'][0],'shell'], stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) adb_shell_process.stdin.write(gdb_server_command.encode()) adb_shell_process.stdin.close() adb_shell_process.wait() setup_gdbserver('com.example.yourapplication') ``` 这段代码实现了自动停止给定包名的目标App、查询其正在运行的服务进程号(PID),并通过ADB Shell向远端注入一条命令开启监听模式下的gdbserver服务,最后绑定选定端口等待来自PC侧发起的会话请求。 #### 加载core dump至本地GDB 完成前面几步操作后,现在可以回到电脑这边打开一个命令提示符窗口输入类似这样的语句把之前收集起来的数据导入进来查看问题所在了: ```bash $ arm-linux-androideabi-gdb ./obj/local/arm64-v8a/libyourlib.so ... (gdb) target remote tcp::5039 Remote debugging using tcp::5039 ... (gdb) core-file /path/to/the.core ... ``` 这里假设读者已经下载好了匹配架构类型的交叉编译版GDB客户端软件包,并且知道怎样定位到待检视库文件的确切地址。按照指示逐步建立起双向通信链路直至成功附加到远程进程中去,紧接着便是调用`core-file`命令传参指向先前所提到过的那部分内存快照资料来进行最终阶段的故障排查作业了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值