#include "windows.h" #include "stdlib.h" int main(void){ STARTUPINFO startinfo; PROCESS_INFORMATION pi; DEBUG_EVENT DBEvent; CONTEXT context; CONTEXT context1; LPCTSTR filepath = "..\\win7.exe"; char ExitProc[] = "Original process has been closed. Terminating."; char AppName[] = "ImageBase"; char AppName1[] = "FS"; char Key_content[] = "KEY"; char error_open[] = "Create Process failed"; char stroka[20] = { 0 }; char our_key[4] = { 0 }; char bufer = 0x02; char byte_c = 0x00; char int3 = 0xCC; char kol = 0; /**< PLACING ALL THE PROC STARTUP INFO INTO STARTINFO */ GetStartupInfo( &startinfo ); /**< CREATING A PROC AND CHECKING IF FAILED */ if(!CreateProcess(filepath, NULL, NULL, NULL, 0, DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &startinfo, &pi)){ MessageBoxA( 0, error_open, AppName, MB_OK ); return 1; } while(1){ /**< CATCHING DEBUG EVENTS */ WaitForDebugEvent(&DBEvent, INFINITE); switch( DBEvent.dwDebugEventCode ){ /**< HANDLING PROC EXIT */ case EXIT_PROCESS_DEBUG_EVENT: MessageBoxA(0, ExitProc, AppName, MB_OK); ExitProcess(0); break; case CREATE_PROCESS_DEBUG_EVENT: /**< IMAGEBASE INTO DIALOG */ itoa((int)DBEvent.u.CreateProcessInfo.lpBaseOfImage, stroka, 16); MessageBoxA( 0, stroka, AppName, MB_OK ); /**< CHANGING A RASHET BUTTON */ ReadProcessMemory( DBEvent.u.CreateProcessInfo.hProcess,(LPVOID)0x040103A, &bufer, 1, NULL ); if(bufer==3){ bufer=5; WriteProcessMemory( DBEvent.u.CreateProcessInfo.hProcess,(LPVOID)0x040103A, &bufer, 1, NULL ); } /**< PLACING A BREAKPOINT */ /*ReadProcessMemory( DBEvent.u.CreateProcessInfo.hProcess, (LPVOID)0x040110C, &byte_c, 1, NULL ); WriteProcessMemory( DBEvent.u.CreateProcessInfo.hProcess, (LPVOID)0x040110C, &int3, 1, NULL );*/ ReadProcessMemory( DBEvent.u.CreateProcessInfo.hProcess, (LPVOID)0x040110C, &byte_c, 1, NULL ); WriteProcessMemory( DBEvent.u.CreateProcessInfo.hProcess, (LPVOID)0x040110C, &int3, 1, NULL ); break; case EXCEPTION_DEBUG_EVENT: if (DBEvent.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT) { if( kol==0 ){ /**< CONTEX_CONTROL regEbp dd ? regEip dd ? regCs dd ? regFlag dd ? regEsp dd ? regSs dd ? */ //context.ContextFlags = CONTEXT_CONTROL; /**< CONTEX_SEGMENTS regGs dd ? regFs dd ? regEs dd ? regDs dd ? */ context1.ContextFlags = CONTEXT_SEGMENTS; /**< (2) regFS INTO DIALOG */ GetThreadContext(pi.hThread, &context1); itoa((int)context1.SegFs, stroka, 16); MessageBoxA(0, stroka, AppName1, MB_OK); //WriteProcessMemory(pi.hProcess,(LPVOID)0x040110C, &byte_c, 1, NULL); WriteProcessMemory(pi.hProcess,(LPVOID)0x040110C, &byte_c, 1, NULL); /**< KEY INTO A DIALOG */ //ReadProcessMemory(pi.hProcess, (LPVOID)0x0403013, &our_key, 3, NULL); ReadProcessMemory(pi.hProcess, (LPVOID)0x0403013, &our_key, 3, NULL); itoa((int)our_key, stroka, 16); MessageBoxA(0, our_key, Key_content, MB_OK); //GetThreadContext(pi.hThread, &context); } /**< ITS AN EXCEPTION SO CONTINUE */ ContinueDebugEvent( DBEvent.dwProcessId,DBEvent.dwThreadId, DBG_CONTINUE); continue; } } ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ExitProcess(0); return 0; }