利用shellcode实现植物大战僵尸自动种植辣椒
本帖最后由 Ceylon 于 2021-7-26 19:51 编辑视频链接:https://b23.tv/dS86xA
植物大战僵尸的逆向教程有很多人已经做过了,我想稍微做一点不一样的东西。
这个视频从最开始找数据讲起,到编写机器码的思路,再到最后的C语言代码构建都有详细的说明和步骤。
(C语言代码部分没有包含程序提权、判断空指针、返回错误代码等功能,仅仅写了最基础的能实现功能的框架,如有需要请自行添加)
在这个视频中我把shellcode分为了数据段和代码段两个部分,但是就此视频想要实现的功能而言不需要这么麻烦,
可以去掉数据段并用C直接修改代码段里相应的机器码。
这里仅仅是分享一种构建shellcode的思路,你可以将它用于更复杂的场合。
如果还有不明白的地方或者是有更好的建议也欢迎在评论区留言~
视频中的代码:
#include <Windows.h>
#include <TlHelp32.h>
int main()
{
/**********Ⅰ.依次获取窗口句柄,进程ID,线程句柄**********/
DWORD pid = NULL;
HWND hWnd = FindWindowW(NULL, L"Plants vs. Zombies");
GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
/*********************Ⅱ.获取模块地址*******************/
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"popcapgame1.exe") == 0)
{
modaddr = (DWORD)modentry.hModule;
CloseHandle(hSnapshot);
break;
}
} while (Module32Next(hSnapshot, &modentry));
/**************Ⅲ.创建并远程调用shellcode***************/
BYTE shellcode =
{
0x60, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8D, 0x6D, 0x1D, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A,
0x14, 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
};
//对象指针 pObj [+ 0x868]
//函数指针 pFunc popcapgame1.exe + 105A0
DWORD x = 0;
DWORD y = 0;
DWORD pObj = modaddr;
ReadProcessMemory(hProcess, (LPCVOID)(pObj + 0x331C50), &pObj, 4, 0);
ReadProcessMemory(hProcess, (LPCVOID)(pObj + 0x868), &pObj, 4, 0);
DWORD pFunc = modaddr + 0x105A0;
*(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);
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);
VirtualFreeEx(hProcess, calladdr, NULL, MEM_RELEASE);
CloseHandle(hRemote);
}
CloseHandle(hProcess);
return 0;
} 小木曾雪菜 发表于 2021-7-26 09:13
这个视频录制太糊了,都看不清
手机看起来可能会比较糊?电脑上开1080p全屏看应该是挺清楚的 这效率就更高了,厉害了。感谢分享 感谢发布原创作品,吾爱破解论坛因你更精彩! 不明觉厉 额问我不太会玩这个 厉害了。。。。。 谢谢分享😀 66666666666666666
学到了 感谢分享 get it,感谢分享