aq8725 发表于 2014-5-9 13:03

直接法修改安卓游戏

【对于SO文件的修改,个人所知现阶段实施相当困难:需要用IDA对so文件进行反编汇、修改、继而调试。困难之处在于两点:1.若是搭建在windows操作系统下的IDA,需要设置调试选项,似乎还需要外接一个SDK的运行环境,相关资料很少;linux下的IDA似乎不需要,但是依然要用虚拟机搭建linux系统,linux系统很恶心。2.最恶心的不是第一点,而是修改过程中要直接面对汇编语言。汇编语言比咱们在halo中接触的那些getfield啊,clinit啊;而且像so文件这种混淆比较厉害的文件,它的很多方法都是类似sub_123456;可读的地方就是一些调用外部文件的声音啊,显示啊;但是追踪上去一般效果也不可观】

【动态修改实例在2楼,动态修改现行方法和本帖一样,但是对opcodes的分析很困难,不写教程。】

Android游戏修改现行技术很不成熟,本直接法修改流程非常繁琐。据本人浅薄了解,现在唯一能成功修改安卓APK的方法就是直接对APK反编译后的smali文件直接修改,但是smali所用的Dalvik opcodes更难以理解和修改,方便的smali修改工具还未出世,所以现行Android修改力量微薄;另外,咱们改java游戏的也知道:有些游戏的加密程度非常之高,同样例如安卓版的《植物大战僵尸》,阳光值25在整个游戏的class里完全搜不到,这个25被加密到外部文件里了(叫做.so文件),就算你能用ultroedit进行修改,最多也只是静态流,没有数据、关键字等提示,找到线索相当于大海捞针;前段时间我说过我手里还有的一种新方法最终证实也是不可能的:就是先将APK里的主文件classes.dex转化为jar,用halo修改,然后再回编成classes.dex,塞回到APK里,这个过程有很大的信息损耗,换句话说,.smali和.class是一个等级,而.java会丢失很多信息的;.java往.class编译不行,.class往.smali编译也不行。(打个比方:.smali:鲜鸡蛋,.class:打好的鸡蛋,.java:炒好的鸡蛋)最后,我用这个周末观察,安卓的游戏基本全属动作类大游戏,例如割绳子,例如愤怒的小鸟,例如切西瓜。。。好不容易找到个RPG,网游。。。所以我这里最终还是劝朋友们,对这方面只是先简单了解为好,把java学好,把Dalvik opcodes的双胞胎:jvm指令学好;以后真真需要改的,我们上手同样会很快的!!

现在这个流程真的很繁琐,我第一步现将大框架给大家展示(括号内的文字是对文件的必要解释):

在此之前,为了讲的更明白;我将每个流程加上【手】或【眼】的前缀,例如我们修改java游戏,xjad就是【眼】,功能就是反编译class成java好让我们容易定位要修改的地方;halo就是【手】和【眼】,既可以最终修改游戏也可以寻找线索

Android游戏包apk用好压或者winrar将里面的classes.dex(这个文件相当于我们jar里面的所有类文件class的集合,它里面包含所有我们要修改的语句;可以说是apk的核心,大脑)提取——>>【眼】这里我们用一个叫做dex2jar的软件将classes.dex反编译成jar,那么编译好的jar我们可以用halo打开进行定位(注意尚不能修改,改了也没用,因为编译不成功)当然也需要xjad进行定位理解——>>【手】我们回到原游戏包apk,我们用软件Doapk对其进行整个反编译,编译好的文件夹,里面有个叫做smali的文件夹,里面所有的文件都是smali文件(现已知道smali里的语言叫做Dalvik opcodes),这个文件我们完全可以理解为java世界里的类文件class;只不过有个小优点和一个大缺点:小优点是,我们可以用notepad++直接对其修改!!大缺点是:其里面的语言难过halo的内核:jvm字节码!!(现已知道它和jvm字节码很相似,但是似乎有偏移量标识lines)所以我本教程名称以静态流开题,改个数字都不容易的——>>【眼】这里我们需要配合halo和xjad找到要改的位置,然后定位到smali文件内,进行修改(此为全过程的重心难点)—>>【手】改好后,用Doapk对文件夹进行回编,完成。

最后,开始整个大流程:
(这里注意下,必须看完整个流程一遍、至少学会Doapk用法后再动手,因为第7步提到的先行验证非常重要,有些apk不能用Doapk处理,建议在整个流程开始前,进行Doapk完整流程:反编+回编,能回编成功再继续)

这个例子是我从应用汇上下载的,叫做黄金矿工,小游戏,比较好改,呵呵

