애드센스


DLL INJECTION 기타

다른 프로그램에 DLL의 심는 테크닉

계산기의 공학용 버튼 사용 못하게 하는 프로그램

// 메인 프로그램

#undef UNICODE

#undef _UNICODE

 

#include <windows.h>

#include <stdio.h>

 

void DLLInject( DWORD pid, const char* path )

{

       HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );

 

 

//////////////////////////////////////////////////////////////////////////           

       //LoadLibrary 주소를 찾는다

       HMODULE hDll = GetModuleHandle( "kernel32.dll");

 

PTHREAD_START_ROUTINE f = (PTHREAD_START_ROUTINE)GetProcAddress( hDll, "LoadLibraryA");

       // PTHREAD_START_ROUTINE 미리 정의된 스레드 함수포인터 type이다.

 

       // 계산기의 가상주소 공간에 메모리를 할당한다.

       void* p = VirtualAllocEx( hProcess, 0, strlen(path)+1,

                                   MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

 

       // Inject DLL 경로를 계산기 메모리에 복사해 넣는다.

       DWORD len;

       WriteProcessMemory( hProcess, p, path, strlen(path)+1, &len );

      

//////////////////////////////////////////////////////////////////////////

 

       // 다른 프로세스에 스레드를 생성한다.

       HANDLE hThread = CreateRemoteThread( hProcess, 0, 0,

                                                 f, (void*)p,  // 함수, 파라미터,

                                            0, 0);

}

 

intmain()

{

       HWND hwnd = FindWindow( 0, "계산기");

 

       if( hwnd == 0 )

       {

             printf("계산기부터실행하세요\n");

             return0;

       }

 

       // 계산기 프로세스에 DLL 강제로 넣는다.

       DWORD pid;

       DWORD tid = GetWindowThreadProcessId( hwnd, &pid );

 

       DLLInject( pid, "C:\\spy.dll");

}


// DLL 생성 프로그램

#undef _UNICODE

#undef UNICODE

 

#include <windows.h>

 

WNDPROC old;

 

// 계산기의 메시지 처리함수를 가로챌 함수

 

LRESULT CALLBACK foo( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

       switch( msg )

       {

       case WM_COMMAND: // 메뉴선택

             switch( LOWORD(wParam) )

             {

             case 304: // "공학용메뉴"

                    MessageBox( 0, "^^", "",  MB_OK );

                    return0;

             }

             break;

       }

       // 나머지 메시지는 모두 원래의 함수로 보낸다.

       return CallWindowProc( old, hwnd, msg, wParam, lParam );

}

 

// DLL 프로세스에 매핑 자동으로 호출되는 함수

BOOL WINAPI DllMain( HANDLE h, DWORD r, LPVOID how )

{

       if( r == DLL_PROCESS_ATTACH )

       {

             HWND hwnd = FindWindow( 0, "계산기");

 

             old = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)foo );

       }

       return TRUE; // 반드시 TRUE 리턴해야 한다.

}


덧글

댓글 입력 영역


Facebook

통계 위젯 (화이트)

89116
696
643416

구글