강의정리 14

[x86-64] Chapter 7 - Windows/7.1 Virtual Memory.md

7.1 Virtual Memory 컴퓨터에는 RAM이라고 불리는 물리 메모리가 있다는 것을 알고 있을 것입니다. 그러나 이 메모리는 어떻게 액세스할까요? 물론 주소를 갖고 있지만 불행히도 그렇게 간단하지는 않습니다. - 시스템에서 여러 프로세스가 실행중인 경우 각 프로세스의 메모리 영역을 지정하는 방법이 필요합니다. - 또한 공간 문제가 발생하기 시작합니다. 4GB의 물리 메모리를 가지고 있지만 실행하려는 프로세스에 6GB가 필요한 경우 어떻게합니까? - 프로그램이 실행될 때마다 동일한 주소 공간에 프로그램이 로드되지 않으면 하드 코드된 주소는 작동하지 않습니다. - 조각화는 어떻습니까? 작은 프로그램이 종료되고 이제는 사용 가능한 메모리 영역에 새 프로세스를 위한 공간이 충분하지 않으면, 그것은 낭비된..

CURRENTLY IN DEVELOPMENT (Chapter 7 - Windows)

https://github.com/0xZ0F/Z0FCourse_ReverseEngineering/blob/master/Chapter%207%20-%20Windows/7.1%20VirtualMemory.md 이 장에서는 Windows OS의 기본적인 내부 작업에 대해 설명합니다. 대부분의 주제는 기본 수준으로 만 다루고 필요한 정보 만 다룹니다. 이 코스에는 너무 많은 Windows OS가 있습니다. 자세한 내용을 알고 싶다면 "Windows Internals"서적은 환상적인 자료입니다. 그리고 내가 알아야 할 것이 많았을 때, 그 책들에 1 부와 2 부가 있으며, 각각은 평균 글꼴 크기보다 약간 낮은 600-700 페이지입니다. This chapter is currently in development a..

[x64] DLL/6.09 ImplementingPlayer + 6.10 Final Notes.md

OPTIONAL: 6.09 Implementing Player Player 클래스를 반대로 변경 했으므로 Player 클래스를 만들고 클래스와 관련된 함수를 사용하는 자체 프로그램을 작성하겠습니다. 플레이어의 이름은 std :: string 일 필요는 없으며 const * 문자 일 수도 있습니다. ~~그림~~ Copy&Paste 코드 #include #include class Player { public: int score; float health; std::string name; }; //void __cdecl InitializePlayer(class Player * __ptr64) typedef void(WINAPI* IInitializePlayer)(Player*); // ?InitializePla..

[x64] Chapter 6 - DLL/6.08 MysteryFunc.md

6.08 MysteryFunc 우리가 함수 이름을 가지고 있기 때문에 몇가지 DLL exports를 리버싱하는 방법을 소개하기로 결정했습니다. 불행히도, 이것은 항상 그렇지는 않습니다. 이 함수는 아주 작지만 예상되는 내용을 약간 미리 볼 수 있습니다. 여기 MysteryFunc를 디스어셈블했습니다. ~~그림(디스어셈블 코드)~~ 이 함수는 두개의 파라미터를 받는 것처럼 보입니다. RCX와 RDX가 사용되기 때문입니다. MOV QWORD PTR DS:[RDX], RCX RDX는 사용 방식으로 인해 일부 데이터 구조에 대한 포인터처럼 보입니다. 이것이 의미하는 것은 일종의 데이터 구조체의 지표인 오프셋 (예 : + 0x8)으로 액세스되고 있다는 것입니다. 이 코드는 배열이나 클래스 (또는 비슷한 것) 일 ..

[x64] Chapter 6 - DLL/6.7 PrintPlayerStats.md

