로딩된 모듈 정보 찍기

Windows 2003에서 작업함.

A3 블로그에 올라온거 따라가다가 삽질했다.. (먼 산)
원래 코드를 좀 뜯어놔서 깔끔하진 않음..

mov eax, p가 밑에 표시한 자리에 있어야 되던데..
원본 코드에는 그 위에 있어서 일단 제대로 안 돌아갔고 (..)

굳이 InInitializationOrderModuleList 안 타고
InLoadOrderModuleList 타는게 더 깨끗하게 잘 될 것 같은데.. 안 해봤으니 흠-_-;
현재 프로세스의 모듈 정보가 InInitializationOrderModuleList 쪽에는 안 나오는 것 같다.

아무튼 원래 목적은 kernel32.dll 베이스만 따는 것이었는데..
왜 내가 굳이 현재 모듈 정보까지 출력하려고 이렇게 삽질을 했나.. 하는 생각이 -_-;;
뭐 아래 코드에는 안 들어가있지만 뽑을 수는 있을 것 같다. (..)
#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv)
{
void *Flink = NULL;
void *p = NULL;
void *EntryPoint = NULL;
void *FullDllName = NULL;
void *BaseDllName = NULL;
void *DllBase = NULL;
DWORD SizeOfImage = 0;

_asm
{
xor edx, edx; // edx = 0
mov edx, fs:[0x30]; // edx = PEB
add edx, 0xc; // edx = LDR = PEB + 0x0c
mov edx, DWORD PTR[edx]; // edx = *LDR
add edx, 0x1C; // edx += InInitializationOrderModuleList. first node located.
mov Flink, edx; // set Flink
mov p, edx; // set pointer for iteration
}

do
{
_asm
{
// Next Flink
mov edx, DWORD PTR[eax];
mov p, edx;
mov eax, p;

// DllBase

mov edx, DWORD PTR[eax+8];
mov DllBase, edx;

// exit if first item
cmp edx, 0;
je Exit;

mov edx, DWORD PTR[eax+0x0C];
mov EntryPoint, edx;
mov edx, DWORD PTR[eax+0x10];
mov SizeOfImage, edx;
mov edx, DWORD PTR[eax+0x18];
mov FullDllName, edx;
mov edx, DWORD PTR[eax+0x20];
mov BaseDllName, edx;
}

wprintf(L"Base Name: %s\n", BaseDllName);
wprintf(L"File Name: %s\n", FullDllName);
wprintf(L"Load Address: %p\n", DllBase);
wprintf(L"Size of Image: %08X\n", SizeOfImage);
wprintf(L"Entry Point: %p\n\n", EntryPoint);
} while (Flink != p);
Exit:
return 0;
}

메모리 레이아웃을 달달 외우고 있어야 편하게 어셈블리 추적을 할 수 있을텐데..
도무지 내 머리는 캐시가 딸려서 -_- 힘들다. (주소값도 보자마자 까먹으니까.. 쩝)
써놓은 값도 잘못 입력해서 삽질하는 경우가 부지기수로 --;

LIST_ENTRY는 8바이트, 앞뒤 주소 링크
UNICODE_STRING은 8바이트, 앞쪽 4바이트는 2바이트씩 길이, 최대 길이, 4바이트 문자열 포인터.
물론 32비트 기준으로다가 (..)

그나저나 값을 미리 PSAPI로 찍어보고 했으니 알아보지 안 그랬으면 쩝쩝..

아래는 삽질의 흔적; 캡처도 안 찍고 했으면 메멘토처럼 헤매고 다녔을 듯 -_-;

LDR (0x7C9C97E0)에서 InInitializationOrderModuleList의 Flink 값.
그 위로 보이는 0x151ED0이 현재 모듈의 LDR_MODULE 주소인데..

kernel.dll의 LDR_MODULE

ntdll.dll의 LDR_MODULE

현재 모듈의 LDR_MODULE
빨간색은 LIST_ENTRY들, 파란색이 base address, 초록색이 entry point
by xeraph | 2009/05/05 17:45 | 학술 | 트랙백 | 덧글(3)
트랙백 주소 : http://xeraph.com/tb/4935933
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by matt at 2009/05/06 01:50
리버싱에 익숙해 지려는 거라면 WinDBG를 사용하세요. 윈도우즈 리버싱 개념 잡기에 교육적인 목적으로도 괜찮습니다.
Commented by xeraph at 2009/05/06 01:52
옙~ WINDBG 매뉴얼 좀 읽어봐야 되는데.. 자꾸 미루다보니 여지껏 제대로 못봤네요 --;;
Commented by 담배는말보로 at 2009/11/01 22:12
감사히 보고갑니다.

:         :

:

비공개 덧글