본문 바로가기
IT창고/API

메시치 처리함수 바꾸기

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    DLL을 만든다.
    네이트온에 넣는다.
    이렇게 내가 만든 Dll을 다른 프로그램에 넣는 것을
    Dll인젝션이라 한다. 아래 목록...
    네이트온의 윈도우 핸들을 구할 수 있다.
    핸들을 구하면 프로세스 ID를 구할 수 있다.
    아이디를 알면 프로세스의 핸들을 구한다.

    소스는 네이트온의 네이트온 정보메시지를 바꾸는것이다.
    DLL을 이용한다.
    spy.cpp를 DLL프로젝트로 컴파일후
    C:\에 복사해놓고.. 네이트온을 실행해보자.. 네이트온 정보창을 클릭하면
    #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,"NateOn");
    
    	if(hwnd	==	0)
    	{
    		printf("NateOn을 먼저 실행하세요\n");
    		return ;
    	}
    	DWORD pid;
    	DWORD tid	=	GetWindowThreadProcessId(hwnd, &pid);
    
    	DllInject(pid,"C:\\spy.dll");
    }
    
     
    #include<windows.h>
    WNDPROC old;
    
    LRESULT CALLBACK foo(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    	case WM_WINDOWPOSCHANGING:
    		return DefWindowProc(hwnd, msg, wParam, lParam);
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case 57664://네이트온 정보메뉴 ID
    			MessageBox(0,"넌 당한거야 \n낚였어..","",MB_OK);
    			return 0;
    		}
    		//원래 메시지 함수로 전달
    		return CallWindowProc(old, hwnd, msg, wParam, lParam);
    
    	}//원래 메시지 함수로 전달
    	return CallWindowProc(old, hwnd, msg, wParam, lParam);
    }
    BOOL WINAPI DllMain(HANDLE h, DWORD r, LPVOID how)
    {
    	if(	r == DLL_PROCESS_ATTACH)
    	{
    		HWND hwnd = FindWindow(0, "NateOn");
    
    		//SubClassing...!!
    		old	=	(WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC,(LONG)foo);
    
    	}
    	return TRUE;
    }
    반응형

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