2014. 10. 16. 17:06
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

암시적 호출 방식


명시적 호출 방식 




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하는 과정 

-> 인자가 몇개가 필요한지, 어떤 용도로 사용되는지 




----------------




DLL Injector - in.txt


DLL_INJECTION.exe




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
Posted by af334