Ceylon 发表于 2021-7-26 00:49

利用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;
}

Ceylon 发表于 2021-7-26 19:53

小木曾雪菜 发表于 2021-7-26 09:13
这个视频录制太糊了,都看不清

手机看起来可能会比较糊?电脑上开1080p全屏看应该是挺清楚的

netpeng 发表于 2021-7-26 01:06

这效率就更高了,厉害了。感谢分享

枫叶波澜 发表于 2021-7-26 02:05

感谢发布原创作品,吾爱破解论坛因你更精彩!

knight5801 发表于 2021-7-26 02:53

不明觉厉

alongzhenggang 发表于 2021-7-26 03:03

额问我不太会玩这个

bbk520 发表于 2021-7-26 03:24

厉害了。。。。。

Jokerwow 发表于 2021-7-26 06:57

谢谢分享&#128512;

bugcode776 发表于 2021-7-26 08:17

66666666666666666

caidesi520 发表于 2021-7-26 08:40


学到了 感谢分享

已默然 发表于 2021-7-26 08:59

get it,感谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 利用shellcode实现植物大战僵尸自动种植辣椒