6.7 PrintPlayerStats 우리 프로그램에서 InitializePlayer를 사용하기 전에 클래스에 대해 찾을 수 있는 다른 정보를 살펴 보겠습니다. 더 많으 정보를 찾기 위해 PrintPlayerStats를 살펴봅시다. 이 함수는 실제로 매우 간단합니다. 플레이어에 대한 정보를 인쇄합니다. 이 함수를 스스로 리버싱해 보세요. 각 코드 줄이 목적이 무엇인지 파악하도록 도전해보세요. 시작하기 전에 알려 드리겠습니다. 마지막 printf () 호출 후 추가 코드가 있습니다. 마지막 printf () 호출 후에 JB를 따르지 않으면 실행이 메모리 해제 코드로 들어갑니다. 원한다면 이것을 리버싱해도 되지만 무시해도됩니다. 여기 빨간색 박스에 있는 코드가 제가 말한 코드입니다.(메모리 해제 코드) ~~..

[x64] Chapter 6 - DLL/6.6 InitializePlayer.md

6.6 Initialize Player 일반적으로 DLL은 범용으로 사용됩니다. 링크된 목록, 로깅 정보, 그래픽 등을 설정하는데 사용되는 DLL 일 수 있습니다. 우리가 리버싱하는 DLL은 하나 이상의 범용 작업을 수행합니다. 더 쉬운 예제를 사용하여 DLL 리버싱을 소개하고 싶기 때문입니다. InitializePlayer, PrintPlayerStats 및 MysteryFunc 함수가 모두 서로 관련되어 있음을 알려드리고 싶습니다. 다시 말하지만, 이 DLL은 학습 도구입니다. 나중에 더 좋은 예를 들어 보겠습니다. Player와 관련된 두 가지 함수가 있는 것 같습니다. Player는 아마도 구조 (구조체) 일 것입니다. 이해하기 위해서 Player 구조체를 사용하는 함수를 리버싱하고 그 함수가 구..

[x64] Chapter 6 - DLL/6.5 PrintArray.md

dll.dll의 symbol을 보면 PrintArray가 두개가 있음 오버라이딩 형태라 파라미터와 반환 값을 알 수 있음 void __cdecl PrintArray(char * __ptr64 const,int) Parameters: const char*, int void __cdecl PrintArray(int * __ptr64 const,int) Parameters: const int*, int 첫번째 파라미터로 둘다 포인터 주소를 받는다. 함수 이름을 보고 함수을 추측해본다면 첫번째 파라미터는 주소는 배열의 시작 주소 일 것이다. 두번째 파라미터는 확실하게 알지 못하지만 배열의 크기 또는 얼마나 출력할지 정하는 값일 것으로 추측한다. 리버싱할 때 중요한 점은 항상 큰 그림을 기억해야 한다는 것이다. ..

[x64] Chapter 6 - DLL / 6.4 SayHello.md

Z0FCourse_ReverseEngineering/Chapter 6 - DLL/6.4 SayHello.md dll.dll 리버싱, SayHello 분석 1. modules에 dll.dll이 로드될 때까지 실행(F9) 2. SayHello 클릭 3. 어떤 것도 리턴하지 않는 것으로 보임, 함수 내부로 들어감 4. XAnalyze 분석 실행해야함. 5. SayHello 내부를 쭉 훓어보면 함수이름과 관련있어 보이는 Hello 문자열을 볼 수 있음 6. 더 내려가 보면 ios_base를 참조하는 걸 볼 수 있음. =>5,6 과정을 보고 필자는 이 함수가 std::cout이 아닐까 추측했다고 한다. 그 이유는 ios_base는 I/O stream의 baseclass이다. 7. 이를 검증하기 위헤 간단한 std..

[x64] DLL(import/export), Function Overriding, Mangling, and Decoration

6.2- DLL https://github.com/0xZ0F/Z0FCourse_ReverseEngineering/blob/master/Chapter%206%20-%20DLL/6.3%20Exports.md -실습용 파일에 대한 설명- RunDLL.exe는 DLL.dll의 내 보낸 함수를 호출하는 프로그램입니다. DLL.dll은 RunDLL.exe와 같은 폴더에 있어야합니다. SourceCode 폴더에는 프로그램의 소스 코드가 포함되어 있습니다. DebugFiles 폴더에는 원하는 경우 심볼을 확인하는데 사용할 수있는 디버그 파일이 포함되어 있습니다. 디버그 파일을 RunDLL.exe 및 DLL.dll과 같은 폴더에 넣습니다 - Dynamic Libraries (프로그램과 따로 분리되어 로드된다. 다양한 프..