实际内存地址和Stalker输出地址不匹配不一致
某次Stalker调试的log是:
===== dynamicDebug/frida/scripts/fridaStalker_akdSymbol2575.js =====
funcRelativeStartAddr=656480, functionSize=9416, funcRelativeEndAddr=665896
moduleName=akd, moduleBaseAddress=0x10054c000
funcRealStartAddr=0x1005ec460, funcRealEndAddr=0x1005ec4609416
[iPhone::PID::13098 ]-> ----- arg0=0xfffffffffffffffe, arg1=0x16fe26838, arg2=0x16fe26838, arg3=0xfffffffffffffffe
curTid= 26635
+++ into iterator=
[0x1071dbcd8] b #0x1071dbce8
+++ into iterator=
[0x1071dbce8] str wzr, [x19, #0x90]
[0x1071dbcec] ldr x0, [x19, #0xa0]
[0x1071dbcf0] str xzr, [x19, #0xa0]
[0x1071dbcf4] cbz x0, #0x1071dbcfc
+++ into iterator=
[0x1071dbcf8] bl #0x1070dfef8
+++ into iterator=
[0x1071dbcfc] ldr x0, [x19, #0x98]
[0x1071dbd00] str xzr, [x19, #0x98]
[0x1071dbd04] cbz x0, #0x1071dbd14
...
其中指令地址看起来不匹配=不一致:
- 指令地址:0x1071dbcd8
- 函数二进制内偏移量:0xa0460
- 此处akd模块基地址:0x10054c000
- 所以函数的实际真实起始地址:0x1005ec460
- 此处akd模块基地址:0x10054c000
后来才明白是:
Frida的Stalker中,看到2个函数地址不匹配:
- 函数实际内存起始地址:
0x1005ec460
- 0x1005exxxx 之类的地址
- Stalker中运行期间的函数地址:
0x1071dbcd8
- 0x1071dxxxx 之类的地址
的原因:
Stalker内部的hook指令的原理就是:把当前代码拷贝一份,加上hook代码及其他逻辑
而此处的:拷贝一份,到别处,别的一段内存地址空间,此处就是指的是:
- 0x1071dbcd8
- 0x1071dxxxx 之类的地址
所以,原始函数代码和被Stalker去hook的代码,两个地址是不同的,是可以理解的。