-
-
[旧帖]
[原创]PEDIY某单机游戏,加入简单功能
0.00雪花
-
发表于:
2011-10-22 15:45
4048
-
[旧帖] [原创]PEDIY某单机游戏,加入简单功能
0.00雪花
最近看了《加密与解密》,想起来自己一直玩儿的一个游戏有个BUG,于是想自己DIY游戏程序将它修正。本文内容很简单,欢迎指点、批评。
顺便申请邀请码,想转正啊~~如果可以的话,EMAIL:naylon@126.com~~是与否都先感谢
这款游戏叫GTA:ViceCity(侠盗:罪恶都市),各位可以去网上搜一搜
VC这款游戏有个严重BUG,在多核心处理器的计算机上很容易死机(全屏的话基本上就得重启),而且有时候游戏里鼠标不能动,必须来回按ESC/Resume才能解决(有时候RP不好就直接黑屏了)。解决方法倒是也容易,打开任务管理器,找到gta-vc.exe进程,右键“关系设置”,然后只勾选一个CPU(通常是CPU0),点确定即可。
可是每回进游戏都得再切出来一次调试,实在是很麻烦,于是我就想修改gta-vc.exe,让它启动时自动设置为在CPU0上运行。
1.分析任务管理器的内部实现
首先要分析taskmgr.exe,也就是系统的任务管理器,看看他是怎么实现为进程指定CPU运行的,既然要操作进程,那么它内部肯定需要用OpenProcess函数打开进程,然后用返回的句柄操作,那么我们就用OD调试之,给OpenProcess下断(注意要暂停刷新,否则都会一直断在OpenProcess里面)下好断之后,选中进程点关系设置,这时就断在了OpenProcess里,返回程序领空,来看看关键代码。
0100BA26 /$ 55 PUSH EBP
0100BA27 |. 8BEC MOV EBP,ESP
0100BA29 |. 51 PUSH ECX
0100BA2A |. 53 PUSH EBX
0100BA2B |. 56 PUSH ESI
0100BA2C |. 57 PUSH EDI
0100BA2D |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /ProcessId
0100BA30 |. 33DB XOR EBX,EBX ; |
0100BA32 |. 53 PUSH EBX ; |Inheritable => FALSE
0100BA33 |. 68 00060000 PUSH 600 ; |Access = SET_INFORMATION|QUERY_INFORMATION
0100BA38 |. 8BF1 MOV ESI,ECX ; |
0100BA3A |. FF15 14110001 CALL DWORD PTR DS:[<&kernel32.OpenProces>; \OpenProcess
0100BA40 |. 8BF8 MOV EDI,EAX
0100BA42 |. 85FF TEST EDI,EDI
0100BA44 |. 74 4E JE SHORT taskmgr.0100BA94
0100BA46 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0100BA49 |. 50 PUSH EAX ; /pSystemAffinityMask
0100BA4A |. 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8] ; |
0100BA4D |. 50 PUSH EAX ; |pProcessAffinityMask
0100BA4E |. 57 PUSH EDI ; |hProcess
0100BA4F |. FF15 08110001 CALL DWORD PTR DS:[<&kernel32.GetProcess>; \GetProcessAffinityMask
0100BA55 |. 85C0 TEST EAX,EAX
0100BA57 |. 74 30 JE SHORT taskmgr.0100BA89
0100BA59 |. 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8]
0100BA5C |. 50 PUSH EAX ; /lParam
0100BA5D |. 68 5BB60001 PUSH taskmgr.0100B65B ; |DlgProc = taskmgr.0100B65B
0100BA62 |. FF76 04 PUSH DWORD PTR DS:[ESI+4] ; |hOwner
0100BA65 |. 6A 7C PUSH 7C ; |pTemplate = 7C
0100BA67 |. FF35 705D0101 PUSH DWORD PTR DS:[1015D70] ; |hInst = 01000000
0100BA6D |. FF15 FC130001 CALL DWORD PTR DS:[<&user32.DialogBoxPar>; \DialogBoxParamW
0100BA73 |. 83F8 01 CMP EAX,1
0100BA76 |. 75 0E JNZ SHORT taskmgr.0100BA86
0100BA78 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
0100BA7B |. 57 PUSH EDI
0100BA7C |. FF15 0C110001 CALL DWORD PTR DS:[<&kernel32.SetProcess>; kernel32.SetProcessAffinityMask
0100BA82 |. 85C0 TEST EAX,EAX
0100BA84 |. 74 03 JE SHORT taskmgr.0100BA89
0100BA86 |> 33DB XOR EBX,EBX
0100BA88 |. 43 INC EBX
0100BA89 |> 57 PUSH EDI ; /hObject
0100BA8A |. FF15 5C110001 CALL DWORD PTR DS:[<&kernel32.CloseHandl>; \CloseHandle
0100BA90 |. 85DB TEST EBX,EBX
0100BA92 |. 75 14 JNZ SHORT taskmgr.0100BAA8
0100BA94 |> FF15 68110001 CALL DWORD PTR DS:[<&kernel32.GetLastErr>; [GetLastError
0100BA9A |. 50 PUSH EAX ; /Arg3
0100BA9B |. 68 68750000 PUSH 7568 ; |Arg2 = 00007568
0100BAA0 |. FF76 04 PUSH DWORD PTR DS:[ESI+4] ; |Arg1
0100BAA3 |. E8 789AFFFF CALL taskmgr.01005520 ; \taskmgr.01005520
0100BAA8 |> 5F POP EDI
0100BAA9 |. 5E POP ESI
0100BAAA |. 8BC3 MOV EAX,EBX
0100BAAC |. 5B POP EBX
0100BAAD |. C9 LEAVE
0100BAAE \. C2 0400 RETN 4
0065B845 > \8B8424 440400>MOV EAX,DWORD PTR SS:[ESP+444] ; 案例 0 --> 分支 0065B5DA
0065B84C . 55 PUSH EBP
0065B84D . 6A 78 PUSH 78
0065B84F . 8B08 MOV ECX,DWORD PTR DS:[EAX]
0065B851 . 890D A4977800 MOV DWORD PTR DS:[7897A4],ECX
0065B857 . E8 007D0000 CALL <JMP.&d3d8.Direct3DCreate8>
0065B85C . 33FF XOR EDI,EDI
0065B85E . A3 B4977800 MOV DWORD PTR DS:[7897B4],EAX
0065B863 . 3BC7 CMP EAX,EDI
0065B865 . 75 0C JNZ SHORT gta-vc-b.0065B873
0065B867 . 5D POP EBP
0065B868 . 5F POP EDI
0065B869 . 33C0 XOR EAX,EAX
0065B86B . 5E POP ESI
0065B86C . 81C4 30040000 ADD ESP,430
0065B872 . C3 RETN
……
0065B857 . E8 007D0000 CALL <JMP.&d3d8.Direct3DCreate8>
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!