일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안티디버깅
- initial-exec
- v8 tracing
- v8 optimizing
- so inject
- Android
- apm
- android inject
- Obfuscator
- anti debugging
- Linux packer
- custom packer
- on stack replacement
- pthread
- linux thread
- pinpoint
- tracerpid
- TLS
- OSR
- tracing
- linux debugging
- uftrace
- 난독화
- LLVM 난독화
- Injection
- thread local storage
- Linux custom packer
- on-stack replacement
- LLVM Obfuscator
- LLVM
- Today
- Total
목록Technic (13)
Why should I know this?
* 상황 1. fix-issue-001 이란 이름으로 만든 Branch에서 작업 후 Github에서 Pull Request 를 보낸 후 2. Remote의 fix-issue-001 Branch를 삭제하고 3. 새로 만든 동일한 이름의 fix-issue-001 Branch로 force-push 한 경우 * 문제 위와 같이 Branch를 새로 만든 후 push 한 경우, 이미 보낸 Pull Request로 갱신이 되지 않는다. 물론 PR을 새로 올리는 것도 방법이지만, 이미 보내놓은 PR에서 의견 소통이 이뤄진 경우 이 흔적을 지우는건 좋지 않다. * 해결책 먼저 현재의 브랜치 fix-issue-001 를 이름을 변경한다. 대충 fix-issue-001___ 로 변경했다고 치자. 과거의 브랜치를 복구한다 g..
https://docs.github.com/ko/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent 새 SSH 키 생성 및 ssh-agent에 추가 - GitHub Docs SSH(보안 셸 프로토콜)를 사용하여 GitHub.com의 리포지토리에서 데이터를 액세스하고 쓸 수 있습니다. SSH를 통해 연결할 때 로컬 머신에서 프라이빗 키 파일을 사용하여 인증합니다. 자세한 내용은 docs.github.com
개발자들은 주로 주석을 통해 많은 정보를 코드에 덧붙여놓는데 자체 Trace 코드를 추가하면 장점이 있습니다. 1. 복기에 좋다. 2. 유지보수에 좋다. 3. 후임자에게 인수인계하기 좋다. 4. 개발자 외에 관여자에게 설명하기 쉽다. 제가 권하고 싶은 log와 trace의 차이 및 활용법은 다음과 같습니다. log는 개발 과정에서 세밀한 것들을 확인할 때 활용될 수 있는 메시지이고, trace는 개발 외의 과정에서 프로그램의 동작을 확인할 때 활용될 수 있는 메시지 입니다. 다음 코드는 제가 작성한 코드 일부입니다. /** * Function : emulator * ----------------------- * Determine if current device is an emulator * * retur..
* DroidKnights 2021 에서 발표했던 내용 일부를 발췌한 글 입니다.* Native 코드를 개발할 때, 특히 Android 와 같이 개발사/기기사 간 특수성이 존재하는 개발환경에서는 시스템에 밀접한 작업을 하는 보안 모듈 특성 때문에 충분한 테스트가 늘 아쉽기 마련이다. 혹시 모를 경우를 대비해 Crash를 Handling함으로서 적어도 Crash 때문에 배포날의 긴장도를 낮춰보도록 하자. 예제 코드 : https://github.com/ParkHanbum/mystudy/tree/master/signal_handler 시나리오는 다음과 같다. 1. 갱신된 함수를 실행하기 전에 signal 들에 대한 handling 추가. 2. signal 이 발생했을 경우를 위한 복원점 지정 3. signa..
Hashmap을 uftrace에서 활용하기 위해 Android 구 버전에서 hashmap 구현을 복붙하는 과정에서, https://github.com/ParkHanbum/android_c_hashmap GitHub - ParkHanbum/android_c_hashmap: C collection hashmap from android (4.3) C collection hashmap from android (4.3). Contribute to ParkHanbum/android_c_hashmap development by creating an account on GitHub. github.com Hashmap의 구현에 대해 조금 공부를 해보게 됐다. Hashmap에 대해서는 이 블로그를 참고하면 좋을 것 같다...
설명 : C/C++ 코드의 초기 버전을 찾아 히스토리를 보는게 가끔은 유용할 때가 있다. 위처럼 초기 버전을 찾아가는 C/C++ 코드에서는 소스코드 마지막 라인을 blame해서 쉽게 초기 버전을 찾을 수 있는 경우가 많다. 예2) m@M:~/llvm-project/llvm/lib/Transforms/Scalar$ wc -l LoopInstSimplify.cpp 247 LoopInstSimplify.cpp m@M:~/llvm-project/llvm/lib/Transforms/Scalar$ git blame -L247,+1 LoopInstSimplify.cpp e6c30fdda7991 (Chandler Carruth 2018-05-25 01:32:36 +0000 247) } m@M:~/llvm-project..
Droid knights에서 발표한 "Android Native Module 안정적으로 개발하기" 내용 중에 내가 만든 TRY-CATCH 매크로를 공유했었는데 대충 이런식이었다. void do_signal_handling() { int sig = 0; int watch_signals = sigill | sigtrap | sigabrt | sigbus | sigsegv; fprintf(stderr, "fn size : %lx\n", get_func_size((unsigned long)&do_segv)); TRY(sig, watch_signals, do_segv1) { do_segv1(); } CATCH (sig, sigsegv, e) { fprintf(stderr, "inside catch!!\n"); f..
오픈소스에서 원하는 코드를 쉽게 찾는 방법을 알아보겠습니다. 이번에 찾고자 하는 코드는 gdb에서 특정 함수를 호출할 수 있게 해주는 로직! 예를 들면, gdb에서는 다음과 같은 명령을 수행할 수 있습니다 (gdb) call (void *)dlopen("/home/m/signal-checker.so", 2) I am 18500 Hello, I'm loaded!! $1 = (void *) 0x55555555a2d0 위의 명령처럼 target process context에서 특정 함수의 호출이 가능합니다. 예제에서는 dlopen을 통해 so를 로드했고, 그 결과 so의 init에서 출력해주는 메시지를 볼 수 있습니다. 1. gdb 를 tracing 가능한 형태로 컴파일한다! m@Hanbum:~/binutil..
nox 탐지 이건 빼박캔트 nox 뿐 아니라 vbox 사용하는 x86 계열 에뮬레이터 다 잡을 수 있는 시그니처 핵심은 탐지하고자 하는 대상에서 결코 사용하지 않을 수 없는 부분을 찾는 것. i8042 는 가상머신과 리얼머신간 키보드 연결을 위해 사용하되는 가상화 디바이스. 즉, 가상머신이 키보드를 사용하지 않기로 하지 않은 이상 없어질 수 없다. (동시에 i8042는 구형 IBM/PC의 키보드 스펙이므로 리얼머신에 존재할리 없다. 모바일은 더더욱)
C/C++ 에서 특수한 목적으로 함수의 크기를 구하려고 한다면 셋 중 하나의 결과가 나온다. 1. 컴파일 된 binary를 nm 등을 사용해 symbol 주소와 크기를 구한다. 이런 방식으로 함수의 크기를 사용하려면 컴파일 한 후 binary에 writing해주는 과정이 필요하다. 2. 선언된 함수 뒤에 크기 계산용 더미 함수를 추가하여 주소를 계산한다. 아래와 같은 방식이다. static void fn_need_to_know_size() { return 0; } static void fn_to_mark_end() { return 0; } unsigned long size = (unsigned long)&fn_need_to_know_size - (unsigned long)&fn_to_mark_end; 하..