obfuscator-llvm / obfuscator

3.93k stars 1.18k forks source link

控制流平坦化(flatten)bug及修复 #179

Open lxraa opened 9 months ago

lxraa commented 9 months ago

当入口块(insert)的后继块不等于origBB的第一个元素时,会导致控制流出错,demo:

 extern "C" __attribute((__annotate__(("fla")))) void func(){
    //人类不太会这样写,但是一些生成代码比方说unity的il2cpp时会出现这样的代码
    printf("block1\n");
    int a = 0;
    goto label2;

label:
    printf("block2\n");
    a = 1;
label2:
    {
        printf("block3\n");
        if(a % 2 == 0){
            goto label;
        }
    }
label3:
    {
        printf("block4\n");
        printf("%d\n",a);
        return;
    }
 }

可以在预处理第一个块的时候只要有后继就split,这样就保证了origBB的第一个元素一定是入口块的后继: 原代码

// Flattening.cpp : bool Flattening::flatten(Function *f)
 if ((br != NULL && br->isConditional()) ||
      insert->getTerminator()->getNumSuccessors() > 1) {
...

修复代码:

// Flattening.cpp : bool Flattening::flatten(Function *f)
 if ((br != NULL && br->isConditional()) ||
      insert->getTerminator()->getNumSuccessors() >= 1) {
....