Windows 2003에서 작업함.
A3 블로그에 올라온거 따라가다가 삽질했다.. (먼 산)
원래 코드를 좀 뜯어놔서 깔끔하진 않음..
mov eax, p가 밑에 표시한 자리에 있어야 되던데..
원본 코드에는 그 위에 있어서 일단 제대로 안 돌아갔고 (..)
굳이 InInitializationOrderModuleList 안 타고
InLoadOrderModuleList 타는게 더 깨끗하게 잘 될 것 같은데.. 안 해봤으니 흠-_-;
현재 프로세스의 모듈 정보가 InInitializationOrderModuleList 쪽에는 안 나오는 것 같다.
아무튼 원래 목적은 kernel32.dll 베이스만 따는 것이었는데..
왜 내가 굳이 현재 모듈 정보까지 출력하려고 이렇게 삽질을 했나.. 하는 생각이 -_-;;
뭐 아래 코드에는 안 들어가있지만 뽑을 수는 있을 것 같다. (..)
메모리 레이아웃을 달달 외우고 있어야 편하게 어셈블리 추적을 할 수 있을텐데..
도무지 내 머리는 캐시가 딸려서 -_- 힘들다. (주소값도 보자마자 까먹으니까.. 쩝)
써놓은 값도 잘못 입력해서 삽질하는 경우가 부지기수로 --;
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
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로 찍어보고 했으니 알아보지 안 그랬으면 쩝쩝..
아래는 삽질의 흔적; 캡처도 안 찍고 했으면 메멘토처럼 헤매고 다녔을 듯 -_-;
그 위로 보이는 0x151ED0이 현재 모듈의 LDR_MODULE 주소인데..



빨간색은 LIST_ENTRY들, 파란색이 base address, 초록색이 entry point




