2017-06-19 46 views
2

我只是想混淆选择的名字,但我不知道如何将一个常数*转换为数值*:如何在LLVM中将常量*转换为值*

void symObfs(Module &M) { 
      errs()<<"Start Obfuscating...\n"; 
      srand (time(NULL)); 
      //Objective-C Method ClassName Stuff 
      for(auto G=M.getGlobalList().begin();G!=M.getGlobalList().end();G++){ 
       GlobalVariable &GL=*G; 
       if (GL.getName().str().find("OBJC_METH_VAR_NAME_")==0||GL.getName().str().find("OBJC_CLASS_NAME_")==0){ 
        ConstantDataArray* Initializer=dyn_cast<ConstantDataArray>(GL.getInitializer()); 
        // string newName = fakeNameGenerator(); 
        string newName = randomString(16); 
        Constant *Value =ConstantDataArray::getString(Initializer->getContext(),newName,true); 
        //GL.setInitializer(Value); 
        errs()<<"Selector Name: "<<Initializer->getAsCString()<<" Obfuscated to: "<<newName<<"\n"; 
        Initializer->Value::replaceAllUsesWith(Value); 
       } 
      } 
} 

谢谢!

回答

2

Constant类继承Value类。

所以你不需要做任何事情来从Constant*转换为Value*。您可以直接将Constant*指定给Value*,因为在C++中,可以将指向子类的对象分配给父类指针变量。

在另一方面,如果你想从分配给Value*Constant*将不得不使用dyn_cast作为

Constant * C = dyn_cast<Constant*>(V); 

这将设置C到NULL如果V中的对象不是确实是一个常数。

+0

但是当我直接传递值,当Xcode的编译测试项目产出: 开始混淆... 选择名称:ALLOC迷惑性:8e6yx4sg2hsihyr 断言失败:(新建 - >的getType()==的getType() &&“用不同类型的新值替换所有值的使用!”),函数replaceAllUsesWith,文件/Users/renqiming/Desktop/llvm_3.9_mod/llvm-3.9.1.src/lib/IR/Value.cpp,第380行。 –

+0

该问题不是从常量*转换为值*,而是您正在创建的新常量(具有混淆名称)不具有与原始常量相同的类型。尝试倾销这两种类型,并检查它们是否相同。 –

+0

我会试试看,谢谢! –

相关问题