https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya
LoadLibraryA(
_In_ LPCSTR lpLibFileName
);
인자로는 const char * 형의 파일이름만 받는다.
이름으로 지정해 준 라이브러리를 호출한 프로세스의 주소 공간에 로드하는 함수이다. 더 다양한 옵션을 사용하기 위해서는 LoadLibraryEx 함수를 사용하면 된다.
호출 성공시에는 핸들을 반환하고, 실패시에는 NULL을 반환한다.
그리고 프로세스에 로드되어있는 dll이 아닌 것을 로드하려고 하면, 제일 먼저 DLLMain을 실행시킨 후, 실행 성공 여부에 따라 핸들을 제공하거나 NULL을 반환한다. 이를 이용하여 dll injection을 하는 것이다(?! 갑자기?).
아무튼 예제로 확인해보았다.
먼저 예제로 사용한 dll 소스코드이다
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "windows.h"
#pragma comment(lib, "urlmon.lib")
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
HANDLE hThread = NULL;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
MessageBox(nullptr, L"Injection!!", L"dll injection by biji", MB_OK);
break;
}
return TRUE;
}
너무 대충 만들어서 좀 웃기지만.. 그냥 단순히 메시지 박스를 띄워주는 dll이다. 문구는.. dll injection 할 때 테스트 하려고 만든거라 저렇게 되어있다.
다음은 LoadLibraryA를 사용한 코드이다
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
int main() {
HINSTANCE handle;
handle = LoadLibraryA("C:\\Users\\User_name\\source\\repos\\msgBoxDll\\Debug\\msgBoxDll.dll");
}
더 대충 만들었다.. 진짜 그냥 LoadLibraryA만 호출하도록 했다.
실행시켜보면
LoadLibraryA API를 이용하여 추가해 준 dll이 실행된 것을 볼 수 있다. 이렇게 바로 실행이 된 이유는 앞서 dll을 만들 때 DLLMain에 메시지박스를 띄우는 코드를 넣었고, LoadLibraryA에서 처음 부르는 dll이면 DLLMain 부터 실행하기 때문이다.
dll 리스트에도 올라와 있음을 확인할 수 있다.
'Reversing > Win API' 카테고리의 다른 글
GetModuleFileNameA API (0) | 2020.06.01 |
---|