1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <Windows.h> #include <Tlhelp32.h> #include <stdio.h> int PlantCall() { DWORD pid = NULL; HWND hWnd = FindWindowW(NULL, L"Plants vs. Zombies"); if (hWnd == 0) { wprintf(L"Module wrong %p\n", hWnd); return 0; } else { wprintf(L"Module %p\n", hWnd); } GetWindowThreadProcessId(hWnd, &pid); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); if (hProcess == 0) { wprintf(L"hProcess wrong %p\n", hProcess); return 0; } else { wprintf(L"hProcess %p\n", hProcess); } DWORD modaddr = NULL; MODULEENTRY32 modentry; memset(&modentry, 0, sizeof(modentry)); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); modentry.dwSize = sizeof(MODULEENTRY32); Module32FirstW(hSnapshot, &modentry); do { if (wcscmp(modentry.szModule, L"PlantsVsZombies.exe") == 0) { wprintf(L"Module %s\n", modentry.szModule); modaddr = (DWORD)modentry.hModule; CloseHandle(hSnapshot); break; }
} while (Module32Next(hSnapshot, &modentry)); BYTE shellcode[1024] = { 0x60, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8D, 0x6D, 0x1D, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x02, 0x8B, 0x45, 0x00, 0x8B, 0x4D, 0x04, 0x51, 0x8B, 0x55, 0x08, 0x52, 0x8B, 0x4D, 0x0C, 0xFF, 0xD1, 0x61, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; DWORD x = 8; DWORD y = 0; DWORD pObj = modaddr; printf("module addr pOBJ is %p\n", pObj); ReadProcessMemory(hProcess, (LPVOID)(pObj + 0x329670), &pObj, 4, 0); printf("pOBJ is %p\n", pObj); ReadProcessMemory(hProcess, (LPVOID)(pObj + 0x868), &pObj, 4, 0); printf("pOBJ is %p\n", pObj); DWORD pFunc = modaddr + 0xFA10; *(char*)(shellcode + 0x10) = 0x02; *(DWORD*)(shellcode + 0x23) = y; *(DWORD*)(shellcode + 0x27) = x; *(DWORD*)(shellcode + 0x2B) = pObj; *(DWORD*)(shellcode + 0x2F) = pFunc; while (true) { *(DWORD*)(shellcode + 0x23) = y; LPVOID calladdr = VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (calladdr == 0)return 0; printf("%p is %p\n", &calladdr, calladdr); WriteProcessMemory(hProcess, calladdr, shellcode, 1024, NULL); HANDLE hRemote = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)calladdr, NULL, NULL, NULL); WaitForSingleObject(hRemote, INFINITE); y++; if (y == 5) y = 0; Sleep(1000); CloseHandle(hRemote);
} CloseHandle(hProcess); return 0;
} int main() { PlantCall(); return 0; }
|