最近分析一个so的时候,发现一个应该是新的混淆方式吧,ida F5之后函数调用都变成了如下形式:
(*(__int64 (__fastcall **)(_QWORD *))(*a1 + 0x60LL))(a1) & 1) != 0 )
函数地址被替换成了*a1 + 0x60LL,这样xref看调用关系就没用了,且从上往下跟的话,静态分析也不知道调用的哪个函数了,分析起来就很麻烦,这种混淆有专有名词吗?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
不吃早饭 https://github.com/amimo/goron/blob/llvm-10.x/llvm/lib/Transforms/Obfuscation/IndirectCall.cpp
boursonjane 父类对象调用基类成员函数吧, 正常的信息损失, 没特意混淆.
不是的,很多不相关的类都是这样调用的,出现次数太多了肯定是混淆了,而且样本里面还有很多其他混淆方式,不能阻止分析,但是确实效率低了
之前没仔细看,楼主你这明显是c++虚函数啊,*a1获取虚函数表,*(__int64 (__fastcall **)(_QWORD *))(*a1 + 0x60LL))获取偏移为0x60的虚函数指针,*(__int64 (__fastcall **)(_QWORD *))(*a1 + 0x60LL))(a1),传入a1作为this指针,完美契合虚函数调用特征。真正的混淆应该是这样的