암시적 호출 방식
명시적 호출 방식
LoadLibrary
FreeLibrary
OutputDebugging() -> 디버그 창에서 있음
---------
sysinternals.com
dbgView
procexp
dependency walker
import 함수 목록
export 함수 목록
FreeLibrary 에서 Ordinal 번호는 버전이 다르면 다를 수 있음
--------
#include <windows.h>
extern "C" // capitalized C -> C언어로 이해 -> 이름이 바뀌는 것을 방지
void _declspec(dllexport) Test(){ -> Test()를 외부에서 불러 올 수 있다는 선언
}
---------
#include <windows.h>
extern "C" -> dependency walker에서 올바른 이름으로 확인 가능해짐
void _declspec(dllexport) Test(){
MessageBox(NULL,"export 함수 호출 테스트","",MB_OK);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
OutputDebugString("ATTACH");
break;
case DLL_PROCESS_DETACH:
OutputDebugString("DETACH");
break;
}
return TRUE;
}
-----------------
typedef void (*PFNFUNC)();
-> 함수의 주소를 담는 자료형 정의
PFNFUNC fnTest;
-> 함수 포인터 변수 선언
GetProcAddress(hModule, "Test"); -> 함수의 주소를 구해주는 함수
-> 인자 2개 필요
-> 함수이름 볼 때 대소문자 구분함
fnTest =(PFNFUNC)GetProcAddress(hModule,"Test"); -> 캐스팅
-------------
#include <windows.h>
typedef void(*PFNFUNC)();
PFNFUNC fnTest;
int main(int argc, char* argv[]){
HMODULE hModule;
hModule=LoadLibrary("c:\\test.dll");
if(hModule){
fnTest=(PFNFUNC)GetProcAddress(hModule, "Test");
if(fnTest) fnTest();
}
if(hModule) FreeLibrary(hModule);
return 0;
}
----------
DLL Injector
OpenProcess()
주입할 대상 프로세스에 대한 핸들값 얻음
VirtualAllocEx()
대상 프로세스 내에세 DLL 경로를 넣기 위한 메모리를 할당
-> strlen()을 이용하여 test.dll의 크기 만큼의 공간을 할당
WriteProcessMemory()
할당된 메모리에 DLL경로를 기록
CreateRemoteThread()
대상 프로세스에 스레드 생성(LoadLibrary 호출)
-> 원격 프로세스에 스레드를 생성
-> 원래는 스레드의 주소를 넣어야 하지만 LoadLibrary() 주소를 대신 넣어줌
-> 보고서 -> injection하는 과정
-> 인자가 몇개가 필요한지, 어떤 용도로 사용되는지
----------------
Inject
hKernel32 = GetModuleHandle("kernel32.dll");
-> kernel32의 handle값 구하여 변수에 저장
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 모든 접근권한으로 접근
FALSE, 상속 x
dwPid); 특정 프로세스id
pLibRemote = VirtualAllocEx(hProcess, 대상의 handle
NULL, 자동으로
nLen, dll경로의 길이(strlen()+1)
MEM_COMMIT, 즉시 할당
PAGE_EXECUTE_READWRITE); 읽을 수도 있고 쓸 수도 있게
-> 공간 할당 -> 공간 할당 위치, 크기, ....
-> pLibRemote는 할당했던 공간의 주소를 가짐
WriteProcessMemory(hProcess,
pLibRemote,
(void*)szDllPath, dll이 필요 할건데
nLen, 길이만큼
NULL
);
-> 대상의 handle값
pThreadProc = (LPTHREAD_START_ROUTINE) GetProcAddress(hKernel32, // handle값
"LoadLibraryA"
);
-> pThreadProc이 로드 라이브러리라고 생각하면 됨
hThread = CreateRemoteThread(hProcess, 주입대상
NULL,
0,
pThreadProc, // LoadLibrary를 호출 할 건데
pLibRemote, // LoadLibrary에 필요한 인자들은
0,
NULL);
CloseHandle(hProcess);
CloseHandle(hThread);
'Reversing' 카테고리의 다른 글
analysis malicious codes (0) | 2014.10.20 |
---|---|
dll ejection and malicious codes (0) | 2014.10.17 |
The usages of loadLibrary() for making dll and function pointer (0) | 2014.10.15 |
Anti-debugging (0) | 2014.10.14 |
crackme and winapi (0) | 2014.10.13 |