본문 바로가기

Android/Tech

안드로이드 OLLVM 빌드 방법

윈도우에서 OLLVM 빌드하는 방법

1) mingw-w64 설치

https://sourceforge.net/projects/mingw-w64/

 

설치 세팅

- C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin 경로 등록

- cmd -> "gcc" 입력해보기

2) cmake 설치

http://www.cmake.org/cmake/resources/software.html

- windows 버전으로 설치 (.msi)

- Release Candidate (3.14)

3) OLLVM 설치

git clone https://github.com/ilee/llvm-obfuscator mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" ..\llvm-obfuscator mingw32-make.exe -j7

- Python 2.7 써야함

4) ndk18-b 설치

5) ollvm 세팅


 

- C:\Users\linfourm\android-ndk-r18b-windows-x86_64\android-ndk-r18b\toolchains 폴더로 가서 ollvm 폴더를 만든다.

- 타 폴더처럼 prebuilt\windows-x86_64 폴더를 만든다.

- make로 빌드한 build 폴더에 bin, lib 폴더를 복사한다.


< C:\Users\linfourm\android-ndk-r18b-windows-x86_64\android-ndk-r18b\build\core\toolchains\arm-linux-androideabi-clang > 

- setup.mk 파일을 열어 위에 두줄을 주석처리 후 아래 3줄과 같이 추가한다.

NDK_TOOLCHAIN_VERSION := clang

- application.mk에서 clang 으로 바꾼다.

LOCAL_CFLAGS += -mllvm -fla -mllvm -sub_loop=10 -mllvm -bcf_loop=5 -mllvm -split -mllvm -split_num=10

- Android.mk에서 추가한다. (알아서 강도 설정)

- 참고 : https://github.com/obfuscator-llvm/obfuscator/wiki

* 윈도우 실행 시 에러날 경우 - /dev/random

\ obfuscator-llvm-4.0 \ lib \ Transforms \ Obfuscation \ CryptoUtils.cpp 소스 코드를 수정해줘야 한다.

bool CryptoUtils::prng_seed() 내부 함수에서 에러가 발생하는데, 아래와 같이 바꿔준다.

 

#include <windows.h> // 헤더도 넣자
#include <wincrypt.h> 
#include <Ntsecapi.h>
...
 
bool CryptoUtils::prng_seed() {
#if defined(_WINDOWS)
...
} else { // 삽입
      HCRYPTPROV prov;
      if (CryptAcquireContext(&prov, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
    {
        if(!CryptGenRandom(prov, 16, (BYTE *) key))
            errs()<<"CryptGenRandom failm\n";
 
        CryptReleaseContext(prov, 0);
 
        memset(ctr, 0, 16);
 
        // Once the seed is there, we compute the
        // AES128 key-schedule
        aes_compute_ks(ks, key);
 
        seeded = true;
        return true;
    }
    errs()<<"Cannot open /dev/random\n";
    return false;
  }
...
}

윈도우에서도 OLLVM 빌드가 가능하다!

 

OLLVM 소스 코드 참조

- ollvm\lib\Transforms\Obfuscation <- cpp

- ollvm\include\llvm\Transforms\Obfuscation <- header

- llvm\lib\Transforms\IPO\PassManagerBuilder.cpp