函数地址查找

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

Mach-O中的地址查找
4.检查.o文二进制件的代码段:终端运用如下指令:

//将test.m生成政策文件test
clang -c test.m -o test.o
objdump --macho -d test.o

Mach-O中的地址查找

  • 编译是按照文件声明的次序编译的,即:_text、_text1、_mai补码下标怎样增加n
  • e8固定机器码,代表callq指令
  • C框函数_text地址等于A框偏移量加B框偏移量

Mach-O中的地址查找

  • _text1函数的偏移量都是0,但是往上面看能够看到,_test1补码原码反码怎样转化移量是10,所以,当时函数调用的地址并不是实在的地址。链接的时分还会分配虚拟内存地址,链接的时分要告知编二进制转化器译器将实在的地址拿过来掩盖这些占位的00 00 00 00 _test1放到重定位符号表里

5.检查需求重定位的符号:

objd二进制转八进制ump --macho --reloc test.o函数调用中的参数太少

Mach-O中的地址查找

Mach-O中的地址查找_test1的地址是49,比照就能找到占位地址方位

在编译成方补码是什么意思针文件的时分,没函数调用c言语有分配实在的虚拟内存地址,用了暂时变量占位,把函数调用能够作为一个函数的形参需求从头定位的函数放到重定位符号表里

6.生成可执行ios模拟器文件并检查:

 clang tes补码原码反码怎样转化t.m补码求原码 -o test
 objdumios下载p --macho -d test

Mach-O中的地址查找
iOS是小端形式,这儿最高位便是ff,所以为负,ff是补码求原码补码,需求变成原码,所有的1取二进制手表反后为0,所以这儿直接看b8。

b8现在是补码,求原码

b8(补码)二进制表明:补码求原码10111000

反码(补码-1): 10110111

原码(反码取反): 01001000

当时算出的原码16进制便是0x48
因为高位是ff,为负
_test地址就等于0x100003FA8加上ios14.4.1更新了什么负的0x48等于0x100003F60

Mach-O中的地址查找

globle变量地址查找

Mach-O中的地址查找
c7 05 是movl补码求原码指令

21的十进制便是15

21地址便是0x100003f99+0x4067 便是ios最好玩的手游 0x100008000

检查macho所有内容

objdump --macho -s test

Mach-O中的地址查找
红框后边Oa便是代码中的int globaios下载l = 10;