首先話說前面:這個遊戲的多開已經是免費的到處都有了。研究僅僅是作為技術部分在研究,而且也不會存在商業利益。
//-------------------------------------------------------
首先,該遊戲會在廣告窗口 創建一個名為:“WvsClintMtx” 的互斥體多開,來防止二次開啟…如果存在該互斥體,就自動跳到第一個上面並且退出第二個進程。
對此,我用劫持的方法HOOK了CreateFileMutexA,並且成功開啟第二個遊戲廣告界面。代碼如下:
if (lpName && !lstrcmpiA(lpName,"WvsClientMtx"))//检查传递进来的参数里是不是WvsClientMtx
{
//如果是
DWORD Timer;
int RandTimer;
char ChangeName[254];
Timer = GetTickCount();//随机一组数字
srand(Timer);//置随机种子
RandTimer = rand();//随机一个数字
sprintf(ChangeName,"%s_%d",lpName,RandTimer);//格式化为WvsClientMtx_1123 这样
MyDbgPrintA("[+] 名称为: %s 修改名字尝试为:%s",lpName,ChangeName);
lpName = ChangeName;//更改
}
MyDbgPrintA("[+] 名称为: %s 创建",lpName);
這樣雖然可以開啟更多的廣告界面的遊戲,但是第一個登入遊戲後,會發現第二個的時候就會提示
HS遊戲運行中…這樣這樣…
然後後面還有其他的。例如會創建一些Mapping這樣。 針對某多開逆倒是逆出了一點東西。不過很明顯,不完全。
if (!lpName || lstrcmpiA(lpName,"MultiProcessor__"))
{
if (lpName && strstr(lpName,"Global\\{D843DD7B-FD87-4027-98A6-5B5869D753E1}"))
{
MyDbgPrintA("[+CreateFileMappingA+] 开始控制 %s",lpName);
DWORD Timer = GetTickCount();
srand(Timer);
DWORD RandTimer = rand();
sprintf(TempMappingA,"%s_%d",lpName,RandTimer);
MyDbgPrintA("[+CreateFileMappingA+] %s -> %s",lpName,TempMappingA);
lpName = 0;
}
}
Event我則只是以這個處理的。“if( !strstr(lpName,"Global\\DEA74738")”
處理一些之後依然沒有弄明白“HS”的206 檢測出現在哪個地方。
也希望各路大神能夠指點一下……
以下是我寫的部分源代碼,如果對大家有用了還請收下。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课