将文件下载好,在桌面新建一个文件夹“Gold”,丢进去;

1.用好压将apk里面的classes.dex先拉出来:6.用xjad打开文件“UI_Shop.class”,并且彻底关掉Halo,在本方法中它的使命完成了;在xjad里查找800,找到了(下图),将xjad最小化候着。。:
2.将class.dex用dex2jar.bat打开:
3.将Halo欺骗文件.zip里的文件夹添加到生成好的classes_dex2jar.jar中,保存,并且将生成的jar解压到文件夹“classes_dex2jar”:
4.此时可以用Halo打开classes_dex2jar.jar进行分析了,我用Halo打开它,在类编辑器里搜索关键字800(下图),看到最后一条嫌疑非常大:不但方法名是静态数据类型clinit,而且类名也有个Shop(商店)
5.将Halo和xjad进行“信息交接”:在刚才解压好的文件夹“classes_dex2jar”中,追踪我们的最后那条800的记录地址:
6.用xjad打开文件“UI_Shop.class”,并且彻底关掉Halo,在本方法中它的使命完成了;在xjad里查找800,找到了(下图),将xjad最小化候着。。:
7.我们回到Gold文件夹,开始处理apk。打开Doapk.exe;选择apk我们就选择那个文件,选择路径我们浏览、点中Gold文件夹,OK,进行反编(特别特别注意!!:有些游戏谓之“进行过美化的apk”,可以反编但不能回编,建议最开始不执行任何修改,进行Doapk完整流程:反编+回编,能回编成功再继续):
8.此时我们可以在反编的文件夹里搜索“UI_Shop.smali”(下图),因为他对应我们第六步里的“UI_Shop.class”,它俩是一对双胞胎;用notepad++(这里据说用notepad也能直接修改smali,但是我建议还是用++)打开UI_Shop.smali:
9.【难点】修改:两个窗口进行对比,一个是用xjad打开的“UI_Shop.class”,另一个是用notepad++打开的“UI_Shop.smali”,此时进入大难点,我来进行猜测解释:
.method static constructor <clinit>()V//这句是定义这个文件里的静态赋值,关键字:clinit
    .locals 1
    .prologue
    .line 23 //这个似乎就是偏移量,若是以后从smali入手动态流,这个可能是最大的否决因素
    const/4 v0, 0x5//此时定义变量v0 一共包含5个数值
    new-array v0, v0, //新建int行的数组,第二个v0我解释不了
    fill-array-data v0, :array_0 //这个字面意思叫做:给数组赋值
    sput-object v0, Lnicdy/game/GameCode/UI_Shop;->ItemPrice://这句话很重要!我觉得应该是将v0的值付给物理地址ItemPrice
    .line 15
    return-void
    .line 23
    nop
    :array_0 //临时数组v0
    .array-data 0x4
      0xc8t 0x0t 0x0t 0x0t
      0xfat 0x0t 0x0t 0x0t
      0xf4t 0x1t 0x0t 0x0t
      0x58t 0x2t 0x0t 0x0t
      0x20t 0x3t 0x0t 0x0t//这个意思就是800了,你看:0x是十六进制的标识,这个t应该必须是数值的结尾,800的十六进制我们用计算器查到为320,你懂了吗?第一个数0xc8t 0x0t 0x0t 0x0t是200,改成20怎么改呢?0x14t 0x0t 0x0t 0x0t;20000呢?0x20t 0x4et 0x0t 0x0t
    .end array-data//结束数组
.end method //结束方法

10.改好后用notepad++保存,然后用Doapk进行回编(目录选择nicdyg~1.apk.decode,放置就选择Gold)大功告成!:
如果有一天,smali(输入法打出来的是索马里,囧)的语言被研究透了,我相信,动态流冲击安卓也指日可待了!!

兄弟们,加油!!

PJ-Register 发表于 2014-5-9 13:15

楼主屌炸天

留恋流年念流年 发表于 2014-5-9 13:20

字太多不想看。。。。

mageciqing 发表于 2014-5-9 13:20

很专业的解析

若许明日约 发表于 2014-5-9 13:27

好赞!谢谢!

dw783701519 发表于 2014-5-9 14:46

表示看不懂

仲夏 发表于 2014-5-9 14:51

楼主真是给跪了、大腿啊

jacky520510 发表于 2014-5-9 14:55

太专业了,且看且学习

至尊宝丶 发表于 2014-5-9 15:30

牛掰啊 !!!!!!!

weichao983 发表于 2014-5-9 16:57

好像显得复杂化了,用改之理不是清晰明了吗?
页: [1] 2 3 4
查看完整版本: 直接法修改安卓游戏