#include < windows.h >
#include < stdio.h >
#ifdef _WIN64
#define CAPTION "atomos - memory patcher for chimera #01 (64-bit)"
#define EXENAME "target64.exe" // change it to target "target32.exe" for Wow64 test.
#else
#define CAPTION "atomos - memory patcher for chimera #01 (32-bit)"
#define EXENAME "target32.exe"
#endif
int iWinMain() {
PROCESS_INFORMATION lpProcessInfo = {0};
STARTUPINFO lpStartupInfo = {0};
printf("%s\nFilename: %s\n\n", CAPTION, EXENAME);
if(CreateProcessA(EXENAME,
NULL,
NULL,
NULL,
0,
CREATE_SUSPENDED,
NULL,
NULL,
&lpStartupInfo,
&lpProcessInfo)) {
#ifdef _WIN64 // 64bit Application
DWORD64* peb64bit;
DWORD32* wowPeb;
CONTEXT lpContext64bit = {0};
WOW64_CONTEXT lpWoWContext = {0};
DWORD64 uTargetAddress64bit;
char newByte64bit;
DWORD64 uTargetAddressWow64;
char newByteWow64;
BOOL Wow64Process = FALSE;
IsWow64Process(lpProcessInfo.hProcess, &Wow64Process);
if (Wow64Process) { // Wow64 Process
lpWoWContext.ContextFlags = CONTEXT_FULL;
Wow64GetThreadContext(lpProcessInfo.hThread, &lpWoWContext);
wowPeb = (DWORD32*)lpWoWContext.Ebx;
DWORD32 ImageBaseAddress = NULL;
ReadProcessMemory(lpProcessInfo.hProcess,
&wowPeb[2],
(LPVOID)&ImageBaseAddress,
sizeof(DWORD32),
NULL);
printf("[-] Wow64 ImageBase Address = 0x%08X\n", ImageBaseAddress);
printf("[-] Wow64 EntryPoint Address = 0x%08X\n", lpWoWContext.Eax);
printf("[-] Wow64 Process (PEB Address) = 0x%08X\n", lpWoWContext.Ebx);
uTargetAddressWow64 = lpWoWContext.Eax + 0x64;
newByteWow64 = 0x74;
WriteProcessMemory(lpProcessInfo.hProcess,
(LPVOID)uTargetAddressWow64,
&newByteWow64,
1,
NULL);
} else { // 64bit Process
lpContext64bit.ContextFlags = CONTEXT_FULL;
GetThreadContext(lpProcessInfo.hThread, &lpContext64bit);
peb64bit = (DWORD64*)lpContext64bit.Rdx;
DWORD64 ImageBaseAddress = NULL;
ReadProcessMemory(lpProcessInfo.hProcess,
&peb64bit[2],
(LPVOID)&ImageBaseAddress,
sizeof(DWORD64),
NULL);
printf("[-] 64bit ImageBase Address = 0x%p\n", ImageBaseAddress);
printf("[-] 64bit EntryPoint Address = 0x%p\n", lpContext64bit.Rcx);
printf("[-] 64bit Process (PEB Address) = 0x%p\n", lpContext64bit.Rdx);
uTargetAddress64bit = lpContext64bit.Rcx + 0x7E;
newByte64bit = 0x75;
WriteProcessMemory(lpProcessInfo.hProcess,
(LPVOID)uTargetAddress64bit,
&newByte64bit,
1,
NULL);
}
ResumeThread(lpProcessInfo.hThread);
WaitForSingleObject(lpProcessInfo.hThread, INFINITE);
#else // 32bit Application
DWORD32* peb32bit;
CONTEXT lpContext32bit = {0};
DWORD32 uTargetAddress32bit;
char newByte32bit;
lpContext32bit.ContextFlags = CONTEXT_FULL;
GetThreadContext(lpProcessInfo.hThread, &lpContext32bit);
peb32bit = (DWORD32*)lpContext32bit.Ebx;
DWORD32 ImageBaseAddress = NULL;
ReadProcessMemory(lpProcessInfo.hProcess,
&peb32bit[2],
(LPVOID)&ImageBaseAddress,
sizeof(DWORD32),
NULL);
printf("[-] 32bit ImageBase Address = 0x%08X\n", ImageBaseAddress);
printf("[-] 32bit EntryPoint Address = 0x%08X\n", lpContext32bit.Eax);
printf("[-] 32bit Process (PEB Address) = 0x%08X\n", lpContext32bit.Ebx);
uTargetAddress32bit = lpContext32bit.Eax + 0x64;
newByte32bit = 0x74;
WriteProcessMemory(lpProcessInfo.hProcess,
(LPVOID)uTargetAddress32bit,
&newByte32bit,
1,
NULL);
ResumeThread(lpProcessInfo.hThread);
WaitForSingleObject(lpProcessInfo.hThread, INFINITE);
#endif
}
return 0;
}
Attached file contains (source and binary (32bit/64bit and Wow64) for testing purposes):
Link: http://www.mediafire.com/download/l81e74mr9nc09he/loader02.rar