Mach-O中的地址查找
函数地址查找
1.预备test.m
文件
void test(){
}
void test1(){
}
int global = 10;
int main(){
global = 21;
global = 20;
test();
test1();
return 0;
}
2.生成可执行文件。终端运用如下指令:
//将test.m生成可执行文件test
clang test.m -o test
3.检查代码段。终端运用如下指令:
objdump --macho -d test
//将test.m生成政策文件test
clang -c test.m -o test.o
objdump --macho -d test.o
- 编译是按照文件声明的次序编译的,即:_text、_text1、_mai补码下标怎样增加n
-
e8
固定机器码,代表callq
指令 -
C
框函数_text
地址等于A
框偏移量加B
框偏移量
-
_text1
函数的偏移量都是0,但是往上面看能够看到,_test1
偏补码原码反码怎样转化移量是10,所以,当时函数调用的地址并不是实在的地址。链接的时分还会分配虚拟内存地址,链接的时分要告知编二进制转化器译器将实在的地址拿过来掩盖这些占位的00 00 00 00
,_test1
放到重定位符号表里
5.检查需求重定位的符号:
objd二进制转八进制ump --macho --reloc test.o函数调用中的参数太少
在编译成方补码是什么意思针文件的时分,没函数调用c言语有分配实在的虚拟内存地址,用了暂时变量占位,把函数调用能够作为一个函数的形参需求从头定位的函数放到重定位符号表里
6.生成可执行ios模拟器文件并检查:
clang tes补码原码反码怎样转化t.m补码求原码 -o test
objdumios下载p --macho -d test
iOS是小端形式,这儿最高位便是ff,所以为负,ff是补码求原码补码,需求变成原码,所有的1取二进制手表反后为0,所以这儿直接看b8。
b8现在是补码,求原码
b8(补码)二进制表明:补码求原码10111000
反码(补码-1): 10110111
原码(反码取反): 01001000
当时算出的原码16进制便是0x48
因为高位是ff,为负
_test
地址就等于0x100003FA8
加上ios14.4.1更新了什么负的0x48
等于0x100003F60
globle变量地址查找
21的十进制便是15
21地址便是0x100003f99
+0x4067
便是ios最好玩的手游 0x100008000
检查macho所有内容
objdump --macho -s test