OLLVM 빌드 방법

홈 > 안드로이드 > 안드로이드
안드로이드

OLLVM 빌드 방법

M LIN 14 18336 4

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

1) mingw-w64 설치

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

1083dbe0cf9e25c840c9d67cdb868f65_1571324799_9178.PNG

설치 세팅

1083dbe0cf9e25c840c9d67cdb868f65_1571324807_8939.png

- 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 폴더를 복사한다.

1083dbe0cf9e25c840c9d67cdb868f65_1571325256_8267.png
< 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() 내부 함수에서 에러가 발생하는데, 아래와 같이 바꿔준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h> // 헤더도 넣자
#include <wincrypt.h>
#include <Ntsecapi.h>
...
 
bool CryptoUtils::prng_seed() {
#if defined(_WINDOWS)
...
else { // 삽입
      HCRYPTPROV prov;
      if (CryptAcquireContext(&prov, 00, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
    {
        if(!CryptGenRandom(prov, 16, (BYTE *) key))
            errs()<<"CryptGenRandom failm\n";
 
        CryptReleaseContext(prov, 0);
 
        memset(ctr, 016);
 
        // 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\lib\Transforms\Obfuscation <- cpp

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

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

 

, ,

14 Comments
6 하늘사자 2019.10.19 00:06  
린님.. 멋지십니다..
공유 감사합니다.
1 drockefeler007 2019.10.22 22:07  
공유 감사합니다.
2 username 2019.12.13 03:26  
그게 내가 찾는거야
3 쥬스 2019.12.13 11:18  
와우 감사합니다
3 쥬스 2019.12.16 16:14  
드디어 성공했네요..! 감사합니다~_~
1 rafael 2019.12.28 12:46  
감사합니다
28 사딸라 2020.01.07 08:20  
감사합니다
7 래바리 2020.04.03 18:40  
감사합니다.
2 rjsejrrjsejr 2020.04.16 05:28  
좋은팁이네용
1 rhddnfl 2020.05.19 18:21  
감사합니다 ^^
1 아리송당 2020.07.30 09:45  
감사합니다.
4 쿨록 2020.08.07 18:53  
공유 감사합니다
2 username 2020.09.14 18:24  
link to github has been deleted. please update
2 공적1 2021.09.06 03:04  
감사합니다~