用户
搜索
  • TA的每日心情
    开心
    昨天 16:14
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    i春秋作家

    Security Personnel

    Rank: 7Rank: 7Rank: 7

    156

    主题

    1382

    帖子

    1851

    魔法币
    收听
    0
    粉丝
    134
    注册时间
    2015-11-4

    幽默灌水王突出贡献春秋文阁春秋巡逻热心助人奖

    zusheng i春秋作家 Security Personnel 幽默灌水王 突出贡献 春秋文阁 春秋巡逻 热心助人奖 楼主
    发表于 2017-12-12 14:18:49 911467

    游戏安全系列教程-植物大战僵尸

    第一章 阳光数量基址篇

    0x01 前言

    本篇文章我们换个游戏,植物大战僵尸这个游戏还是有点复杂的,想全面分析了解透彻是需要下点功夫,我们这里就以全面分析植物大战僵尸为目标了。当然凡事从基础开始,我们首先来寻找一下植物大战僵尸阳光数量的基址。和上一篇文章有点不同,这个游戏增加了一些难度,怎么找阳光数量的地址我们上一篇文章其实已经讲解过方法。

    支持就是最大的动力,看到各位小伙伴们的回复,更加有动力啦,不管回复啥,希望不是我一个人在战斗,加油!

    本篇文章所需工具:

    1、CE (游戏内存修改器)

    Cheat Engine,简称CE,是由Eric Heijnen(网名“Dark Byte”)开发的一款开源软件,主要功能包括存储器扫描,十六进制编辑,指令反汇编,内存数据修改等功能,是一款强大的游戏修改器。Cheat Engine是最常见的游戏外挂工具,通过Cheat Engine,用户可以快速查找和修改游戏数据及更改游戏处理逻辑。

    下载地址:

    链接:https://pan.baidu.com/s/1pLebzsB 密码:c4el

    2、植物大战僵尸(游戏)

    下载地址:

    链接:https://pan.baidu.com/s/1dFPduy1 密码:xgz2

    Tip:本游戏有捆绑软件,安装时请去除安装捆版软件的勾选,启动游戏时有设定主页的选择,请无视它点击否。

    0x02 基础知识

    基址

    我们可以想象一棵苹果树,树有根,树上也有苹果,
    某个苹果对应某个偏移,而树根就是基址,通过基址往上找就能找到某个苹果。而找到的这个苹果,相对于有个偏移。通过基址+偏移就能确定是哪个苹果。

    为什么要找基址

    因为游戏退出基址不会变化,只有游戏更新后才会变化,而要是用找到的内存地址,例如:血的内存地址,游戏退出是会变化的,不方便我们编写辅助调用。

    指针

    在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

    多级指针

    当指针变量pp所指的变量Ip也是一种指针时,pp是一种指向指针的指针,称指针变量pp是一种多级指针。

    y1.png

    在如上图的A指向B、B指向C的指向关系中:

    首先C是"一段数据",比如你用malloc或者new分配了一块内存,然后塞进去"一段内容",那就是C了。C的起始地址是0x00000008。
    B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。

    B= 0x00000008;  //B的内容   
    *B = "一段内容";  //B解引用,也就是B指针指向的C的值  
    &B = 0x00000004;  //B取地址,B的地址是0x00000004  

    再来看A:A是二级指针变量,其中存放着B的地址0x00000004,A也有地址,是0x00000000;

    *A = B= 0x00000008;  //A解引用也就是B的内容   
    **A = *B = "一段内容";  //B解引用,也就是B指针指向的C的值  
    A = &B = 0x00000004;  //A存的是B的地址,B的地址是0x00000004  
    &A = 0x00000000;  //A取地址  

    这样多级指针的概念大家就清晰了,接下来就看实例吧。

    0x03 寻找植物大战僵尸阳光数量基址

    上一篇文章我们介绍了如何去寻找水果忍者游戏时间基址,由于这个时间基址是个一级指针,所以我们很快就找到了,不过多级指针那该如何去寻找呢,植物大战僵尸阳光数量基址正好是个多级指针,我们一起来学习一下吧。

    寻找植物大战僵尸阳光数量地址

    再找植物大战僵尸阳光数量基址之前我们肯定先要找到它的地址了,然后从地址入手去找基地址,怎么找它的地址?很简单,我们打开游戏和Cheat Engine。

    首先我们使用CE加载一下植物大战僵尸的进程:

    y2.png

    看一下阳光数量现在的值

    y3.png

    回到CE,我们使用精准数值的扫描方式,输入150进行首次扫描

    y4.png

    找到了214个结果,不用担心,我们回到游戏种个植物。

    y5.png

    可以发现阳光数量现在的值是50,我们继续回到CE输入50点击再次扫描,可以发现我们成功找到植物大战僵尸阳光数量地址,我们双击它,它就会被添加到下面的地址栏中。

    y6.png

    寻找植物大战僵尸阳光数量基址

    我们在下面地址栏中选中它然后右击->找出是什么访问了这个地址

    y7.png

    选择点击详细信息,可以看见CE已经帮我们计算出可能的指针地址:40889610,记住还有偏移量5578

    y8.png

    点击确定后然后点击停止,我们回到CE勾选Hex,输入40889610后点击首次扫描

    y9.png

    可以发现一下子找到30个结果,而且仔细翻找查看并没有绿色地址,到这里相信大家都慌了,下一步不知道从哪个地址下手好。大家如果继续从前两个地址下手,肯定会回到原处,地址距离不大,所以它可能数个数组之类的。这里建议大家从一个不同于其他地址的地址下手,就是它的位置和其他地址相差很大。这里我们从第三个地址下手,双击地址0465B4E0然后右击->找出是什么访问了这个地址。

    y10.png

    选择点击详细信息,可以看见CE已经帮我们计算出可能的指针地址:0465AC78,记住还有偏移量868

    y11.png

    点击确定后然后点击停止,我们回到CE勾选Hex,输入0465AC78后点击首次扫描

    y12.png

    可以发现我们一下找到了1663个结果,但是往下翻我们可以发现绿色地址,也就是我们的基地址,我们看下模块地址是多少。PlantsVsZombies.exe+3794F8

    y13.png

    接下来我们手动添加地址。直接用模块地址就行啦。还有别忘记有两个偏移量

    y14.png

    添加偏移

    y15.png

    点击确定,这里我们的基址就找到了。

    y16.png

    0x04 编程篇-锁定目标进程

    当我们分析完游戏逻辑,收集了足够的游戏数据之后就可以动手开发一款专属于自己的辅助工具。而开发辅助的第一步就是先找到游戏进程,锁定游戏进程之后接下来才能在考虑辅助功能的实现是选择改数据、改代码还是CALL函数。

    使用FindWindow查找目标进程

    操作系统提供了一个api GetWindowThreadProcessId,使用该api可以获得窗口所在线程与所在进程信息,所以如果目标进程有窗口那么就可以使用窗口的方式来查找目标进程。获得窗口句柄的方式一般用FindWindow函数。

    HWND FindWindow( 
      LPCTSTR lpClassName, 
      LPCTSTR lpWindowName 
    );

    lpClassName参数指向类名,lpWindowName指向窗口名,如果有指定的类名和窗口的名字则表示成功返回一个窗口的句柄。否则返回NULL。

    #include "stdafx.h"
    #include <stdlib.h>
    #include "afxwin.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        DWORD dwPID=0;
        LPCWSTR cs = L"Plants vs. Zombies 1.2.0.1073 RELEASE";
        HWND Pwnd;
        Pwnd = FindWindow(NULL,cs);
        if (Pwnd != NULL){
            printf("yes\n");
        }
        else{
            printf("no\n");
        }
        system("pause");
    }

    运行结果:

    y17.png

    GetWindowThreadProcessId是一种计算机函数,功能是找出某个窗口的创建者(线程或进程),返回创建者的标志符,函数原型是DWORD GetWindowThreadProcessId。

    DWORD GetWindowThreadProcessId(
      HWND hWnd, 
      LPDWORD lpdwProcessId 
    );

    hWnd(向函数提供的):被查找窗口的句柄,lpdwProcessId:进程号的存放地址(变量地址)。

    返回线程号,注意,lpdwProcessId 是存放进程号的变量。返回值是线程号,lpdwProcessId 是进程号存放处。

    #include "stdafx.h"
    #include <stdlib.h>
    #include "afxwin.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        DWORD dwPID=0,dwPIT;
        LPCWSTR cs = L"Plants vs. Zombies 1.2.0.1073 RELEASE";
        HWND Pwnd;
        Pwnd = FindWindow(NULL,cs);
        if (Pwnd != NULL){
            printf("yes\n");
            dwPIT = GetWindowThreadProcessId(Pwnd, &dwPID);
            printf("%d\n", dwPID);
        }
        else{
            printf("no\n");
        }
        system("pause");
    }

    运行结果:

    y18.png

    这样我们就锁定目标进程了。

    y19.png

    0x05 总结

    路漫漫其修远兮,吾将上下而求索。支持就是最大的动力,看到各位小伙伴们的回复,更加有动力啦,不管回复啥,希望不是我一个人在战斗,加油!

    评分

    参与人数 1魔法币 +30 收起 理由
    XiaoYue97 + 30 期待新的技术文章

    查看全部评分

    本帖被以下淘专辑推荐:

    Hacking the earth.My Blog:https://isbase.cc
    发表于 2017-12-12 22:31:49
    回复一个

    评分

    参与人数 1魔法币 +10 收起 理由
    zusheng + 10 感谢您的宝贵建议,我们会努力争取做得更好.

    查看全部评分

    逆向/破解/病毒分析板块  专属QQ交流群:496266893  群二维码

    https://bbs.ichunqiu.com/forum-60-1.html
    使用道具 举报 回复
    发表于 2017-12-13 08:20:49
    可以可以

    评分

    参与人数 1魔法币 +10 收起 理由
    zusheng + 10 感谢您的宝贵建议,我们会努力争取做得更好.

    查看全部评分

    破解的目的是为了更好的开发
    使用道具 举报 回复
    发表于 2017-12-13 10:34:17

    感谢感谢
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2017-12-13 12:54:32
    zhichiyixia
    使用道具 举报 回复
    发表于 2017-12-14 14:35:46
    如何防御?
    使用道具 举报 回复
    发表于 2017-12-15 09:04:43
    支持支持!!!
    使用道具 举报 回复
    发表于 2017-12-16 19:59:09

    对于单机游戏还没有如何防御,针对网游会有防御修复建议。
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2017-12-22 16:21:15
    好奇如果是安卓的如何改
    使用道具 举报 回复
    发表于 2017-12-28 15:44:36
    BpBb 发表于 2017-12-22 16:21
    好奇如果是安卓的如何改

    安卓差不多,比如八门神器。
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册