반응형
4~4기가의 가상주소 공간에섯 실행파일의 주소는 400000번지 이하에 있고 User32.dll의 주소는 77D304EA에 있다.
프로세서는 MessageBoxA를 호출하기 위해 77D304EA를 호출할것이다. 하지만 다른 dll이 먼저 올라와 있다면 다른곳으로 운영체제는 올려준다. 그러면 프로세스는 호출하는데 다른것을 호출할 것이다.
이것을 막기 위해 운영체제가 호출 주소를 바꿔준다.
하지만 운영체제또한 이것을 갯수에 따라 다 바꿔줄 수는 없다.
.idata에는 Dll의 주소를 가지고 있다. 420000번지의 주소에 다른 함수의 주소를 가지고 있기때문에 운영체제는 420000번지의 .idata의 값을 바꿔주기만 하면 되는것이다. 이것을 이용해 API 후킹을 하는것.
Ex>1번파일
.idata는 구조체이다.
IMAGE_IMPORT_DESCRIPTION 구조체들이 들어가 있는 구조체이다.
name섹션에 가면 주소가 나온다.
THUNK TABLE은 DLL이 가져다 쓰는 주소가 있다.
이것을 쓰기 위해서는 DEBUGHELP.DLL이 필요하다.
이 DLL은 PE조작 함수가 들어있다.
#include<stdio.h> #include<windows.h> //MessageBoxA를 대체할 함수 typedef UINT (WINAPI * F)(HWND, PCSTR, PCSTR, UINT); UINT WINAPI foo(HWND hwnd, PCSTR s, PCSTR title, UINT btn) { printf("foo is Called\n"); printf("Message : %s\n",s); printf("TitleBar : %s\n",title); //다시 원래의 MessageBox로 전달하려면 ? //직접 함수의 주소를 구한다. HMODULE hDll = GetModuleHandle("User32.dll"); F f = (F)GetProcAddress(hDll, "MessageBoxA"); return f(hwnd, s, title, btn); } void main() { //.idata section의 MessageBox의 주소를 담고 있는 부분을 foo의 주소를 변경 //C에서 모든 메모리 type이 있어야 접근할 수 있다. 즉 주소를 직접 사용할때는 임의의 type으로 개스팅해서 사용해야 한다. *((int*)0x0042a2ac) = (int)foo; //<~0x0042a2ac는 .idata의 주소이다.(가변) void *p = GetModuleHandle("User32.dll"); printf("User32.dll의 주소 : %p\n",p); printf("MessageBox의 주소 : %p\n",MessageBoxA); MessageBox(0,"hello","AAA",MB_OK); } //MessageBox는 결국 매크로이고 실제 함순는 MessageBoxA또는 MessageBoxW이다.
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."