精华内容
下载资源
问答
  • 是一本手机游戏修改数据的入门文档,文档中介绍了一些基础的修改方法。
  • 修改对应的游戏版本为1.5。 存档保存位置 内部存储\Android\data\com.xmmf.yxmgmx.taptap\files 该文件夹中文件如下: data.wsf:数据文件。 wsfSave0:第一个存档。 wsfSave1:第二个存档。 修改金钱的例子 先进...

    警告

    修改前务必备份存档文件夹。该游戏有自动删除存档的功能,若未能正确修改,导致存档损坏,游戏会自动删除此存档。

    修改对应的游戏版本为1.5。

    存档保存位置

    内部存储\Android\data\com.xmmf.yxmgmx.taptap\files

    该文件夹中文件如下:

    • data.wsf:数据文件。
    • wsfSave0:第一个存档。
    • wsfSave1:第二个存档。

    修改金钱的例子

    1. 先进游戏确认当前金钱数量。当前金钱是2498,然后退出游戏。
    2. 根据金钱数量计算出存档中的内容。2498的十六进制是9C2,存档中的内容在存档中搜索该数值,但是安卓系统的默认数据写入方式会将字节顺序反过来,即9C2至少是两个字节,那就是09和C2,搜索的时候应该是C209。
    3. 确定存档中的保存金钱的位置:搜索到的位置是第35003字节和第35004字节,35003字节存放的是C2,35004字节存放的09。
    4. 修改金钱。我们将连续的三个字节35003、35004、35005中的内容都改为FF,即FFFFFF0F,十进制的金钱数量为268435455。猜测金钱至少是连个字节的short int数据类型,所以我们留个零,即只修改两个半的字节,防止最后半个字节涉及符号位。
    5. 最后,别忘了先保存和关闭正在修改的存档文件,然后再打开游戏。
    6. 进游戏把花钱就能干的事儿,统统干了!

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    修改人物属性

    1. 确认人物属性的数值。要修改马里诺,其数值:生命400、力量34、速度144、智慧132、体力25、运气55,然后退出游戏。
    2. 根据属性数值计算出存档中的内容。属性值的存储方式和金钱不同,是用UTF-8编码,所以无需像金钱那样把字节顺序反过来。角色姓名马里诺这三个字对应的UTF-8编码为E9A9ACE9878CE8AFBA;生命400对应的UTF-8编码十六进制为343030,力量34为3334,速度144为313434,智慧132为313332,体力25为3235,运气55为3535。
    3. 确定存档中的保存马里诺属性的位置。位置是会变化的,所以每次都要重新搜索。搜索马里诺三个字,即搜索E9A9ACE9878CE8AFBA,在此次使用的存档中的位置是第257399字节开始。
    4. 修改属性值。从第257399字节往后,我们可以找到属性对应的数值,但在每个数值的前面还有一个字节,该字节表示该数值的的位数,即生命400,我们可以找到03343030。修改的时候不要改变位数,而且最高998,比如生命400,是三位数,那我们就修改为998,体力25是二位数,我们就修改为99。若想把两位数改为三位数,就进游戏练级,数值变成三位数了再回来改。
    5. 最后,别忘了先保存和关闭正在修改的存档文件,然后再打开游戏。

    在这里插入图片描述
    在这里插入图片描述

    修改指定素材的数量

    1. 素材数量的修改比较复杂,每个素材都要自己找到位置,而且位置不是固定的,每次都要重新搜索。
    2. 大概位置在存储技能专精部分的后面。技能专精四个字的UTF-8编码为E68A80E883BDE4B893E7B2BE。
    3. 素材数量的表示和金钱相同,也要将字节顺序反过来,这点一定要注意,否则修改后的存档肯定事与愿违。
    4. 比如搜索铁矿石,就先进游戏几下铁矿石的数量86,然后退出游戏,在存档文件中搜索86的十六进制,即56,记录搜索到的在技能专精后面,并且靠近技能专精的位置。再次进游戏收集铁矿石为数量变为91,然后退出游戏,搜索91的十六进制,即5B,重复这个过程,可以得到一个唯一的位置,这就是铁矿石存放的位置了。每个素材占用四个字节,比如此时铁矿石的数量为91,它的数据就是5B000000,要修改成99999,就数据为9F860100。
    5. 最后,别忘了先保存和关闭正在修改的存档文件,然后再打开游戏。

    在这里插入图片描述

    获取所有采集的素材

    1. 按照“修改指定素材的数量”的操作,找到铁矿石的第一个字节,位置是第2263字节。位置不是固定的,每次都要重新查找。
    2. 素材是按照数字的方式存放的,每个素材占用4个字节,该游戏目前是56种采集的素材,也就是占用224个字节。若修改超过224个字节,游戏中会现名为New Text的素材,且其他类型的素材将会不显示,所以要字节数要数准确了。
    3. 只要把第2263至第2486字节全部填充“7”,即每个素材的数量都是2004318071。也可以填充其他的数量,但要注意,四个字节的第一个比特必须是0,按照字节顺序相反的规律,最多可以填写的数量时“1111 1111 1111 1111 1111 1111 1111 1110”,这也是为什么我填写7而不是8。
    4. 最后,别忘了先保存和关闭正在修改的存档文件,然后再打开游戏。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    获取所有熔炉成果的素材

    1. 方法和“获取所有采集的素材”类似,只不过需要找的第一个素材是铁锭,第一个字节位置是3067。位置不是固定的,每次都要重新查找。
    2. 熔炉成果的素材共有12个,修改12*4=48个字节即可。
    3. 最后,别忘了先保存和关闭正在修改的存档文件,然后再打开游戏。

    在这里插入图片描述
    在这里插入图片描述

    其他的修改

    其他内容的修改,方法都一样,比如武器的攻击力,就是直接按文字编码搜索武器的攻击力。修改中只要注意两点就没问题:

    1. 数字的字节顺序要反过来。
    2. 文字要按照UTF-8编码模式,即汉子每个字3字节,数字每个字1字节。
    3. 文字可能会指定位数,即当存档用文字方式储存数字时,修改数值的范围不能变动位数,且不能为0,不能填“999”这个数,但可以9999或99。比如原来是三位数,那修改范围就是100-998,原来两位数,那修改范围就是10-99,原来一位数,那修改范围就是1-9。
    展开全文
  • 一起来捉妖定位修改苹果所有系统修改定位两种方法: 第一种,使用电脑软件数据线连接手机修改定位。 优点是:修改完毕可以拔掉数据线,位置一直固定不变。可维持1-15天。
  • 关于烧饼游戏修改器的分析

    千次阅读 2017-01-09 16:46:34
    主要实现搜索手机进程的内存数据并做相应修改。  本文中分析的版本为2.0.2(34),SDK:8,TargetSDK:17,代码经过混淆,修改器基本使用方法为输入需要修改数据进行查询,查询结果少则可直接修改,查询结果多则...

    一、前言

      烧饼游戏修改器是一款元老级的游戏修改器,提供了精确搜索、模糊搜索、联合搜索、数据过滤、存储搜索与读取搜索等功能。主要实现搜索手机进程的内存数据并做相应修改。

      本文中分析的版本为2.0.2(34),SDK:8,TargetSDK:17,代码经过混淆,修改器基本使用方法为输入需要修改的数据进行查询,查询结果少则可直接修改,查询结果多则需要返回游戏,使想修改的数据发生变化后再次搜索,最后根据数据变化偏移找到需要修改的地址。输入想要修改成的数据即可修改。

      本程序测试机为LG Nexus 5,版本为Android 4.4,运行程序前需先root手机。

      系统环境:Java 1.8.0_92 ,Android Debug Bridge version 1.0.36

      使用工具:AndroidKiller、JEB、Eclipse、IDA

    二、详细分析

    2.1 关于smali注入代码的说明

      为了便于分析,本文中涉及向工程中注入smali代码并重新打包运行,对常用的注入代码做如下说明。其中使用到的寄存器vn要根据实际代码使用的寄存器个数来做相应修改。如图2-1中的run()中“.locals 5”申明使用了5个寄存器,即v0~v4,如果我们需要插入一条日志信息,为了不影响原来代码的执行,需要自己增加一个寄存器v5,先将“.locals 5”变成“.locals 6”,再用v5来保存日志信息。

     

    图2-1 Smali代码中对寄存器的说明

    2.1.1 log信息输出


     

    const-string vn, "提示语"

    invoke-static {vn}, Lcom/android/killer/Log;->LogStr(Ljava/lang/String;)V


     

    图2-2 Log信息输出

    2.1.2 打印字符型数据


     

    const-string vn, "string数据"

    invoke-static {vn, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I


    图2-3 打印字符数据

    2.1.3 打印整型数据


     

    const-string vn, "int数据"

    invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;

    move-result-object v(n+1)

    invoke-static {vn, v(n+1)},Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I


    图2-4 打印整型数据

    2.1.4 打印boolean型数据


     

    const-string vx, "boolean数据"

    invoke-static {p1}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;

    move-result-object v(x+1)

    invoke-static {vx, v(x+1)}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I


    图2-5 打印boolean型数据

    2.1.5 栈追踪


    new-instance vn, Ljava/lang/Exception;

    const-string v(n+1),"这里是 trace"

    invoke-direct{vn,v(n+1)},Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    invoke-virtual{v(n+1)},Ljava/lang/Exception;->printStackTrace()V

     


    图2-6 栈追踪

    2.1.6 toast输出


    const-string v0, "这里是Toast输出"

    const/4 v1, 0x1

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V


    图2-7 Toast输出

    2.1.7 加载so库


    const-string v0, "这里是Toast输出"

    const/4 v1, 0x1

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V


    图2-8 加载so库

    2.2 Java层代码分析

    2.2.1 加载的so文件

      用AndroidKiller打开该apk,得到反编译之后的工程,如图2-9。

     

    图2-9 反编译之后的apk工程目录

     

      查看AndroidMainfest.xml,如图2-10,可以看到应用程序包名为“org.sbtools.gamehack”,程序主活动为“MainActivity”,还可以看到服务名为“org.sbtools.gamehack.sesrvice.FlowServ”。

     

    图2-10 AndroidMainfest.xml

     

      找到MainActivity.smali,其中onCreate方法如图2-11,在做一些布局工作后调用了a(),a()方法如图2-12,其主要工作为启用Instrumentation,通过Instrumentation框架,可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态等。从AndroidMainfest.xml中可以知道Instrumentation对应的方法为org.sbtools.gamehack.GameInstrumention。在Instrumentation中启用了服务,如图2-13。

    图2-11 MainActivity.onCreate()

     

    图2-12 MainActivity.a()

     图2-13 启动服务
     

      在FlowServ中,发现该方法加载了Libencode.so,而在该方法中我们可以找到decode被声明为native(图2-14),想必能用到这个decode的地方一定是关键之处,于是在工程里搜索decode,发现在/d/i.smali中用到了decode,而decode上面出现了两个可疑文件(图2-15)。在工程中注入代码打印出string v1,打开eclipse, 在DDMS中打印出如图2-16的信息,可知将路径“/data/data/org.sbtools.gamehack/files/hack”和“/data/data/

    org.sbtools.gamehack/files/gamehack”作为参数传给了decode(),随后在该类的a方法中运行了hack文件(图2-17),运行之后将该文件删除(图2-15)。

    图2-14 Native程序加载

     

    图2-15 调用decode的地方

     

    图2-16 获取的path

     

    图2-17 给hack文件赋予root权限

      这里的gamehack文件笔者未找到,IDA调试程序安装时显示Libdecode.so加载失败,因此按逻辑图2-7中的decode()执行失败,后面的hack文件不能执行,但以附加方式调试代码时候hack文件确实已经执行了,观察smali代码反应JEB翻译的java逻辑没有问题,猜测程序采用了一些反调试的手段,具体原因还待考究。

    2.2.2 Socket消息传送

      打开该程序,搜索界面和搜索结果界面如图2-18、图2-19,我们有多种方法来了解执行搜索时候java层的执行逻辑,比如在AndroidKiller中搜索字符串“搜索”,找到其ID,逐层分析其流程,或从搜索结果入手,搜索找到“共搜索到%ld个数值,请选择修改”出现的地方,然后利用再smali代码中添加栈回溯语句来查看栈调用顺序。

    图2-18 搜索界面

     

    图2-19 搜索结果页面

     

      最后我们在ah类中找到程序对搜索消息的的设置(图2-20),最后发送的数据为“s [要搜索的数据] 标志位 0”,其中s表示正在进行搜索操作,当输入的搜索数据合法时,标志位为1。我们在这个方法中注入代码打印出发送的消息,发送的消息如图2-21所示。

     

    图2-20 设置搜索消息

     

    图2-21 发送的消息

     

      那么现在问题来了,这些消息发送给了谁?又是谁来接收这些搜索指令呢?分析到这里,之前提到的hack文件的功能就可想而知了。

    2.3 Hack文件分析

    2.3.1 获取hack文件

      那么这个hack文件具体做了些什么呢?为了进一步分析我们需要先提取该hack文件。打开adb shell,进入该文件所在目录,但是ls命令并未查看到,文件显然已经被删掉了。(图2-22)

     

    图2-22 adb shell未查找到文件

     

      此时我们有两种方法来找到该hack文件:

      方法一:找到删除文件的smali代码,注释掉删除文件的代码,重新打包运行。之后用adb pull /data/data/org.sbtools.gamehack/files/hack D://命令将文件拷贝到本地计算机。注释掉的代码如图2-23、图2-24所示。

     

    图2-23 注释掉的代码1

     

    图2-24 注释掉的代码2

     

      方法二:linux系统中每一个进程都有一个/proc/[pid]目录,该目录下保存着有关该进程的各类信息,其中有个文件名为exe,这个文件是一个链接指向该进程的实际可执行文件。用命令ps |grep gamehack找到该进程ID为18912(图2-25),执行cd /proc/18912 进入到该进程信息目录,用ls –al会看到我们要找的文件。linux系统删除文件是使用了unlink这个函数,这个函数只会减少某个文件的硬连接数,当某个文件被打开后,并调用unlink删除该文件时,使用ls命令是不能查看到该文件了的,但这个文件实际上还是存在在磁盘上的,当使用该文件的进程结束时或者调用close关闭该文件描述符时,这个文件才真正的从磁盘上消失。因此,只要程序还在运行,该hack文件就不会被真正删除,将该文件拷贝到sdcard,再pull到计算机上(图2-26)。

     

    图2-25 查看进程ID

     

    图2-26 进入进程目录并提取文件

     

      接下来就可以对该文件进行分析了。

    2.3.2 hack文件分析

      IDA加载提取出来的hack文件,查看导出表,只有一个start(),双击进入start(),F5之后如图2-27所示。

     

    图2-27 start()启动函数

     

      在我重命名为“_HackWhat”的函数中,实现了该程序中最核心的功能。首先建立起socket连接,接收来自远端的数据,并根据第一个数据来决定后续要执行的操作(图2-28)。前面我们已经得出,当执行数据搜索的时候用字母“s”来表示,直接分析case s的代码(图2-29),可以发现在_DataMemory()中对接收到的数据做了一些处理,提取出需要搜索的数值,接着在_SearchData中读取进程内存信息进行搜索。

     

    图2-28 接收socket数据

     

    图2-29 搜索数据

     

      静态分析搜索部分的代码,可以看到程序首先用ptrace来attatch进程(图2-30),接着打开了进程内存映射信息所在的文件“/proc/[PID]/maps”并读取相关信息进行保存(图2-30)。

     

    图2-30 Ptrace进程

     

    图2-31 读取内存映射信息

     

      接下来程序读取进程内存信息“/proc/[PID]/mem”并保存。此处用于监测程序的内存映射信息是否发生变化。当在执行搜索操作时,程序实际上执行的为图所示的_SearchData函数,该函数在IDA中的偏移地址为0000A900。

     

    图2-32 读取进程内存

     

    图2-33 执行搜索

     

      在该函数中,同样先ptrace进程,读取内存信息并和之前保存的做一个比较,校验内存是否发生变化,接着从内存信息中搜索我们要修改的数据(图2-35、图2-36),而此处的具体逻辑还待深究,此处未作进一步描述。

     

    图2-34 读取内存信息

     

    图2-35 搜索数据a

     

    图2-36 搜索数据b

     

      搜索完数据之后,执行图2-29中的_SendFindResult将搜索结果发送到远端,交给java层代码做接下来的处理。

      如果搜索结果太多,需要我们返回游戏,手动使想要修改的数据发生变化,然后重新搜索(图2-37)。此时发送的消息为“f = [Data]” (图2-38)。Hack程序收到socket信息后会提取变化之后的数字,再次执行图2-33中的_SearchData函数,不过此时会读取刚才搜索数字8之后的内存,检测哪一个内存保存的数值变为了12,据此来锁定想要修改的数据所在的内存。接着执行修改操作。

     

    图2-37 变化数据

     

    图2-38 第二次搜索时向socket发送的数据

     

      当点击修改之后,hack进程识别标志修改的字母“m”并执行如图2-39所示的操作流程。在对收到搜索命令做一系列提取等操作之后,ptrace注入进程并对相应内存地址的数据进行修改(图2-40),最后将修改结果发送给java层进行处理。

     

    图2-39 修改数据a

    图2-40 修改数据b

     

    2.3.3 用IDA进行动态分析

      以上分析结合了静态分析和动态分析,用IDA对进程进行动态分析的步骤如下:

      1)    把IDA\dbgsrv目录下的android_server push到android中,命令:

        adb push  android_server /data/data/sv

      2)    adb shell进入该目录,为android_server赋755权限并以管理员权限运行。

    cd /data/data/sv

    chmod 755 android_server

    su

    ./android_server

        成功运行之后可以看到监听端口为23946。.

      3)    在windows控制台下转发window到模拟器或手机端口。

        adb forward tcp:23946 tcp:23946

      4)    在IDA中选择android调试,在Debuggger 中的process options 的hostname 填上localhost。

      5)    在Debugger中的attach上选择对应的android程序即可。

      这里由于hack文件运行之后被删除了  因此需要注释掉删除文件的代码,重新编译运行之后才能attach上该进程。附加上该进程之后在IDA右侧的Modules窗格可以看到该文件基址为00008000,从刚才IDA加载的我们导出的hack文件中可以看到start偏移地址为00009010。两个地址相加即为该代码在elf文件中的实际地址,即00011010,我们在IDA中找到这个地址并下断。接着运行程序点击搜索,可以发现程序执行了如图所示的流程,在寄存器窗格中可以查看到存放接收数据的地址,Hex窗格中可以看到该地址下存放的数据。(图2-41)

     

    图2-41 IDA动态加载hack程序——数据处理

     

      调试到图2-42所示的过程中发现程序在读取内存信息。

     

    图2-42 读取内存

      搜索完数据之后对搜索结果进行处理,将处理之后的数据发送给远端(图2-43)。发送的信息如图2-44,其格式为“[内存地址]=[查找的数据]=[数据类型]”。

     

    图2-43 处理搜索结果

     

    图2-44 发送的数据

    三、总结

      本文中分析的烧饼游戏修改器是一款经典的游戏修改器,之后时常出现的很多修改器和外挂都在其基础上衍生,对该游戏修改器进行分析能帮助学者素数掌握修改器和外挂的思路。通过这段时间的学习,收获如下:

      1)    掌握了逆向分析的大致流程和相关工具的使用;

      2)    对java语言有进一步了解;

      3)    熟悉了android框架及一些基础控件的使用;

      4)    熟悉了smali代码语法,能读懂smali代码,通过注入samli代码来调试程序;

      5)    掌握了IDA动态调试进程的方法;

      6)    对Native程序有了初步的认识。

      该apk是笔者分析的第一个android程序,由于没有相关分析经验,以及对工具和相关编程语言不熟悉,导致前期花费了大量时间在android编程学习和java层代码的分析上,没有抓住程序的关键点。针对本文中的游戏修改器的分析,尚有许多待完善之处:

      1)    程序读取完内存之后执行搜索操作的时候用的什么方法或函数来搜索尚不确定;

      2)    本文只对综合搜索进行了分析,对于修改器中提供的其他功能,如模糊搜索、深度搜索、联合搜索、反加密等还未做进一步分析。

      3)    对JNI还需深入学习。

      初次分析,难免有错误、不当和疏漏的地方,如有发现,还请指正,谢谢!


    展开全文
  • 相信大家都用过游戏外挂,我也不例外,学生时期嘛总是贪玩的,以前玩一些单机的游戏总是用一些修改器,我小的时候就总是在手机上用什么葫芦侠,电脑上就是AE 近些日子,本学渣在看《windows程序设计》一书,里面就讲...

    相信大家都用过游戏fuzhu,我也不例外,学生时期嘛总是贪玩的,以前玩一些单机的游戏总是用一些修改,我小的时候就总是在手机上用什么hulux,电脑上就是CE
    近些日子,本学渣在看windows设计相关的书,里面就讲到了内存修改器,很感兴趣,所以参考了书之后,今天本学渣来给大家分享一下
    那么我今天给大家的就是一个简易的修改qi,用的都是一些windows中的一些API函数,

    那么首先我们来了解下我们要修改的游戏数值,到底是在修改什么?
    修改游戏中显示的数据就是要修改游戏所在进程的内存
    进程的地址空间是相互隔离的所以我们要用到API函数

    接下来给大家介绍几个函数
    1.ReadProcessMemory
    函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有访问权限。
    函数原型:BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesRead);
    參数:
    hProcess:进程句柄
    lpBaseAddress:读出数据的地址
    lpBuffer:存放读取数据的地址
    nSize:读出的数据大小
    lpNumberOfBytesRead:数据的实际大小

    可能有点多,要好好的看一看我刚开始看书的时候也很懵哈哈哈哈
    仔细看完之后相信你没问题的!

    2.WriteProcessMemory
    BOOL WriteProcessMemory(
      HANDLE hProcess, 进程句柄
      LPVOID lpBaseAddress,要写的内存首地址
      LPVOID lpBuffer,数据当前存放地址
      DWORD nSize,写入数据的大小
      LPDWORD lpNumberOfBytesWritten实际数据的大小
      );

    接下来如果我们自己有CE 的话就可以找出地址,利用ReadProcessMemory函数和WriteProcessMemory函数来修改内存空间了
    但是!我们不用!接下来才是我们的主要代码,如果你对进程,和线程以前有过了解(没准儿比我好哈哈哈)那么就更容易理解下面写的东西,如过没了解过呢,也没关系!谁还不是从头开始呢!

    那么我们究竟要怎么样找到游戏数据所在的内存呢?
    像我们的游戏数据都是会有一些什么生命值啦,分数了之类的,我们在游戏的过程中这些值会进行改变,所以对应内存空间的值也会改变,那么为什么这个查找的过程比较复杂呢,比如我们分数是100分,在内存中,就可能有很多存放着100的数值的内存地址,所以我们要不断的更改分数的值来筛选真正的是我们要的那个内存地址

    在这里给大家放几张图来看一下
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201217122319938

    自己原来写的飞机大战小游戏 有很多能改动的地方,大家可以去看看 传送门
    大家可以看到这里是17得分,那么我们就来搜索
    在这里插入图片描述
    可以看到这里有非常多的地址,所以我们改变得分来筛选,这个查找的过程是有点慢的 需要等一会
    在这里插入图片描述
    这就是我们修改之后的得分了,如果你的电脑上有360的话它会阻止你操作的,不用担心,允许就好了。

    运行图看完了咱们就要写代码了

    #include<stdio.h>
    #include<windows.h>
    

    这是我们的头文件千万不要忘记!

    DWORD g_arlist[1024];//地址列表  如果不清楚DWORD等,可以去查一下你就明白了
    int address;//有效地址的个数
    HANDLE g_hprocess;//目标进程句柄
    

    这里大体都和书上的一样,,我开始也不习惯这么命名,但总要有个规范不是。咱们继续
    咱们是在一页上查找,如果不清楚页,大家可以去搜一下windows的分页机制,看一下一页是多大(4KB)。

    bool compareAPage(DWORD dwBaseaddr, DWORD dwValue)
    {
    	//读取一页内存
    	BYTE arBytes[4096]; 这里如果不清楚4096 提示一下(1024和它的关系)
    	if (!::ReadProcessMemory((g_hprocess), (LPVOID)dwBaseaddr, arBytes, 4096, NULL))
    		return FALSE;//此页不可读
    	DWORD* pdw;
    	for (int i = 0; i < (int)4 * 1024 - 3; i++)-3这里要思考一下 (注意它的类型))
    	{
    		pdw = (DWORD*)&arBytes[i];   (这步如果不懂的话,先把指针方面弄好)
    		if (pdw[0] == dwValue)//等于要查找的值
    		{
    			if (address >= 1024)
    				return FALSE;
    			g_arlist[address++] = dwBaseaddr + i;
    		}
    	}
    	return TRUE;
    }
    
    
    

    在页中查找就完成了,接下来我们就来写搜索函数了(Find)

    bool FindFirst(DWORD dwValue)
    {
    	const DWORD oneGB = 1024 * 1024 * 1024;
    	const DWORD onepage = 4 * 1024;
    
    
    	if (g_hprocess == NULL) (这里还是要提一下吧,进程句柄开始有写)
    		return  FALSE;
    	//查看系统 以决定开始地址
    	DWORD dwbase;
    	OSVERSIONINFO vi = { sizeof(vi) };
    	::GetVersionEx(&vi);
    	if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    		dwbase = 4 * 1024 * 1024;
    	else
    		dwbase = 640 * 1024;
    	//从开始的地址到2gb地址空间进行查找   为什么是2gb?
    	for (; dwbase < 2 * oneGB; dwbase += onepage)
    	{
    		
    		compareAPage(dwbase, dwValue);
    
    
    	}
    	return TRUE;
    }
    

    DWORD dwbase; 查看系统的函数,
    OSVERSIONINFO vi = { sizeof(vi) };
    ::GetVersionEx(&vi); 这个函数在vs上编译可能会警告,但是能运行,应该是太老了,弃用了
    if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    dwbase = 4 * 1024 * 1024;
    else
    dwbase = 640 * 1024;

    这只是我们的第一个查找函数,要明白我们这个查找函数是来干嘛的,我们这个第一个find只是用来查找有效地址!关于有效地址我在开始已经声明了,所以我们接下来就要在有效的地址中去查找,然后来进行修改

    bool FindNext(DWORD dwValue)
    {
    	//将那些有效地址保存
    	int newaddress = address;
    	address = 0;
    	bool P = FALSE;//假设失败
    	DWORD dwreadValue;
    	for (int i = 0; i < newaddress; i++)
    	{
    		if (::ReadProcessMemory(g_hprocess, (LPVOID)g_arlist[i], &dwreadValue, sizeof(DWORD), NULL))
    		{
    			if (dwreadValue == dwValue)
    			{
    				g_arlist[address++] = g_arlist[i];
    				bRet = TRUE;
    			}
    		}
    	}
    	return P;
    
    }
    

    如果你看懂了前面,逻辑其实很简单,就是函数里的变量比较多,多看就好理解了。

    void showlist() 显示函数
    {
    	for (int i = 0; i < address; i++)
    	{
    		printf("%08IX\n", g_arlist[i]);
    	}
    }
    

    关于此函数就是输出格式需要自己注意一下;
    最后就是我们的主函数了

    char FileName[] = “G:\编程\飞机huhuhu\Debug\飞机huhuhu.exe”; 这里你要改你自己游戏的绝对路径
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    ::CreateProcess(NULL,FileName, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    //关闭线程句柄
    ::CloseHandle(pi.hThread);
    g_hprocess = pi.hProcess;

    STARTUPINFO si = { sizeof(si) };  //这是一个结构体类型,很复杂,
    //我看的时候只是会用书上的,查了一下定义感觉很多,
    //具体想了解可以自己去查一下,
    PROCESS_INFORMATION pi;//也是一个结构体类型,调用Createprocess()函数后,会自动地对该结构进行填充。也可以自己去查一下
    

    剩下的就没什么了。

    char FileName[] = "G:\\编程\\飞机huhuhu\\Debug\\飞机huhuhu.exe";
    	STARTUPINFO si = { sizeof(si) };
    	PROCESS_INFORMATION pi;
    	::CreateProcess(NULL,FileName, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    	::CloseHandle(pi.hThread);//关闭线程句柄
    	g_hprocess = pi.hProcess;
    	//输入要修改的值
    	int v;
    	printf("Input v=");
    	scanf_s("%d", &v);
    	FindFirst(v);
    	showlist();
    	while (address > 1)
    	{
    		printf("input=");
    		scanf_s("%d", &v);
    		//进行下次搜索
    		FindNext(v);
    		showlist();
    		if (address ==1) {
    			printf("new=");
    			scanf_s("%d", &v);
    			::WriteProcessMemory(g_hprocess, (LPVOID)g_arlist[0], (LPCVOID)&v, sizeof(int), NULL);
    			break;
    		}
    	}
    	::CloseHandle(g_hprocess);
    	return 0;
    }
    

    当时看书觉得很有意思,所以就和大家分享一下。毕竟我也在学,可能有的地方说的不好,讲的不细致,请大神们见谅!

    学渣一枚,迷茫过,堕落过,所以还请大家加油啊!
    我们要去更远的未来呢!
    加油!少年!
    最后附上源码 https://pan.baidu.com/s/1U9ZRYdedvpVJFGw1NOE_hw
    提取码 xlad
    也可以关注我后续的文章哦!

    展开全文
  •  但凡现在有点人气的游戏都可能被hack,而且网上有很多方便的工具可以使用,单就手机端还讲,最常见的内存修改器有八门神器、烧饼修改器。最近针对这两种内存修改器做了些防护处理,简单记录一下。当然道高一尺,...

      但凡现在有点人气的游戏都可能被hack,而且网上有很多方便的工具可以使用,单就手机端还讲,最常见的内存修改器有八门神器、烧饼修改器。最近针对这两种内存修改器做了些防护处理,简单记录一下。当然道高一尺,魔高一丈,这里的处理也只是一定程度上的防作弊,最好的办法还是要做服务端校验。

      1. 对内存数据进行加密处理

      即在存储的时候事实上存储的是加密数据,而在读取时再做解密处理。这样的话,修改器便无法定位数据,也就无法修改或锁定该内存数据。但是,这可能会带来游戏性能的下降,加解密过程毕竟还是有效率问题的。所以要根据自己需要选择合适的加密算法。这种方式最简单,易实现。

      

      2. 对内存数据做签名校验

      即存储的依旧是明文,但同时会存储该数据对应的签名信息,在合适的时候使用该签名做校验。使用这种方法,便要求一旦数据有修改就要更新其对应签名信息,否则在进行校验时将不能成功,容易造成误杀;并且为了存储其签名信息还需要占据额外的内存空间。但某些情况下,因为第一种方式不方便使用的时候,便可以考虑使用这种方式。

     

      归根到底这两方式对应就是密码学中的加密和签名的概念~

    posted on 2015-03-15 21:04 青草_草帽 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/cqgreen/p/4338651.html

    展开全文
  • 问题描述:安卓中低端机,或处理器为联发科MTK的部分手机,在运行应用和大型游戏的时候很流畅;但在系统界面,包括桌面启动器,状态栏,设置等进行操作的时候,卡顿不跟手一直是个恼人的问题。原因分析:网友的分析...
  • Java J2me泡泡堂游戏源码,运行于以前的Java手机中的泡泡堂游戏,经过了多次的版本修正更新,功能逐渐完善,这是最后一次修正的泡泡堂游戏源码,更新记录如下:  增加了一些注释  修正了角色死亡后仍然可以放置...
  • 头条视频 消重 滤镜 视频md5修改手机版 直播打赏:很多男性角色依靠直播及带领粉丝玩游戏获取收益。,如今,短视频内容已成为继纯文字内容、图文内容之后的第三次大众表达革命,没事拍个短视频已是许多网友日常...
  • 大多数人都是通过第三方软件,在游戏内把监测数据显示到电脑显示屏角落。可就算是在角落,这些数据依旧会阻挡游戏画面,在截屏时被截到图里。更别提很多类似软件都会偶尔出现热键失灵,没法关闭或开启数据显示的情况...
  • 一款手游,用WPE制作过滤器后发送,但只是自己手机游戏界面进行了更改,其他玩家的手机界面却没有更改过来,这是怎么回事,补充说明,更改的后结果虽然在自己手机界面上显示是自己更改的结果,但是无效,仍是...
  • 七、APP动态评分,下载量统计,并支持后台修改相关数据 八、列表支持多种模式排序,AJAX体验更好! 九、支持本页阅读全文,自动获取内容相关的APP应用 十、深度整合多说评论,支持双向备份,防SQL注入,安全可靠...
  • 有福了,路途吧给大伙分享个好源码:HTML5响应式手机游戏类企业通用织梦模板,效果相当的炫酷,相当简洁大气高端,模板简单,全部已数据调用,只需后台修改栏目名称即可。   模板特点: 容易操作,页面结构简洁大方...
  • 有些可以玩,主要原因在于framework对于数据的处理只有一套标准,而手机和平板在这方面是有区别的,一般游戏都是针对手机开发,在平板上就会出现问题(左右摆动不起作用,前后起作用),下面我们主要看看如何修改这...
  • 游戏开发手册类网站织梦模板(带手机端)+PC+移动端+利于SEO优化 模板介绍: 织梦最新内核开发的模板,该模板属于企业通用类、游戏开发、游戏手册类企业都可使用, 这款模板使用范围极广,不仅仅局限于一类型的企业,...
  • 网上的方法什么伪装成手机,什么修改机型串号,什么清除数据,要么两天就被腾讯和谐了需要重新弄超麻烦,要么就是要收费(不知道贴吧这些收费过模拟器检测有没有效,没有试过,效果就不评价了)。安卓模拟器被检测...
  • 游戏圈儿的那些事专注资讯赛事、技巧和装机天天在用钱首先要知道,cf封机器码封的是具体哪个硬件。网络适配器,也就是网卡。网卡呢,其中有一个 物理mac地址,这个地址呢是无法更改的,每一块的网卡都相对应的有一组...
  • 游戏手游程序开发网站类织梦模板(带手机端)+PC+移动端+利于SEO优化 模板介绍: 织梦最新内核开发的模板,该模板属于企业通用类、游戏、手游开发程序类企业都可使用, 这款模板使用范围极广,不仅仅局限于一类型的...
  • 响应式游戏开发展示类网站织梦模板(自适应手机端)+利于SEO优化 模板介绍:   织梦最新内核开发的模板,该模板属于企业通用、HTML5响应式、游戏开发展示类企业使用,一款适用性很强的模板,基本可以适合各行业的企业...
  • 两种修改png图片颜色方法的对比在手机游戏开发中,为了节省资源,我们常常修改png图片以实现一张图片多种显示效果。有两种办法可以实现这个功能: 第一种是装载png图片,使用getRGB()取得取得图片的RGB颜色数据,...
  • 因为原神游戏貌似是客户端和资源的组合,只要把资源考到对应客户端的文件夹下就可以了,我同学说这玩意的资源貌似可以直接用Unity打开,嘿嘿嘿。 准备 ES文件浏览器 原神B服版下载好了资源 原神官服版 首先进入原...
  • 实现方法手机安装第三方软件乐心健康,注册账号登录,将运动数据同步到微信和支付宝。用python脚本远程修改乐心健康当前登录账号的步数即可。第一步:在手机上安装乐心健康app。 安卓版下载地址:...
  • 两种修改png图片颜色方法的对比

    万次阅读 2006-07-04 13:18:00
    两种修改png图片颜色方法的对比在手机游戏开发中,为了节省资源,我们常常修改png图片以实现一张图片多种显示效果。有两种办法可以实现这个功能: 第一种是装载png图片,使用getRGB()取得取得图片的RGB颜色数据,...
  • android本地数据加密

    2014-10-21 22:23:28
    大多数玩家是不会去故意查找这些数据修改的,但是游戏好玩了话,喜欢破解数据并发到网上的还是大有人在的。为此,我们需要对本地额数据进行加密处理。 这篇文章主要介绍怎么对本地数据进行加密,可以做到本地数据...
  • 手机无法使用此软件)使用均能实现无广告尾巴、极速模式、成语接龙游戏、自动修改名片、自动登录微信号、查询微信价格、查询没品笑话、自动重启机器人、稳定专用的网络词库(避免用网络词库时出现脏话、广告和空白的...
  • 本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!==本文为word格式,下载后可方便编辑和修改!...2、201X年移动游戏用户规模:201X年年底,手机游戏用户规模超...
  • 以前玩过pc单机游戏的同学,相信对金山游侠这款作弊修改器一定不陌生,玩家通过修改器可以轻松地定位、修改游戏里的关键变量,如boss血量,金钱,主角战力等数据,轻松制霸游戏。作弊修改器的原理非常简单,就是通过...
  • 用了以后,再也不怕程序偷偷跑流量了,有广告的游戏、软件禁止联网就没有广告了,还你一个清爽的手机。 这个是最新修改版的,亲自测试安卓4.0、安卓4.1、安卓4.2的手机还有平板都可以有效使用。原来的版本有关机重启...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

修改手机游戏数据