首页
社区
课程
招聘
[原创]植物大战僵尸网络对战的实现
发表于: 2022-2-13 02:03 15590

[原创]植物大战僵尸网络对战的实现

2022-2-13 02:03
15590

前言

恰逢钱老师在节假日的时候给了我们一个植物大战僵尸网络对战的任务,刚刚过完年正好有时间整理一下,与大家分享

准备工作

  1. 植物大战僵尸 CE x64Dbg(32位) vs2019 cff CodeinEX 注入器(dll)
  2. 细分任务,把总体的任务划分为一个一个的小的部分,便可轻松完成
  3. 这里先简单的划分一下,1.通讯、2.植物种植、3.僵尸的产生

写在前面:想写的很多,但是有好多需要需要调试的地方,估计只能写一点点

基址(个人理解)

  1. 基址:有一个全局变量来记录相关信息,这个全局变量相对于 exe/dll 相对的位置是不变的
  2. 偏移:结构体里面记录了一个另一个结构体位置的偏移

通讯

  1. 这里选择TCP连接方便稳定
  2. 定义结构(植物/僵尸,种植/产生的位置,其他的一些数据)
  3. 植物
    1. 植物端:种植植物,发送植物位置,植物类型
    2. 僵尸端:接收种植信息,种植相应的植物,相应的位置
  4. 僵尸
    1. 植物端:接收僵尸信息,产生相应的僵尸,相应的位置
    2. 僵尸端:产生僵尸,发送僵尸位置,僵尸类型
  5. 其他
    1. 开始
    2. 暂停
    3. 植物卡槽的同步

首先默认大家已经有ce的基础,基址,等...在这里就不细细说明了

植物种植

  1. 种植植物的call寻找
  2. hook
  3. 发送数据
寻找种植植物的call:
  1. 寻找植物的血量:(豌豆射手是300,先搜索300,植物受伤之后会减少,在搜索减少的数值,这里不做详细说明了)
  2. 寻找已经种植的植物数组(右键查看是什么访问了这个地址,会出现一个汇编姐买你,当第一个植物被吃掉之后,我们在这个位置上在接着中一个植物,会显示多几行代码)
  3. 种植植物的时候需要赋值,就可以通过CE知道是哪一行代码赋值
    image-20220212233155030
  4. 接着往上寻找call(这时候用ce和x64Dbg都可以,本人习惯x64Dbg,最终找到位置)
    image-20220212233155030

至此植物的call已经找到了,我用的是dll注入的方式,创建远程线程(或者cff 修改pe直接启动的时候就可以加载dll),在dll被加载的时候就可以修改代码,进行hook,代码写的不好,大神勿喷...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
__declspec(naked) void __stdcall PlantCall()
{
    //push eip
    __asm
    {
        PUSHAD
        pushfd
 
        push ebp
        mov ebp,esp
        SUB esp,0xc
 
        push eax
        pop DWORD PTR[ebp - 0x8]
 
        push DWORD PTR[ebp + 0xc+0x24]
        pop DWORD PTR [ebp - 0xc]
 
        push DWORD PTR [ebp + 0x10 + 0x24]
        pop DWORD PTR[ebp - 0X4]
 
        PUSH ESP
        call MySend
 
        ADD ESP,0XC
        POP EBP
 
        POPFD
        POPAD
 
        PUSH ECX
        PUSH EBX
        PUSH EBP
        MOV EBP,[ESP+0X10]
 
        JMP g_dwAddress
    }
}
 
int Modify40D120()
{
    //修改内存属性
    unsigned char szBuf[7] = { 0xe9,0x90 ,0x90 ,0x90 ,0x90 ,0x90,0x90 };
    DWORD dwePro = 0;
    if (!VirtualProtect((PVOID)0X40D120, 7, PAGE_EXECUTE_READWRITE, &dwePro))
    {
        DbgPrint("[Test] Modify40d120 Eoor %d\r\n", GetLastError());
        return -1;
    }
    //
    int nAddress = (int)PlantCall - 0x40D120-5;
 
    memcpy(szBuf+1, &nAddress, sizeof(int));
    memcpy((PVOID)0X40D120, szBuf, sizeof(szBuf));
 
    if (!VirtualProtect((PVOID)0X40D120, 7, dwePro, &dwePro))
    {
        DbgPrint("[Test] Modify40d120 Eoor %d\r\n", GetLastError());
        return -1;
    }
    return 0;
}
最后可以看到效果已经实现,突然发现还有意外收获

image-20220212233155030

僵尸

  1. 产生僵尸的call寻找
  2. hook
  3. 发送数据

僵尸的话,这里就不详细介绍了方法同上,大同小异。(请看下图)

网络等其他问题

  1. 网络这里直接选择tcp模式,很简单的写一下即可,我这里就不放代码了
  2. 网络完成之后,两边代码(植物、僵尸 call)调换一下即可实现网络对战了
  3. 其他的问题,阳关值,卡槽多了之后的值,暂停,开始等,这里不做展示了
  4. 现在可以看到可以实现网络对战了
写在最后:一开始钱老师说:你们现在做这个只需要一天就足够了。当时我还有点怀疑自己。慢慢的实现起来发现,的确如钱老师所说难度不大,大家有喜欢的可以尝试一下,为了学弟学妹着想,这里就不分享代码了。

image-20220212233155030


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 1103
活跃值: (1662)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
2
加油加油!!
2022-2-13 08:45
0
雪    币: 6258
活跃值: (3320)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
白嫖党白嫖失败
2022-2-13 10:11
0
雪    币: 620
活跃值: (929)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
4
加油!
2022-2-13 11:03
0
雪    币: 673
活跃值: (2058)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大佬报的哪?
2022-2-13 15:07
0
雪    币: 688
活跃值: (3620)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
6
2022-2-13 22:47
0
雪    币: 1002
活跃值: (1304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2022-2-14 05:20
0
雪    币: 2546
活跃值: (4408)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
cr40 干过5年c++那位吗
2022-2-14 12:44
0
雪    币: 500
活跃值: (915)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
wx_万一 cr40 干过5年c++那位吗
并不是……
2022-2-14 13:41
0
雪    币: 500
活跃值: (915)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
wx_墨_198 大佬报的哪?
我在科锐……
2022-2-14 13:46
0
雪    币: 392
活跃值: (1438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了
2022-2-28 16:37
0
雪    币: 6124
活跃值: (4646)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
很有意思
2022-3-1 19:15
0
游客
登录 | 注册 方可回帖
返回
//