好孩子不怎么玩游戏,就拿这个练下手了,看郁的教程装了个热血,那个直接SetWindowText然后将游戏换个目录就可以多开。
先运行一个Frozen Throne.exe,然后再运行一个提示“魔兽争霸资料片:冰封王座已经运行”,OD载入bp MessageBoxA下断,执行后ait+f9返回用户代码
004010AE |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 004010B0 |. 8D4C24 40 LEA ECX,DWORD PTR SS:[ESP+40] ; | 004010B4 |. 50 PUSH EAX ; |Title 004010B5 |. 51 PUSH ECX ; |Text 004010B6 |. 6A 00 PUSH 0 ; |hOwner = NULL 004010B8 |. FF15 34714000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA 004010BE |. 8B5424 10 MOV EDX,DWORD PTR SS:[ESP+10] 004010C2 |. 52 PUSH EDX ; /hObject 004010C3 |. FF15 58704000 CALL DWORD PTR DS:[<&KERNEL32.CloseHandl>; \CloseHandle
看到CloseHandle没,应该是使用的创建互斥对象来防多开的,向上找,看到了GetLastError了
果断JNZ改为JMP,上面看到使用的是CreateEvent。保存修改,运行下,不行,又出来错误提示“请核实您的冰封王座光盘已在光盘驱动器中,然后点击重试”,OD载入修改好后的Frozen Throne.exe,发现是创建了个进程,Frozen Throne.exe就相当于个loader,那我们直接分析war3.exe吧
先运行一个war3.exe,然后再运行一个提示“warcraft III was unable to initialize”,od载入bp MessageBoxA,F9运行,断下,ALT+F9返回用户代码,弹出那个窗口了,所在的是GAME.DLL这个模块,在附近没有发现可以跳过这个CALL的地方,按CTRL+F9执行到返回,往上拉可以看到“warcraft III was unable to initialize“这个字符串了,CTRL+F9继续执行到返回
6F00974A 85C0 TEST EAX,EAX 6F00974C 74 0F JE SHORT Game.6F00975D 6F00974E E8 ED270000 CALL Game.6F00BF40 6F009753 33C9 XOR ECX,ECX 6F009755 E8 66D1FFFF CALL Game.6F0068C0 ;返回到这个CALL 6F00975A 33C0 XOR EAX,EAX 6F00975C C3 RETN 6F00975D B9 9881886F MOV ECX,Game.6F888198 ; ASCII "Warcraft III Game Application"在这个CALL的上面看到了个跳转,改为强制跳转试下,保存修改,成功多开