下面主要还是技术交流,请勿用于非法用途!
观察CE类名和标题,这个CE可以正常对游戏进行断点调试
吾爱■■的OD打开没有附件游戏,游戏没有检测,说明游戏没有线程在检测当前系统中的进程。
附加上去没有报任何错误。。。(我感觉是插件起的作用)
现在换成一个没有任何插件的OD附件看看。
DTDebug第一次打开直接闪退。打开后直接连QQHX进程都找不到。
再次关闭后打开,直接就DTDebug直接闪退,证明游戏有线程在检测我们系统中的进程,应该是检测类名,因为DTDebug的特征应该TX不会提取。
用110版本的OD打开还是看不到游戏进程,并且还是会闪退,说明QQHX游戏进程检测到了OD,将其关闭了。应该是检测的类名,因为特征的话还是那句腾讯怎么可能提取你的特征。
好了,上面OD的检测我们已经摸清楚了。
还有就是看雪的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秒显示一下
}
}
DT里面有Debug的字样,可能会被杀进程。
ollyDBG110这个也会被杀,我感觉是特征码!
我开吾爱附件上,打开DT和110,这下好直接全部都杀了。游戏也关闭了。
看雪的没有被杀,说明是插件保护的。
还是被杀了,看来是特征码检测。
其实是PEB检测,就是遍历系统进程中的PEB表中debug对象是否存在值。
但是我OD打开什么都没有做。。。这是什么原因呢?
应该还是特征检测
这是我吾爱版的插件设置,这是我为了过VMP设置的,所以尽然能过VMP的保护哪就能过游戏的保护。
过了十几分钟,它实际上还是检测到OD了,只是OD没有被杀掉。我们看下是那些插件在起作用。

当我们关掉吾爱OD的时候弹出这样一句,说明就是保护了OD。
这是看雪的版本,没有StrongOD,那就说明是StrongOD起的作用。
卸载dll的时候没有停止线程导致游戏闪退。