본문 바로가기
Delphi 예제 자료

asm(어셈블리어) ntdll.dll Base값과 Kernel32.dll Base값 쉽게 구하기.

by kimsyo11 2021. 12. 13.
728x90

어때요 참 쉽죠.

구하는 방법은 2가지 방법이 있습니다

간단하게 코드 짜는것은 첫번째 방법이며 그다음은 두번째 방법입니다

아래가 첫번째 방법

 

 

procedure TForm1.FormCreate(Sender: TObject);
var ntdllBase, Kernel32Base : DWORD;
begin
 asm
    mov eax,fs:[$18]; //TIB
    mov ebx,[eax + $30] //PEB
    mov ecx, [ebx + $0C]
    mov ecx, [ecx + $1C]

    mov eax, [ecx + $08] //여기가 1번째의 ntdll.dll base
    mov ntdllBase,eax

    mov ecx, [ecx]
    mov ecx, [ecx]
    mov eax, [ecx + $08] //여기가 2번째의 Kernel32.dll base
    mov Kernel32Base, eax;
  end;
  ShowMessage('ntdllBase := ' + ntdllBase.ToHexString + ' Kernel32Base := ' + Kernel32Base.ToHexString);
end;

 

두번째 방법

1. uiBaseAddress 변수에 Ldr를 저장

2. uiValueA변수에 InMemoryOrderModuleList

3. uiValueB변수에 DllName의 버퍼를 지정

4 usCounter변수에 dllName의 길이 지정

5. usCounter 길이만큼 반복문을 이용하여 uiValueB 주소 메모리값 buffer의 Byte 값을 이용하여 Convert를하고

uiValueC를 해쉬값으로 만듭니다

5_1. Convert하는 이유는 DLLName중에서 대문자이거나 소문자인 경우가 있어서 통일성 있게 해줘야 합니다

(KERNEL32.DLL이나 kernel32.dll이나 KErnel32.dll) 이럴경우 대문자 소문자 통일성이 다르기 때문에

hash string값이 다르기에 대문자로 통일성 있게 변환 시켜줘야 합니다

5_2. uiValueC가 kernel32.dll 해쉬값이 맞지 않다면 inc(uiValueA)로 uiValueA값이 증가시킵니다

6. 그렇게 해서 uiValueC가 kernel32.dll 해쉬값이 맞다면 PLDR_DATA_TABLE_ENTRY(uiValueA).DllBase

DLL Base값을 uiBaseAddress 변수에 저장합니다 uiBaseAddress는 kernel32dll 베이스값이 들어가게 된것이죠

 

 

2번째 방법 같은경우 PPEB는 Type에 선언한 Record로 만든것이며

오프셋 개념도 알아두시면 좋고 선언에 따라 크기가 다르게 들어가고 sizeof의 값도 다르게 됩니다

728x90

댓글