Tea9源码网 - 免费分享精品源码、教程、软件|全网干货资源收集,免费下载。

利用shellcode实现植物大战僵尸自动种植辣椒教学

发布:吾爱破解论坛2021-8-25 14:53分类: 技术教程 标签: C语言 编程技巧 植物大战僵尸 shellcode 植物大战僵尸自动种植辣椒

植物大战僵尸的逆向教程有很多人已经做过了,我想稍微做一点不一样的东西。

这个视频从最开始找数据讲起,到编写机器码的思路,再到最后的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[1024] = 
    {
        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 [[popcapgame1.exe + 0x331C50]+ 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;
}
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 2070 人阅读