几年不玩绝地求生了, 最近心血来潮, 下载了一个绝地求生, 并且买了一款外挂(我玩什么游戏都开挂, 个人习惯, 不喜勿喷), 玩了几天还挺稳定的, 在好奇心和自身身为程序员的驱使下, 对该外挂样本进行了分析, 最主要的是分析他如何通过各种反作弊的重重包围, 把自己的代码注入进目标进程执行的

由于反作弊厂商对游戏都有进程保护, 在用户层不使用驱动很难对目标进程内存操作, 现在市面上百分之90的外挂启动的时候都要加载一份驱动, 用于读写/注入等操作, 这样的话我敢肯定该外挂加载了驱动, 我们来写一个回调监控一下驱动的加载

VOID LoadCallBack(PUNICODE_STRING pFullImageName, HANDLE hProcessId, PIMAGE_INFO pImageInfo)
{
    if (KeGetCurrentIrql() == PASSIVE_LEVEL)
    {
        if (pFullImageName != NULL && hProcessId <= (HANDLE)(4))
        {
            DbgPrint("[GS] %wZ \n", pFullImageName);
        }
    }
}
 
VOID UnloadDriver(PDRIVER_OBJECT pDriverObject)
{
    PsRemoveLoadImageNotifyRoutine((PLOAD_IMAGE_NOTIFY_ROUTINE)LoadCallBack);
}
 
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
    PLDR_DATA_TABLE_ENTRY pLdr = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
 
    pLdr->Flags |= 0x20;
 
    pDriverObject->DriverUnload = UnloadDriver;
 
    PsSetLoadImageNotifyRoutine((PLOAD_IMAGE_NOTIFY_ROUTINE)LoadCallBack);
 
    return STATUS_SUCCESS;
}

写好代码后编译出来, 加载我们的驱动, 然后启动该外挂, 并拦截到信息

773537_7XW7GPU75F69U9V.png

文件大小26192字节, 约25KB, 没有加壳的, 按照习惯直接拖进IDA分析, 经过分析和查看该驱动签名, 判断该驱动是技嘉的漏洞驱动, 并且该驱动签名已被吊销

773537_STVT4C9576BQFRR.png

吓得我赶紧查了一下该驱动的漏洞, 可以实现注入功能!?!?!? 该漏洞为 CVE-2018-19323 经过查询, 该驱动主要用于内核提权, 貌似没有办法实现注入

对了, 突然想起来, 外挂登陆的时候, 有这样一个提示

QQ截图20201109142014.png

也就是不重启电脑, 只要开启TslGame.exe就可以注入, 那这??? 大家是不是想起了刚刚我们写的LoadImage回调或者CreateProcess回调???

我和大家有一样的想法, 于是打开PCHunter枚举系统中的回调, 发现并没有, 难道回调被隐藏了??? 于是我把系统中的回调入口全部查了一遍, 并没有发现任何的钩子, 这样的话我陷入了困境, 他到底是如何监控游戏启动的呢??? 又是如何讲自己的作弊代码注入进去的呢???

想了一会, 我决定还是从外挂样本EXE程序入手, 这个外挂作者加了VMP的壳, 并且加了反调试一些东西, 没关系, 这些形同虚设, 直接PCHunter摘钩子就可以了,我们调试下他的程序, 看他究竟做了哪些操作, CE在配合Process Monitor操作下, 发现了该进程使用了傀儡进程, MMC.EXE, 向目标进程注入了自己的代码并执行, 执行后退出自己的EXE程序, 现在心里有了大概的思路, 他是通过注入傀儡进程, 去监控目标进程的启动实现注入, 这下好办了, 我们转移目标, 直接去调试MMC.EXE,

773537_W94KWJPDWBRD4FD.png

现在二话不说, 直接MMC.EXE傀儡进程内下断FindWindowA, 因为现在要获取游戏进程的ID, 在R3层最好的办法就是先取到目标进程窗口句柄, 后再用GetWindowThreadProcessId取到目标进程ID, 我们来操作实践一下

773537_YKRGHAFMMZANABV.png

不出所料, 果然成功断下, 我们单步走, 记住他所有函数的调用顺序

773537_RNS66R7TT2SS24N.png

和我预想的一样, Nice, 一切顺利, 接下来走, 看看他调用了哪些函数, 如何实现注入的

QQ截图20201109141609.png

QQ截图20201109141636.png

What??? 不是把!!! 再继续跟!!!

QQ截图20201109141723.png

此时游戏中已经有了外挂菜单的字样!!!

QQ截图20201109141811.png

大家是否心中已经有了答案??