最近分析一个so的时候,发现一个应该是新的混淆方式吧,ida F5之后函数调用都变成了如下形式:
(*(__int64 (__fastcall **)(_QWORD *))(*a1 + 0x60LL))(a1) & 1) != 0 )
函数地址被替换成了*a1 + 0x60LL,这样xref看调用关系就没用了,且从上往下跟的话,静态分析也不知道调用的哪个函数了,分析起来就很麻烦,这种混淆有专有名词吗?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
不吃早饭 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指针,完美契合虚函数调用特征。真正的混淆应该是这样的