#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;
}
Comments