windows游戏调试之QQHX(Finally少年梦)

下面主要还是技术交流,请勿用于非法用途!

1681758530287
1681758532861

观察CE类名和标题,这个CE可以正常对游戏进行断点调试
1681758611056
吾爱■■的OD打开没有附件游戏,游戏没有检测,说明游戏没有线程在检测当前系统中的进程。


附加上去没有报任何错误。。。(我感觉是插件起的作用)

现在换成一个没有任何插件的OD附件看看。
DTDebug第一次打开直接闪退。打开后直接连QQHX进程都找不到。
再次关闭后打开,直接就DTDebug直接闪退,证明游戏有线程在检测我们系统中的进程,应该是检测类名,因为DTDebug的特征应该TX不会提取。

用110版本的OD打开还是看不到游戏进程,并且还是会闪退,说明QQHX游戏进程检测到了OD,将其关闭了。应该是检测的类名,因为特征的话还是那句腾讯怎么可能提取你的特征。

好了,上面OD的检测我们已经摸清楚了。
1681758888147

还有就是看雪的OD,类名改了,但是过了一会还是被游戏关闭了,证明了游戏提取了OD的特征码。只是检测的多了,有点慢。

#include "stdafx.h"
#include <WINDOWS.H>
#include <STDLIB.H>
// 提权函数:提升为DEBUG权限
BOOL EnableDebugPrivilege()
{
    HANDLE hToken;
    BOOL fOk=FALSE;
    if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
    {
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount=1;
        LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
        
        tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
        
        fOk=(GetLastError()==ERROR_SUCCESS);
        CloseHandle(hToken);
    }
    return fOk;
}


int main(int argc, char* argv[])
{
    printf("Hello World!\n");


    HWND g_hwnd = FindWindow(NULL,"QQHX");
    //HWND g_hwnd = FindWindow(NULL,"尝试HOOK MessageBoxA");
    if (g_hwnd == 0)
    {
        printf("Don't founded window handle,so exit process.\n");
        ExitProcess(0);
    }
    
    DWORD pID;
    GetWindowThreadProcessId(g_hwnd,&pID);


    printf("good job window hwnd = %x  pID = %x\n",g_hwnd,pID);
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID);


    printf("OpenProcess = %x   error code:%d\n",hProcess,GetLastError());
    //打开QQHX返回0,这个就说明OpenProcess函数已经被它hook了
    //而且打开QQHX的注入工具也看不到进程的相关模块。要么就是驱动,要么就是游戏本身hook的。
    //但是我换了个最新的Process就能看到了
    //GetLastError 返回的是5,用软件查是拒绝访问。
    //所以这个就找到切入口了。
    //说明没有提权。
    //用管理员权限打开就能读取进程了
    return 0;
}

从上面的实验可以看出来,QQHX游戏并没有做那么多的防护,目前只是检测了一个OD,CE的特征线程。

最后测试还是成功

然后我们通过注入dll成功读取到了最小血量。(这里对注入工具使用管理员权限启动的)

dll.cpp

// dll_test_qqhuaxia.cpp : Defines the entry point for the DLL application.
//


#include "stdafx.h"
#include "hook.h"


DWORD WINAPI thread_proc(LPVOID lpParameter)
{
    read_memeroy();
    return 0;
}


BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        OutputDebugString("dll---注入成功!");
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc,NULL,0,NULL);
        //read_memeroy();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        OutputDebugString("dll---剥离成功!");
        break;
    }
    return TRUE;
}

hook.cpp

#include "StdAfx.h"
#include "hook.h"
#include "tools.h"


void read_memeroy()
{
/*
    //DWORD dwHookAddress = (DWORD)GetProcAddress(LoadLibrary("WndMgr.dll"),"MessageBoxA");
    
    TCHAR b;
    
    //sprintf(&b,"模块句柄就是模块基地址 : 0x%X\n", GetModuleHandle("kernel32.dll"));


    sprintf(&b,"模块句柄就是模块基地址 : 0x%X\n", LoadLibrary("kernel32.dll"));
    //这种方式和上面的获取到模块句柄是一样的。


    OutputDebugString(&b);


    */


    HMODULE wndmgr_handle = GetModuleHandle("WndMgr.dll");
    OutputDebugStringF("WndMgr handle = 0x%X",wndmgr_handle);


    DWORD dwHookAddress = (DWORD)wndmgr_handle + 0x35363C;
    OutputDebugStringF("HOOK address = 0x%X",dwHookAddress);
    DWORD miniality = 0;
    while(1)
    {
        memcpy(&miniality,(LPVOID)dwHookAddress,sizeof(miniality));
        
        OutputDebugStringF("minimality blood = %d",miniality);
        Sleep(3000);//3秒显示一下
    }


}

1681759178994
DT里面有Debug的字样,可能会被杀进程。
1681759210427

ollyDBG110这个也会被杀,我感觉是特征码!

1681759301189

我开吾爱附件上,打开DT和110,这下好直接全部都杀了。游戏也关闭了。

1681759322264

看雪的没有被杀,说明是插件保护的。

还是被杀了,看来是特征码检测。
其实是PEB检测,就是遍历系统进程中的PEB表中debug对象是否存在值。
但是我OD打开什么都没有做。。。这是什么原因呢?
应该还是特征检测

1681759359254

这是我吾爱版的插件设置,这是我为了过VMP设置的,所以尽然能过VMP的保护哪就能过游戏的保护。

过了十几分钟,它实际上还是检测到OD了,只是OD没有被杀掉。我们看下是那些插件在起作用。


1681759405868

当我们关掉吾爱OD的时候弹出这样一句,说明就是保护了OD。

这是看雪的版本,没有StrongOD,那就说明是StrongOD起的作用。

卸载dll的时候没有停止线程导致游戏闪退。

QQ幻想?

QQ华夏,差点毁了我一生的游戏,lxl,dnf,cf这些都一样的

刘老师,有时间的话一边搞你的逆向赚点生活费,建议一边搞搞AI,潜力很大

1 个赞

看看能不能搞个自动逆向神器

都会逆向了,那数据集就来了;数据集来了,就可以结合fine-tune微调了;能微调了,那Stable Diffusion和OpenAI……思路可以打开嘛

一台机器每天有50收入,稳定风险又小