【安卓逆向之内存读写
在 Android 逆向工程中,内存读写是一个常见的操作,通常用于分析和修改应用程序的行为。
内存读写的目的
-
分析应用行为: 通过读取内存,可以获取应用程序在运行时的状态信息,比如变量值、函数调用栈等。
-
破解和修改应用: 通过写入内存,可以修改应用程序的行为,比如绕过某些检查、解锁付费功能等。
-
调试和研究: 逆向工程师可以通过内存读写来调试应用程序,了解其内部工作机制。
内存读写的工具
-
Frida: 一个强大的动态分析工具,允许开发者在应用程序运行时插入自己的脚本。Frida 可以用于拦截和修改函数调用、读取和写入内存等。
-
GDB: GNU 调试器,可以用于调试 Android 应用程序,支持内存读写操作。
-
IDA Pro: 一个交互式反汇编器,支持静态分析和动态调试,可以用于内存读写。
-
Radare2: 一个开源的逆向工程框架,支持多种平台和架构,提供内存读写功能。
内存读写的基本操作
读取内存
读取内存通常涉及获取应用程序的内存地址,然后从该地址读取数据。以下是一个使用 Frida 的示例:
Java.perform(function() {
// 获取目标模块的基地址
var moduleBase = Module.findBaseAddress("libtarget.so");
// 计算目标变量的内存地址
var targetAddress = moduleBase.add(0x1234);
// 读取内存中的整数值
var value = Memory.readInt(targetAddress);
console.log("Value at address:", value);
});
写入内存
写入内存通常用于修改应用程序的行为。以下是一个使用 Frida 的示例:
Java.perform(function() {
// 获取目标模块的基地址
var moduleBase = Module.findBaseAddress("libtarget.so");
// 计算目标变量的内存地址
var targetAddress = moduleBase.add(0x1234);
// 将整数值写入内存
Memory.writeInt(targetAddress, 42);
console.log("Value written to address:", 42);
});
细分如下:
1.读取指定地址的字符串
var soAddr = Module.findBaseAddress("xxxxx.so");
console.log(soAddr.add(0x2C00).readCString());
2.dump指定地址的内存
console.log(hexdump(soAddr.add(0x2C00)));
3.读指定地址的内存
console.log(soAddr.add(0x2C00).readByteArray(16));
console.log(Memory.readByteArray(soAddr.add(0x2C00),16));//原先的api
4.写指定地址的内存
soAddr.add(0x2C00).writeByteArray(stringToBytes("xiaojianbang"));
console.log(hexdump(soAdd(0x2C00)));
5.申请新内存写入
Memory.alloc()
Memory.allocUtf8String()
6.修改内存权限