일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- linux debugging
- v8 optimizing
- Linux custom packer
- uftrace
- android inject
- anti debugging
- 난독화
- LLVM 난독화
- Android
- so inject
- custom packer
- thread local storage
- OSR
- apm
- initial-exec
- tracerpid
- LLVM Obfuscator
- Injection
- Linux packer
- pthread
- LLVM
- linux thread
- on stack replacement
- v8 tracing
- TLS
- tracing
- Obfuscator
- 안티디버깅
- pinpoint
- on-stack replacement
- Today
- Total
목록Knowledge (33)
Why should I know this?
모종의 이유로 Linux에서 AOSP를 빌드한 후 DEX를 실행하고 싶다면 이 글이 도움이 될 겁니다. 먼저 Linux에서 AOSP를 빌드할 때 사용하시는 컴퓨터에 맞는 아키텍처로 빌드하세요. 아직까지 AOSP는 x86에서만 빌드할 수 있으므로 x86_64를 선택하시면 될겁니다. dalvikvm을 실행하기 위한 스크립트 : #!/bin/sh # base directory, at top of source tree; replace with absolute path base=`pwd` # configure root dir of interesting stuff root=$base/out/target/product/generic_x86_64/system export ANDROID_ROOT=$root # confi..
과거 Linux에서 사용할 수 있는 Thread Local Storage 종류와 차이를 다룬 적이 있다. https://die4taoam.tistory.com/37 Linux의 thread local storage 파헤치기 Thread Local Storage 파헤치기 0. 개요Thread Local Storage는 Multi-Thread 프로그램을 작성하는데 거의 필수로 사용되는 기능이다.Linux에서의 Thread Local Storage에 대하 자세히 다뤄보고자 한다. 이 글에서 다루 die4taoam.tistory.com Linux TLS 에 대한 설명은 링크에 있다. Linux TLS 를 공부하게 된 이유는 Nodejs Tracing 기능을 Uftrace에 넣기 위한 시도 중에 재귀호출이 확인되..
여러가지 이유(?)로 SystemCall를 직접 하는 경우가 존재합니다. 해서 이번 글에서는 간단히 SystemCall을 직접하는 방법을 알아볼까 합니다. /* * Generic syscall call. * Upon entry: * %rax: system call number * %rdi: arg0 to system call * %rsi: arg1 * %rdx: arg2 * %rcx: arg3 - syscall expects it at %r10 * %r8: arg4 * %r9: arg5 */ #include "arch/bionic_asm.h" ENTRY_PRIVATE(syscall) # All arguments are passed via registers. # (Not all will be valid, ..
Frida 같은 도구가 Hooking을 통해 여러가지 인터페이스를 제공하죠. 이번 글에서는 Android의 Java Layer에서 어떻게 Hooking이 벌어지는지 아주 간단히 살펴보고자 합니다. >Class 가 LOAD 되는 과정 입니다. 위 그림처럼 Class의 설계도는 .dex=안드로이드 파일에 보관되어 있습니다. class를 생성하는 과정에서 해당 설계도를 기반으로 ClassObject를 만듭니다. Class는 Variable/Method 로 이루어져있고 Variable은 ClassObject에, Method들은 Method 를 보관하는 테이블에 보관되며 해당 Method들에 대한 Index가 vtable에 보관됩니다. 위에서 언급한 과정을 좀더 자세히 도식화하면 위와 같습니다. 1. 첫 번째 H..
AOSP 에서 ART 라고 불리는 Android runtime은 DEX Bytecode를 Compile 하는 기능이 포함되어 있습니다. 해당 Compile에는 Optimizing 도 포함되어 있으며 이 글은 LoopOptimizing을 살펴보고자 작성했습니다. 최적화는 매우 어렵운 분야라는 생각이 있고 실제로도 그렇지만 LoopOptimizing 은 얕게 보면 이런것도 최적화야? 라는 생각이 들게 합니다. 그만큼 입문으로 좋지 않을까 하네요?! ETRI에서 낸 PAPER중에 Static Dalvik Bytecode Optimization for Android Applications 이 있습니다. 이 논문에서는 DEX bytecode를 LLVM IR로 변환하여 Loop 최적화를 하는 과정을 소개하고 있습니..
본문 작성에 앞서 해당 난독화 기법의 모티브를 소개합니다. engineering.linecorp.com/ko/blog/code-obfuscation-compiler-tool-ork-2/ 오크(ORK) – 난독화 컴파일러 도구 2편 - LINE ENGINEERING 안녕하세요. LINE에서 클라이언트 보호 솔루션인 AIR ARMOR 개발을 담당하고 있는 정상민입니다. 지난 1편에선 예제 소스 코드의 컴파일 과정을 살펴보며 난독화가 실행되는 단계를 확인했습니다. engineering.linecorp.com Line에서 자체 개발 중인 난독화 기법 중에 Control Flow Graph Flattening 이라고 소개된 기법이 있습니다. 말하자면, 뭐 이것은 Line에서도 쓰는 기법이다! 라고 호가호위 해보려..
난독화 기법을 조금이라도 더 쉽게 개발하는 방법은 다음과 같다. - C로 짠 로직을 통해 IR을 뽑아내기 - IR을 기반으로 LLVM OPT 패스 만들기 먼저 순수 C로 예제코드를 만들고, C에서 목적한 난독화 기법을 구현해본다. 이번에 구현하고자 하는 난독화는 CALL 을 난독화 하는 것이며, C 로 구현된 코드는 아래와 같다. #include void foo(); void (*t)() = foo; void (*tt)() = (void (*)())((long)&foo + 1); long test = ((long)&foo) + 65536; long test2 = (long)&foo + 1; void foo() { puts("TEST\n"); } int main() { ((int (*)()) (test -..
LLVM은 GCC와 함께 컴파일러의 양대 산맥을 이루는 오픈소스 컴파일러 프로젝트이며, 컴파일러를 넘어 자신들을 '컴파일러 툴킷'으로 소개한다. 요컨데 컴파일러를 제작하기 위해 필요한 여러가지 공구들을 모아놓은 공구함이라고 할 수 있겠다. LLVM은 Front/Middle/Back 의 3단 분리를 명확하게 하고, 분리된 단 간 그리고 각 단 속에서의 PLUGIN 을 지원하기 위해 추상화 된 데이터 표현 계층인 Intermdediate Reperesntation (=IR)을 사용한다. 이런 구조를 통해 LLVM은 LLVM 참여자 뿐 아니라 컴파일러를 활용하거나 독자 모듈을 구현하는 사람들에게 광풍과도 같은 인기를 얻었으며 거의 모든 컴파일러 논문 및 연구가 LLVM을 기반으로 이뤄지게 되는 원동력을 제공할..
/system/bin/dex2oat --zip-fd=6 --zip-location=/system/app/Email.apk --oat-fd=7 --oat-location=/data/dalvik-cache/system@app@Email.apk@classes.dex --profile-file=/data/dalvik-cache/profiles/com.android.email /system/bin/dex2oat --image=/data/dalvik-cache/system@framework@boot.art --runtime-arg-Xms64m --runtime-arg -Xmx64m --dex-file=/system/framework/core-libart.jar --dex-file=/system/framework/c..
ARMv7 아키텍처에서 동적생성된 코드를 실행하거나 복호화 후 실행 시에 알 수 없는 이유로 SIGSEGV 나 SIGILL이 발생하는 경우가 있습니다. 빈도 또한 일정치 않고, 디버깅조차 어려우므로 이곳에 해결책을 기재해 공유하고자 합니다. 해결책은 Android의 다음 commit 을 참조하시면 됩니다. git clone https://android.googlesource.com/platform/art git show aeba572be73559c310de758dbcdac901e064ec07 platform/art - Git at Google android.googlesource.com 위의 코드에 대한 설명은 다음과 같습니다. 가상메모리가 물리메모리와 매핑되어 있지 않을때 Cacheflush는 실패합니..