x64逆向某游戏线程检测 (一)
申明
以下是我对某个游戏的检测线程比较感兴趣进行一定分析,切勿用于非法行为,所产生后果自行承担,本人不负任何责任。
原理
一般线程检测需要用到API函数有CreateToolhelp32Snapshot—Thread32First—Thread32Next;在这当中某一个API下个断点即可,再找返回上一层就是调用它的地址。
定位逆向汇编代码
我下断点的api函数是:Thread32First;然后返回上层得到的地址如下:
汇编代码进行还原c代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
int main()
{
THREADENTRY32 te32; // 线程快照信息
// 创建线程快照
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
{
GetLastError()|0xE0F0000; //错误码或上0xE0F0000
//然后 跳转到相关处理函数
std::cout << "如果相等就错了一些处理" << std::endl;
return FALSE;
}
//把XMMO 置为0 R8 = CloseHandle地址 RDX = hThreadSnap RCX = 堆栈指针地址;
//call 1c318fed458 不知道这个函数做什么检测用 下次跟进看看
// 为快照分派内存空间
te32.dwSize = sizeof(THREADENTRY32);
// 获取第一个线程的信息
if (Thread32First(hThreadSnap, &te32) == 0)
{
std::cout << "失败做一些处理" << std::endl;
}
while (1)
{
//mov rax,[rsi] //rsi指向一个类
//lea rdx,[rsp+38] //取的是te32堆栈地址 得到线程的相关信息
//mov rcx,rsi //把rsi的地址传给rcx
// call [rax] //rax是一个函数地址值
//这个函数传了二个值 第一个是rsi指向类的值,第二个传的是te32
//做一些线程特征等检测
//之后分析这个函数检测了一些什么线程特征
//检测完返回值不为0 那么就继续循环下个线程
BOOL tmp = TRUE;
if (TRUE)
{
if (Thread32Next(hThreadSnap, &te32) == 0)
{
std::cout << "跳转到别的地方处理" << std::endl;
}
}
}
}
总结
//mov rax,[rsi] //rsi指向一个类
//lea rdx,[rsp+38] //取的是te32堆栈地址 得到线程的相关信息
//mov rcx,rsi //把rsi的地址传给rcx
// call [rax] //rax是一个函数地址值
//这个函数传了二个值 第一个是rsi指向类的值,第二个传的是te32
//做一些线程特征等检测
主要就是分析上面这个检测函数做了什么,在检测二来具体分析!
如果对您有帮助,请点赞!谢谢