반응형
#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; }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."