본문 바로가기
IT창고/System

Dllinyection()

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    #include<stdio.h>
    #include<windows.h>
    //Kernel32의 핸들을 구하는것..GetModuleHandle
    
    void DllInject(DWORD pid, char * path)
    {
    	//process ID를 가지고 Process핸들을 얻는다.
    	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    
    	//----------------------------------------------------------
    	//Kernel32.dll의 주소를 구한다.
    	HMODULE hDll = GetModuleHandle("Kernel32.dll");
    
    	PTHREAD_START_ROUTINE	f	=	(PTHREAD_START_ROUTINE)
    									GetProcAddress(hDll, "LoadLibraryA");	//UNICODE타입때문에 메크로는 실제 함수로 써줘야 한다.
    																			//LoadLibrary가 아니라 LoadLibraryA이다.
    	//PTHREAD_START_ROUTINE는 미리 정의된 스레드 함수모양의 함수 포인터 타입
    
    	//NateOn의 가상주소 공간을 할당한다.
    	void *p = VirtualAllocEx(hProcess, 0, strlen(path)+1,
    							MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    
    	DWORD len;
    	WriteProcessMemory(hProcess, p , path, strlen(path)+1, &len);
    
    	//----------------------------------------------------------
    	//상대 프로세스에 새로운 스레드를 생성한다. (Win2000 이상부터 지원)
    	HANDLE hThread	=	CreateRemoteThread(hProcess,0,0, 
    											f, p,		//함수, 인자.
    											0,0);
    
    	//VirtualAlloc();	자신에게 메모리 할당
    	//VirtualAllocEX();	다른 프로그램에 메모리 할당
    	//WriteProcessMemory();	다른 프로그램에 문자열 복사
    	CloseHandle(hProcess);
    	CloseHandle(hThread);
    }
    void main()
    {
    	HWND hwnd = FindWindow(0,"찰스의 테트리스!");
    
    	if(hwnd	==	0)
    	{
    		printf("NateOn을 먼저 실행하세요\n");
    		return ;
    	}
    	DWORD pid;
    	DWORD tid	=	GetWindowThreadProcessId(hwnd, &pid);
    
    	DllInject(pid,"C:\\speedhack.dll");
    }
    
     
    #include<windows.h>
    #include "Dbghelp.h"
    #pragma comment(lib, "Dbghelp.lib")
    
    void Replace( HMODULE hModule, // .idata를 가진 모듈의 주소
    			  PCSTR	  dllname, // Hooking 할 함수를 가진 DLL이름
    			  PROC	  oldfunc, // 훅킹할 API 함수.
    			  PROC    newfunc) // 바꿀 함수 
    {
    	// 1. module 에서 .idata section 의주소를 찾는다.
    	ULONG sz = 0;
    	PIMAGE_IMPORT_DESCRIPTOR pImage = (PIMAGE_IMPORT_DESCRIPTOR)
    						ImageDirectoryEntryToData( hModule, TRUE,
    									IMAGE_DIRECTORY_ENTRY_IMPORT, & sz);
    
    	//printf(".idata section 의 주소 : %p\n", pImage );
    
    	// 2. .idata section 에서 원하는 Dll의 위치를 찾는다. 
    	for ( ; pImage->Name; ++pImage )
    	{
    		char* p = ((char*)hModule + pImage->Name);
    
    		if ( strcmpi( p, dllname) == 0 ) break; // 찾은 경우
    	}
    	//if ( pImage->Name == 0 ) 
    	//	printf("해당 모듈은 %s 를 import 하지 않습니다.\n", dllname);
    
    	//printf("%s 모듈의 import section 주소 : %p\n", dllname, pImage );
    	//--------------------------------------------------------------
    	// 3. Thunk Table 에서 원하는 주소를 얻는다.
    	PIMAGE_THUNK_DATA pThunk = 
    				(PIMAGE_THUNK_DATA)( (char*)hModule + pImage->FirstThunk);
    
    	for ( ; pThunk->u1.Function; ++pThunk )
    	{
    		if ( (PROC)(pThunk->u1.Function) == oldfunc ) // 찾은 경우.
    		{
    			PROC* p = (PROC*)&(pThunk->u1.Function);
    
    			DWORD old;
    			//.idata section 부분의 보호 속성을 변경한다.
    			VirtualProtect(p,			//이 주소 부터
    						4,				//4byte를
    						PAGE_READWRITE,	//읽고 쓰기로
    						&old);			//이전 보호속성 리턴.
    
    			*p = newfunc; // 덮어 쓴다.
    		}
    	}
    }
    typedef UINT ( WINAPI *F )(HWND, UINT, UINT, TIMERPROC);
    
    UINT WINAPI MySetTimer(HWND hwnd, UINT id, UINT ms, TIMERPROC f)
    {
    	//원래 함수 주소를 찾는다.
    	HMODULE h	=	GetModuleHandle("User32.dll");
    	F func	=	(F)GetProcAddress(h, "SetTimer");
    
    	return func(hwnd, id, ms * 3, f);// 3배 느리게 동작 하도록 한다.
    }
    BOOL WINAPI DllMain(HANDLE h, DWORD r, LPVOID how)
    {
    	if(r == DLL_PROCESS_ATTACH)
    	{
    		Replace(GetModuleHandle(0), "User32.dll", (PROC)SetTimer,(PROC)MySetTimer);
    	}
    	return 0;
    }
    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."