2017-06-19 34 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

我會試試看,謝謝! –