/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Step1: 在“BOOL MyPatchClassName()”函数之前加入如下内容:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD g_dwRet;
const BYTE g_pZeroCheck[] = {0x16,0x67,0x54,0x89, 0x7c,0x00,0x00,0x00};
const BYTE g_pCheckFlag[] = {0x50,0x63,0x45,0x78,0x74,0x72,0x61,0x43,0x68,0x65,0x63,0x6B,0x00,0x00,0x00,0x00};
void __stdcall MyRecvPcExtraCheck(PBYTE pThis, PVOID pBufStack)
{
MyDbgPrint("[+MyRecvPcExtraCheck+] in, patch it!");
//强制修改了接收到的PcExtraCheck报文,该8字节为协议字后的8字节,固定格式
//实际是屏蔽了后面多组264字节,不再入vector. 则下文不再汇报本机特征id
memcpy(pThis + 16, g_pZeroCheck, sizeof(g_pZeroCheck));
}
__declspec(naked) void __stdcall MyAsmRecvPcExtraCheck(PVOID pBufStack)
{
__asm{
pop g_dwRet //弹出返回地址
push ecx //压入thiscall的this
call MyRecvPcExtraCheck //实际两形参调用
jmp g_dwRet //返回原调用方
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Step2: 在“BOOL MyPatchClassName()”函数最后,即“return TRUE;”语句之前,加入如下内容
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//pp为vc7.1编译,特征串及地址均为4字节对齐,快速搜。位于数据段,可直接写
for ( pSearch = pSearchBegin ; pSearch < pSearchBegin + dwSizeOfData - sizeof(g_pCheckFlag) ; pSearch+= 4){
if ( !memcmp(pSearch, g_pCheckFlag, sizeof(g_pCheckFlag)) ){
PDWORD pVirtual = (PDWORD)( pSearch + sizeof(g_pCheckFlag) + 4*4 );
MyDbgPrint("[+] find PcExtraCheck pVirtual addr:0x%08x, Fun:0x%08x",pVirtual,*pVirtual);
*pVirtual = (DWORD)MyAsmRecvPcExtraCheck; //替换PcExtraCheck收包处理的虚函数为自己的.
MyDbgPrint("[+] now PcExtraCheck pVirtual addr:0x%08x, Fun:0x%08x",pVirtual,*pVirtual);
break;
}
}
return TRUE; //原来最后的语句
[color=#ff0000][b]以上内[size=4]容源[/size]自黑黑的脸蛋,期待黑玄等大神在2.0之后能有可用的双开作品
目前已在服务端检测,不允许同一台pc运行两个pp.
流程:
用户刚登录成功后,
服务端发,扩展检查报文,要求客户端提供机器id.
-> 客户端收,根据cpuid、系统盘的卷序列号及网卡mac地址,生成唯一的用户机器id
-> 客户端发,加码处理用户机器id,发送给服务端
-> 服务端收,检查目前所有在线用户,是否有该机器id,有则关闭套接字,强制多开的客户端下线。
patch原理:
客户端收到扩展检查报文后,会调用PcExtraCheck类处理,转换报文到类中,
PcExtraCheck类虚函数表的第4个函数负责该转换
特征串定位查找到该虚函数表,替换到自己的函数。
patch原要求提供机器id为空请求。[/b][/color]