dead strikedeadbydaylight怎么玩玩

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
游戏安全一直是敏感的灰色话题,很多技术不会公开,从事游戏攻防的也很低调。这造成一个问题,对游戏安全感兴趣的人会无从下手,比如我,就不知道面对复杂的游戏如何分析。经过一些日子的思考学习,总算有了点思路,就以CS为例,介绍如何分析游戏、辅助工具以及相应的安全防护。
选择CS有几个原因:首先它是我第一次碰电脑就接触的东西,感情深厚;其次CS逻辑清晰易懂,没有复杂的反调试、加密等防护;最后就是基本所有人都玩过,写例子大家也容易理解。打算写一个小系列,从简单的不死、子弹不减到联网状态的数据包传输、找到各个功能实现call、人物画面渲染等,最后了解整个游戏结构,并写出防护软件来保护CS。
今天写第一回,血量、子弹分析。涉及到的工具有CE、OD、IDA、PCHunter32、notepad++、CS1.6中文版、VS2005。最后实现自己不掉血、不减少子弹。假设读者有一定逆向基础,了解windows编程。并没有分析过CS,也不太了解游戏分析流程,毕竟求大神飘过无视。工具使用只会略作介绍。
打开CS,选fy_iceworld雪地,方便捡***的图。先用手***,刚开始20发子弹。打开CE,附加到CS,扫描4字节的精确十进制数20,这里我默认子弹数用四字节。首次扫描,找出了内存中所有值为20的4字节数据的地址,非常多,需要排除。打一***,再扫描19,剩余197项;再来几***,扫描子弹剩余数,这次都跟着变化了,如下图所示。所以挨着查看分析。
先想想,实际上我们需要找到保存子弹数目的原始地址,这个地址的值是运算得来的。其它地方,比如用于显示图上“16|40”数字的地址,它的值应该是直接复制而来的。所以我们改原始地址的值,其它地方应该会相应的改变。这是一种假设,是我们设计程序的时候采用的方法。不妨试试挨着修改。
非常幸运,改地址列表中的第一个地址的值,就验证了我们的猜测。至于为什么能想到这个,我想这就是学习的目的吧。
找到了需要的原始地址,接下来该确定什么代码改写了它。内存写断点可以实现。右键CE中我们找到的地址,选“找出什么改写了这个地址”,将CS载入CE内置的调试器并设好了内存写断点。然后我们打一***,就能找到减少子弹的代码了。如下图:
改变子弹数目的代码如下:
mp.weapon_glock18+5EA - 48
mp.weapon_glock18+5EB - 8B CE
- mov ecx,esi
mp.weapon_glock18+5ED - 89 86 CC000000
- mov [esi+000000CC],eax
return FALSE;
addrToJmp = VirtualAllocEx(hProcess, 0, 50, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (addrToJmp == NULL)
printf("VirtualAllocEx in cs.exe error!\n");
CloseHandle(hProcess);
return FALSE;
offset = (g_bloodAddr + 10) - 5 - ((DWORD)addrToJmp + origOffset1 -1);
memcpy((g_bloodShellcode + origOffset1), &offset, 4);
offset = (g_bloodAddr + 10) - 5 - ((DWORD)addrToJmp + origOffset2 -1);
memcpy((g_bloodShellcode + origOffset2), &offset, 4);
WriteProcessMemory(hProcess, addrToJmp, g_bloodShellcode, sizeof(g_bloodShellcode), &ret);
if (ret != sizeof(g_bloodShellcode))
printf("WriteProcessMemory error!\n");
VirtualFreeEx(hProcess, addrToJmp, 50, MEM_FREE);
CloseHandle(hProcess);
return FALSE;
offset = (DWORD)addrToJmp - 5 - g_bloodA
memcpy(g_patchedBlood + 1, &offset, 4);
WriteProcessMemory(hProcess, (PVOID)g_bloodAddr, g_patchedBlood, 10, &ret);
if (ret != 10)
printf("WriteProcessMemory error!\n");
VirtualFreeEx(hProcess, addrToJmp, 50, MEM_FREE);
CloseHandle(hProcess);
return FALSE;
return TRUE;
int main()
g_csProcessId = GetProcessIdByName("cstrike.exe");
g_mpBase = (DWORD)GetMPBase(g_csProcessId, "mp.dll");
g_bloodAddr = BLOOD_ADDR(g_mpBase);
ChangeToUndead();
printf("%d 0x%p\n", g_csProcessId, g_mpBase);
// BackToOriginalDead(g_bloodAddr, g_originalBlood, g_patchedBlood);
return FALSE;
addrToJmp = VirtualAllocEx(hProcess, 0, 50, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (addrToJmp == NULL)
printf("VirtualAllocEx in cs.exe error!\n");
CloseHandle(hProcess);
return FALSE;
offset = (g_bloodAddr + 10) - 5 - ((DWORD)addrToJmp + origOffset1 -1);
memcpy((g_bloodShellcode + origOffset1), &offset, 4);
offset = (g_bloodAddr + 10) - 5 - ((DWORD)addrToJmp + origOffset2 -1);
memcpy((g_bloodShellcode + origOffset2), &offset, 4);
WriteProcessMemory(hProcess, addrToJmp, g_bloodShellcode, sizeof(g_bloodShellcode), &ret);
if (ret != sizeof(g_bloodShellcode))
printf("WriteProcessMemory error!\n");
VirtualFreeEx(hProcess, addrToJmp, 50, MEM_FREE);
CloseHandle(hProcess);
return FALSE;
offset = (DWORD)addrToJmp - 5 - g_bloodAddr;
memcpy(g_patchedBlood + 1, &offset, 4);
WriteProcessMemory(hProcess, (PVOID)g_bloodAddr, g_patchedBlood, 10, &ret);
if (ret != 10)
printf("WriteProcessMemory error!\n");
VirtualFreeEx(hProcess, addrToJmp, 50, MEM_FREE);
CloseHandle(hProcess);
return FALSE;
return TRUE;}int main(){
g_csProcessId = GetProcessIdByName("cstrike.exe");
g_mpBase = (DWORD)GetMPBase(g_csProcessId, "mp.dll");
g_bloodAddr = BLOOD_ADDR(g_mpBase);
ChangeToUndead();
printf("%d 0x%p\n", g_csProcessId, g_mpBase);
// BackToOriginalDead(g_bloodAddr, g_originalBlood, g_patchedBlood);
return 0;}
编译运行之后csrike.exe进程就被patch了,这个时候只有自己是死不了的。我们的目标实现了。
问题及后续
有了这个代码,建立游戏就可以在局域网内狂虐小伙伴们了。但是如果你加入一个游戏,那就行不通了。也就是说我们之前找的都是服务器的代码段。客户端根本不会执行那些代码。现在以客户端的身份查找血值变化。只找到这么一个疑似代码段:
01948B80 - 8B 44 24 08
- mov eax,[esp+08]
01948B84 - 8B 4C 24 0C
- mov ecx,[esp+0C]
01948B88 - 50
- push eax
01948B89 - 51
- push ecx
01948B8A - E8 A1F30000
- call 01957F30
01948B8F - 83 C4 08
- add esp,08
01948B92 - E8 F9F30000
- call 01957F90
01948B97 - 8B 15 747CA101
- mov edx,[01A17C74] : []
01948B9D - 8B 0D 787CA101
- mov ecx,[01A17C78] : []
01948BA3 - 83 CA 01
- or edx,01
01948BA6 - 3B C1
- cmp eax,ecx
01948BA8 - 89 15 747CA101
- mov [01A17C74],edx
01948BAE - 74 0F
- je 01948BBF
01948BB0 - C7 05 847CA101
- mov [01A17C84],42C80000
01948BBA - A3 787CA101
- mov [01A17C78],eax
01948BBF - B8
- mov eax,
01948BC4 - C3

参考资料

 

随机推荐