일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- linux debugging
- pthread
- Android
- initial-exec
- Obfuscator
- so inject
- tracing
- uftrace
- v8 tracing
- on stack replacement
- apm
- Injection
- thread local storage
- 안티디버깅
- TLS
- on-stack replacement
- LLVM 난독화
- custom packer
- anti debugging
- Linux custom packer
- OSR
- 난독화
- v8 optimizing
- android inject
- linux thread
- tracerpid
- pinpoint
- LLVM Obfuscator
- Linux packer
- LLVM
- Today
- Total
목록LLVM-STUDY (67)
Why should I know this?

Facebook의 Redex 라는 프로젝트 코드를 참조하기 위해 보는 중 난해했던 코드를 만났습니다. void LocalDce::dce(IRCode* code, bool normalize_new_instances, DexType* declaring_type) { cfg::ScopedCFG cfg(code); dce(*cfg, normalize_new_instances, declaring_type); } DCE 옵티마이징 과정 중에 이런 코드가 있던거죠. bliveness |= liveness.at(s->target()->id()); 이게 무슨 코드인가? 했는데 dataflow analysis 에서 live analysis(?) 를 DCE에서 같이하는걸로 보이네요. 이에 대해선 차후 포스팅 할 기회가 있을..
mangling 이 필요해진 이유 define internal i32 @"int ArithmeticOpInt.add_int(int, int)"(i32 %v1, i32 %v2) { bb: %0 = alloca i32, align 4 store i32 %v1, ptr %0, align 4 %1 = load i32, ptr %0, align 4 %2 = alloca i32, align 4 store i32 %v2, ptr %2, align 4 %3 = load i32, ptr %2, align 4 %4 = add i32 %1, %3 ret i32 %4 } 위처럼 테스트용 DEX에 산술연산 테스트용 메소드를 작성해 LLVM IR 로 변경했다. 컴파일은 문제 없이 진행된다. 컴파일 한 뒤 objdump 로 심볼을..
Dex2IR 을 개발한지 좀 됐기 때문에 슬슬 구조적으로 생각해야 할 문제들이 보이기 시작해서 기억의 번복을 줄이기 위해 앞으로는 일지를 작성하려고 합니다. 이 글에서 고민하고 싶은건 Class.변환입니다. 바로 들어가죠. 이 고민의 발단이 된 instruction은 iget 입니다. iget-object p3, p0, Lkotlinx/coroutines/android/a;->_immediate:Lkotlinx/coroutines/android/a; iget instruction 을 적절히 처리하려면 이제는 class 구조의 도입이 불가피합니다. iget instruction은 Instance 로부터 field의 값을 읽는 명령어기 때문이죠. Class는 IR에서 어떻게 다뤄지는 확인해봅시다. #incl..
OPT 의 PASS를 개발하는 경우 OPT가 불러들이기 때문에 LLVM LIBS를 링킹하지 않아도 된다. 하지만 LLVM을 기반으로 새 TOOL을 작성하고자 하면 다음처럼 LLVM LIBS를 링킹해줘야 한다. LDFLAGS_LLVM := $(shell llvm-config --system-libs --ldflags --libs) LDFLAGS := -g -lstdc++ -lz -lpthread -ldl $(LDFLAGS_LLVM) 이걸 몰라서 얼마나 고생했는지 ㅠ
LLVM IR 중에 PHI 라는 것이 종종 보인다. PREDS와 PHI 는 처음 LLVM 을 접하게 된다면 생소한 개념이라 약간 헤깔린다. phi 관련 내용은 wiki 에 자세히 나와있으니 참고하시고 (https://en.wikipedia.org/wiki/Static_single-assignment_form) 몇 가지 핵심만 요약정리 해보자. 1. 일단 이름부터 왜 phi 인가하면 기호가 진짜 phi 이다 = called a Φ (Phi) function 2. phi 의 정의 preds가 명목상 모든 연관 노드라고 하면, phi 는 특별하게 연관된 노드이다. 구체적으로 이전 노드에 의존적인 관계에 있는 노드이다. %retval = phi i32 [%a, %btrue], [%b, %bfalse] 위의 ph..
# UFTRACE option-DCMAKE_BUILD_TYPE=debug-DCMAKE_CXX_FLAGS="-pg -g" cmake -G Ninja ../work/llvm-project/llvm -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD="host;" -DLLVM_USE_LINKER=gold -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_RUNTIME=libcxx -DLLVM_ENABLE_RUNTIMES=libcxxabi // 타겟 프로젝트 clang 하나만 지정-DLLVM_ENABLE_PROJECTS="clang" // 타겟 빌드 host 하나만 지정-DLLVM_TARGETS_TO_BUILD="host;" 다음고 같은 옵션은 ..

0. Control-flow integrity 란 무엇인가? 아래 글은 redhat blog에서 퍼온 글입니다. "CFI, or Control-flow integrity, may refer to any mechanism which tries to ensure the execution flow is valid when calling or returning from functions during the software’s runtime. Some of the hardenings mentioned earlier in the introduction can be considered CFI protection. Most of them are implemented by both GCC and Clang, howeve..