아르마딜로 라는 언패킹을 하는 방식을 보여준다. 총 두가지인데
첫번째 방식은 메모리 상에서 실시간으로 패칭이고, 두번째는 일반적으로 파일을 언패킹을 한 뒤, 라이센스를 우회하는 방식이다
일단 아르마딜로는 여러가지 패킹하는 방식이 있지만 OutputStringA라는 함수의 오버플로우를 이용하여 올리디버거가 멈추게하는 방식이였다. 웃프게도 내가 사용한 디버거는 x64dbg이고, OutputStringA의 취약점은 없었기에 그냥 실행되었다... 하지만 프로그램 자체 오류상 디버깅을 하지못하였다..
TEXT 구간에 VB5!를 작성한다. 즉 심볼을 작성한다. 심볼을 작성한 주소를 찾는다. 심볼을 작성하기 위해서 작성할 주소를 스택에 올려야한다. 그렇기에 401000(베이스포인트:40000, text RVA : 1000)로 이동한다. 그 다음, text영역에서 push 'VB5! 주소'를 검색하여 찾는다. 그 부분이 OEP이다.
이는 패킹된 파일이 비주얼 베이직이기 때문에 찾을 수 있다. 그렇다면 어떻게 비주얼 베이직 언어로 만들어는지 알수 있냐가 관건이다. 이는 dll를 보면 알 수 있다.
Crack me를 대신 실습 파일로 설정하였다.
jne 때문에 파일이 실행이 안되어 아래 사진처럼 파일을 jmp로 변경하였다.
아래는 R!SC.P.P.exe에 사용하는 파일이다.
T는 타임이다. 5초 뒤에 파일이 실행되고 패치된다는 것이다. F의 경우 실행되는 파일이다. o의 경우 생성되는 파일이다. P는 패치이다. P의 구조는 패치주소/원래 형태/ 패치 형태이다.
reversMe_crack.exe의 파일 실행원리는 다음과 같다.
1.CreatProcessA -> 프로세스 실행
2.ReadProcessMemory, writeProcessMemory -> 프로세스 패치
3. 끝
패킹되어 있는곳에 바로 패치를 실행하면 파일이 실행되지 않는다. 또한, OEP를 찾고, IAT를 찾는게 힘들 경우 실시간 패치를 진행하면 된다.
게임핵을 만들때 많이 사용된다고 한다...