Reversing

    PE Structure - EAT

    0. EAT Export Address Table 이건 exe 가 아니라 dll이나 lib 구조 안에(라이브러리들)서 확인할 수 있는 구조라고 생각하면 되는 것 같다. EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 사용할 수 있도록 익스포트하는 함수의 시작 주소를 구할 수 있게 해준다. 음.. 그래서 dll은 자신의 함수를 다른 프로그램들에서 가져다 쓸 수 있게 해주는 라이브러리이기 때문에 첫 문장처럼 얘기를 써봤다 그래서 IAT는 한 exe가 여러 라이브러리에서 함수를 가져다 쓸 수 있기 때문에 구조체 배열의 형태를 가지지만(자기가 임포트 하는 라이브러리 개수만큼?) EAT는 한개의 구조체 배열로 이루어져 있다. 다음 제목에서 설명해야징 아무튼 큰 틀에서 보면 IAT와 큰 차이는 없는 ..

    PE Structure - IAT

    적고보니 이해가 좀 되는 것 같다.. 결론은 IMAGE_NT_HEADERS의 필드였던 OptionalHeader의 필드인 DataDirectory 배열의 첫번째 DataDirectory[1]이고, 이게 가리키는게 IMAGE_IMPORT_DESCRIPTOR의 배열인것이다. 그리고 IMAGE_IMPROT_DESCRIPTOR의 INT를 보고 실제 함수의 주소를 찾아서 IAT에 쓰는 과정이 dll의 주소를 메모리에 올리는 과정이다. 0. IAT 0-0 설명 Import Address Table IAT를 이해하기 위한 사전 지식.. 32bit Windows 환경으로 넘어오면서 메모리나 디스크 등의 자원 활용의 낭비를 막기 위해 DLL이 생겨났다. DOS 시절의 프로그램들은 특정 함수를 사용하기 위해 해당 라이브러..

    PE Structure - Header

    구글링해보면 정말 많은 PE 구조에 대한 글이 있지만 이걸 적어두는 이유는 오롯이 나를 위해 ㅎ 00. PE 개요 00. PE란 PE: Portable Executable Windows 운영체제에서 실행 가능한 파일의 형태 64bit는 PE+로 표기 01. PE 파일 확장자 실행: exe, scr 라이브러리: dll, ocx, cpl, drv 드라이버: sys, vxd 오브젝트 파일: dbj 02. PE 구조 크게 Header와 Body로 구성 Header 파일이 실행되기 위한 파일 구성에 관련된 전반적인 정보. PE Header + Section Header 모든 Windows PE 파일은 PE Header에서 공통적으로 IMAGE_DOS_HEADER, MS_DOS Stub Program, IMAGE_..

    LoadLibraryA API

    https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya LoadLibraryA function (libloaderapi.h) - Win32 apps Loads the specified module into the address space of the calling process. docs.microsoft.com LoadLibraryA( _In_ LPCSTR lpLibFileName ); 인자로는 const char * 형의 파일이름만 받는다. 이름으로 지정해 준 라이브러리를 호출한 프로세스의 주소 공간에 로드하는 함수이다. 더 다양한 옵션을 사용하기 위해서는 LoadLibraryEx 함수를 사..

    GetModuleFileNameA API

    오늘 확인할 API는 GetModuleFileNameA API이다 GetModuleFileNameA( _In_opt_ HMODULE hModule, _Out_writes_to_(nSize,((return < nSize) ? (return + 1) : nSize)) LPSTR lpFilename, _In_ DWORD nSize ); 해당 API는 세개의 인자를 받는다. 첫번째 인자는 HMODULE이다. 현재 실행되고 있는 모듈의 핸들 또는 NULL이 온다. 두번째 인자는 LPSTR형으로, 실행 경로를 받을 버퍼를 명시한다. typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR; LPSTR형은 char*와 똑같다고 보면 된다. 세번째 인자는 두번째 인자 버퍼의 길이를..