우선 이번 포스팅은 정신없을거라는 것을 미리 예고한다.... 왜냐면 DLL Injection을 공부하는 과정에서 이것저것 순서없이 공부했고, 아직 더 공부하고싶은 DLL Injection 기법들이 많이 남아있기 때문이다. DLL Injection 이란 ? DLL Injection이란 실행중인 Proecss 혹은 실행하고자 하는 Program에 기본적으로 Load되는 DLL을 제외한 내가 원하는 DLL을 추가(강제)로 삽입하는 기법을 말한다. DLL이 삽입되었다는 말은 내가 DLL을 만들 때 작성한 코드가 해당 Process에서 동작할 수 있다는 의미이고 프로그래머가 의도하지 않은 동작 혹은 추가적인 기능을 수행시킬 수 있다는 뜻이다. DLL이 Injection되어 해당 Process에 Load되는 순간 ..
코드 인젝션이란 ? 상대 Process에 독립 코드를 삽입한 후 실행시키는 기법. 이때 삽입은 CreateRemoteThread API를 이용한다. 최근에는 해당 API가 제대로 동작하지 않는다고 알고 있는데 코드인젝션은 Windows 10 에서도 잘 동작한다...? 뭐지ㅠㅠ 뭘 인젝션해야할까 ? 코드 인젝션시 대상으로 하는 Process의 Memory에 인젝션해야 하는 것들은 아래와 같다. 1. 사용할 API의 주소. ( LoadLibraryA, GetProcAddress ) - 구조체에 FARPROC 자료형으로 선언하며 선택이 아니라 필수이다 !! 2. 사용할 Library 명. ( Ex. user32.dll ) 3. 사용할 API 명. ( Ex. MessageBoxA ) 4. 사용할 데이터. ( E..
저번 포스팅에서는 Detours Library을 이용해서 실행되지 않은 Process에 대해서 DLL을 주입하여 Windows API Hooking하는 실습을 진행했다. 그러나, 실제 이렇게 실행되지 않은 Process에 대해서 DLL을 주입하는 경우는 생각보다 많지 않을 것 같다. 그래서 이번 포스팅에서는 실행중인 Process에 DLL을 Injection해 Hooking을 진행할 수 있는 방법에 대해 소개해보고자 한다. [ DLL Injection ] DLL Injection 기법에는 여러가지 기법이 있겠지만 내가 사용한 방법은 CreateRemoteThread API를 이용한 방법이다. 친구 게임보안 면접질문에서 동작방식이 나왔다고 한다..? (TMI) Injection을 진행하는 코드는 아래와 같..
Detours는 Microsoft사에서 공개한 매우 강력한 Windows API 후킹 라이브러리이다. 기존에는 $9,999 이상의 비용을 내고 사용해야 하던 라이브러리였지만, 현재는 라이센스가 MIT License로 변경되면서 완전 무료 오픈소스로 변경되었습니다. 2002년부터 Microsoft에서 공식적으로 사용해오던 매우 신뢰할 수 있는 라이브러리 입니다. [ 설치방법 ] DownLoad : https://github.com/microsoft/detours Github를 통해 다운로드를 받은 후 "Command Prompt"를 입력해 Visual Studio 터미널창으로 진입한다. 이와 같은 항목이 없을 경우에는 Visual Studio를 설치한 후에 진행하면 된다. 해당 프로젝트를 다운로드 받은 경..
유명한 패커중에 UPX, UPackPE 등등이 존재하는데 이번 포스팅에서는 굉장히 특이한 변형을 통해 PE 파일을 보호하는 UPackPE를 분석하고 이해하여서 PE구조에 대해 좀 더 심도깊은 이해를 해보자. UPackPE에 적용된 기법들을 차례로 설명한다. - 헤더 겹쳐쓰기. 헤더의 불필요한 부분을 낭비하지 않고 그 부분에 또 다른 헤더에 대한 데이터를 교묘하게 겹쳐쓰는 방법을 이용했다. (DOS Header와 PE Header) - DOS Header에서 PE헤더의 Offset을 나타내는 e_lfanew 항목의 값을 0x10으로 바꿔 헤더를 겹쳤다. 이렇게 할 경우 DOS Header의 사용하지 않는 부분에 PE Header의 데이터를 작성할 수 있다. - SizeOfOptionalHeader의 값은 ..
재배치의 핵심은 ImageBase 기준으로 하드코딩된 포인트를 찾는 것!! 무슨말이냐 ? ImageBase가 0x400000 이라고 하면 코드내에서 "Call [ 0x401200 ]" 와 같이 0x400000를 사용된 부분을 하드코딩되었다고 표현한다. 이러한 부분들을 Relocation 되었을 때 새로 바뀐 ImageBase로 수정해주는 작업을 거쳐야한다. 때문에 재배치의 핵심은 이런 하드코딩된 포인트를 찾는 것이라 할 수 있다. PE File Format에는 이러한 포인트들이 기록된 Table이 존재한다. 위 사진에서 보이는 IMAGE_BASE_RELOCATION이 해당 Table이다. 해당 테이블의 Offset 및 Size는 Optional Header의 BASE_RELOCATION Table을 통해..