日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WIN10 x64搭建OLLVM4.0 android NDK 编译环境跨坑指南

發布時間:2024/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WIN10 x64搭建OLLVM4.0 android NDK 编译环境跨坑指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文參考大量相關博客,甄選出有用的文章,幫助大家遠離陷阱,節省時間。

目錄

    • 平臺說明
    • 環境準備
    • 添加String混淆
    • 集成到ndk編譯工具鏈
    • 模式介紹與使用方法
    • 編譯錯誤 Cannot open /dev/random


平臺說明

window10 64bit
android studio 3.6.1

環境準備

下載OLLVM4.0源碼
編譯請閱讀文章 記錄編譯OLLVM 4.0 Windows x64
注意事項:
1、如果系統是x64,選擇VS2017編譯的朋友注意了,我cmake之后并沒有生成 sln項目文件,所以考慮用mingw64編譯。
2、采用低版本的mingw64編譯,我使用的是 x86_64-5.4.0-release-posix-seh-rt_v5-rev0
,最新的8.1.0版本會產生如下編譯錯誤(char與unsigned char 轉換的問題):

In file included from C:\Users\lilin\Desktop\obfuscator-llvm-4.0\tools\lli\lli.cpp:30: C:/Users/lilin/Desktop/obfuscator-llvm-4.0/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h: In member function 'llvm::Expected<std::vector<char> > llvm::orc::remote::OrcRemoteTargetClient<ChannelT>::readMem(char*, llvm::JITTargetAddress, uint64_t)': C:/Users/lilin/Desktop/obfuscator-llvm-4.0/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h:696:26: error: could not convert '((llvm::orc::remote::OrcRemoteTargetClient<ChannelT>*)this)->callB<llvm::orc::remote::OrcRemoteTargetRPCAPI::ReadMem>(Src, Size)' from 'Expected<vector<unsigned char,allocator<unsigned char>>>' to 'Expected<vector<char,allocator<char>>>'return callB<ReadMem>(Src, Size);

3、編譯指令:

cd obfuscator-llvm-4.0 mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release ../ make -j8 # 注意make 由 C:\mingw64\bin\mingw32-make.exe 重命名為 C:\mingw64\bin\make.exe 所得

添加String混淆

挺孤花– 由上海交通大學密碼與計算機安全實驗室維護的LLVM混淆框架,我們挑選其中的String混淆集成到OLLVM框架。
具體步驟參考文章 iOS混淆-ollvm中添加對String的混淆


集成到ndk編譯工具鏈

具體步驟參考文章 android studio 3.3.2 + ollvm 環境搭建
注意事項
1、高版本ndk-bundle無法使用,切換到ndk 14b 各個android ndk下載
2 、編譯時缺失頭文件根據則根據錯誤提示從 obfuscator-llvm-4.0\build\lib\clang\4.0.1\include 下選擇添加
3、將現有的ndk切換到 14b版本
在項目目錄下更改local.properties

#ndk.dir=<yousdk>\\ndk-bundle ndk.dir=<yousdk>\\android-ndk-r14b sdk.dir=<yousdk>

模式介紹與使用方法

  • 控制流扁平化
    這個模式主要是把一些if-else語句,嵌套成do-while語句
    -mllvm -fla:激活控制流扁平化
    -mllvm -split:激活基本塊分割。在一起使用時改善展平。
    -mllvm -split_num=3:如果激活了傳遞,則在每個基本塊上應用3次。默認值:1

  • 指令替換
    這個模式主要用功能上等效但更復雜的指令序列替換標準二元運算符(+ , – , & , | 和 ^)
    -mllvm -sub:激活指令替換
    -mllvm -sub_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1

  • 虛假控制流程
    這個模式主要嵌套幾層判斷邏輯,一個簡單的運算都會在外面包幾層if-else,所以這個模式加上編譯速度會慢很多因為要做幾層假的邏輯包裹真正有用的代碼。
    另外說一下這個模式編譯的時候要浪費相當長時間包哪幾層不是鬧得!
    -mllvm -bcf:激活虛假控制流程
    -mllvm -bcf_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1
    -mllvm -bcf_prob=40:如果激活了傳遞,基本塊將以40%的概率進行模糊處理。默認值:30

  • 字符串混淆
    -mllvm -sobf:編譯時候添加選項開啟字符串加密
    -mllvm -seed=0xdeadbeaf:指定隨機數生成器種子流程

使用示例

android {defaultConfig { externalNativeBuild {cmake {cppFlags "-mllvm -fla -mllvm -sub -mllvm -bcf -mllvm -sobf -mllvm -seed=0xdeadbeaf"}} }

具體參考 OLLVM代碼混淆移植與使用


編譯錯誤 Cannot open /dev/random

linux下才使用 " /dev/random"。解決方法參考文章 ollvm 使用——“Cannot open /dev/random”錯誤的解決方法
實測上述方案會導致clang++無法退出,修改如下(參考 C語言rand()獲取隨機數和windows下的CryptGenRandom)

bool CryptoUtils::prng_seed() {bool bRet = false;HCRYPTPROV Rnd;LPCSTR UserName = "MyKeyContainer";if(CryptAcquireContext(&Rnd, UserName, NULL, PROV_RSA_FULL, 0)) {printf("A cryptographic context with the %s key container ",UserName);printf("has been acquired.\n\n");bRet = true;} else {if (GetLastError() == NTE_BAD_KEYSET) {if(CryptAcquireContext(&Rnd,UserName,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) {printf("A new key container has been created.\n");} else {printf("Could not create a new key container.\n");//exit(1);bRet = false;}} else {printf("A cryptographic service handle could not be ""acquired.\n");//exit(1);bRet = false;}}if (bRet) {if (CryptGenRandom(Rnd, 4, (BYTE*)key)) {//printf("%d\n\n", key);memset(ctr, 0, 16);// Once the seed is there, we compute the// AES128 key-scheduleaes_compute_ks(ks, key);seeded = true;bRet = true;}else {puts("Windows CryptGenRandom Error\n");bRet = false;}if (CryptReleaseContext(Rnd,0)) {printf("The handle has been released.\n\n");} else {printf("The handle could not be released.\n\n");}}return bRet; }

總結

以上是生活随笔為你收集整理的WIN10 x64搭建OLLVM4.0 android NDK 编译环境跨坑指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。