MachO文件的符号混淆

原文转载

见好像没人写MachO程序函数符号混淆的内容,但蛮实用的,那由我来介绍下<

函数符号,无论是内部函数,还是外部引用的函数都定义在LC_SYMTAB

symoff是函数符号表的文件偏移位置,这个符号表由nlist/nlist_64结构体组成,定义在mach-o/nlist.h,nsyms是数量

stroff是字符串表的文件偏移位置,strsize是大小

n_un.n_strx 是这条符号的字符串,值是文件偏移相对于字符串表
n_type 决定了这个符号的用处,对于反编译工具来说,比如修改n_type,可以使一个私有函数变成可以用dlsym引用的函数(小t>大T)
n_sect 表示这条符号关联的section
n_desc 在定义的文件中#include <mach-o/stab.h>,注释看起来和符号类型有关.但符号类型实际是和type有关,暂时不太清楚,函数的符号这个值通常为0,名字叫describe(描述),所以应该是一种可有可无的东西吧
n_value 对函数符号来说,这个就是和这个符号关联的值的函数的VM位置

n_type为0xf的时候是一般的函数符号,通常就是T,作为动态库,就是外部是可以引用的符号,但也可能是变量,区分这个看n_sect,函数符号的n_sect一般为0x1,_text,为0xe或者0x1e是内部符号,通常都是小写的,比如t,这个其他的就靠大家自己去摸索了

这些都可以随便改,不会影响程序运行

代码在此:
https://github.com/CocoaHuke/Check_and_Modify_machO_symbol

2 Likes

之前我Github开源的就有这些。

能做的远比这个多的多的多

好啦_下次发有营养点的…>_

对新手很有帮助 :thumbsup:

Nah我没说没营养,我的意思是你可以继续深挖 : )

…嗯

除了实际的个别段内容完全不能更改外整个MachO一大堆地方可以捣鼓

慢慢玩吧w

                             nn->n_value = 0x0;
                            nn->n_type = 0xF;
                             memset(nn,0xFF,sizeof(struct nlist_64));

这个改了之后,为什么macho文件无法用machoview打开了。

解析会崩,MachOView没适配畸形MachO

张总,我去你github上去找了下,结果没找到你的关于修改macho的库啊

啊我可能删了。仔细找找

这个跟在IR层去修改有区别吗。我再仔细看看

有。这个对应ld层的手脚

那最后的效果应该是一样的把。这个如果去改string table的话,一样可以达到效果感觉。

我看到某宝的结果是这样子的

虽然我看不出来这是从哪个层面修改的,但是value都改为0??????
strx 改为一个字符串??????
这样都能运行?????????????????????

是啊我都是这么干的啊

????

我终于知道自己欠缺的是什么了,所以问的问题才这么白痴。什么都不懂,在这瞎问。:persevere:感觉打开了一个新世界。

哇谢谢大神指点我们都不知道Release会strip掉符号表呢

/s