前言
最近想自己做一个小游戏,一直在留意一些核心玩法好玩但是已经不火的游戏,想吸收核心玩法,然后加工改造,做成一款网游。有一款游戏我真的非常喜欢,玩法简单但是特别上瘾,但是一番折腾后,发现资源文件根本就拿不到,研究后,发现是用gamemaker做的,资源都打包在了game.droid中,然后想着找找有没有加载资源的漏洞,可以获取到加载资源的方式或者中间截取资源流保存到本地。反编译APK,查询修改smail,插入log,反编译so,查询漏洞。。。一番折腾后,没有一点头绪 。so文件研究起来真的头大,如果是修改一两个数据还可以,如果是想研究逻辑,真的太难了!放弃!
但是还是要总结一下这次的收获
工具
工欲善其事,必先利其器!大致需要一下几个工具
反编译APK (apktools) :这个跟简单的解压不一样,这个可以把class.dex反编译为smail文件
反编译so (IDA Pro) :反编译so文件的不二之选,破解软件利器
反编译dex (dex2jar) :把class.dex反编译为class.jar
查看jar源码 (luyten、jd-gui) : 这两个软件,可以直接查看jar包中的java源码,非常好用
这几个工具需要结合使用,如果只是反编译到java源码:apktools,dex2jar, luyten,jd-gui足矣,如果需要修改so,那就必须要用到IDA。
反编译
反编译class.dex
其实反编译class.dex到class.jar就是为了查看java源码,不能修改。解压apk包(随便一个解压软件都行),复制class.dex到dex2jar文件夹下, 然后输入命令:
d2j-dex2jar.bat class.dex
然后会在当前文件夹下生成class.jar。
dex2jar下面有很多转换工具可以很方便的在jar,smali,dex之间转换,很好用
查看class.jar
上一生成了class.jar,并不能直接看到源码,需要用到工具查看,这就用到了luyten、jd-gui。这两个都能查看jar包中源码,网上有人说luyten更牛逼,因为有些源码会出现decode error,luyten能解决这个问题,但我用了一下,然并卵!但是大部分源码都可以看到,不影响逻辑分析。这么使用呢?很简单,打开软件,然后把jar包托进去,然后尽情浏览!
反编译apk
以上两步,只能查看java源码,但是不能修改,如果想要修改,只能修改smali文件。这就需要反编译apk,必须要用apktools,该工具可以反编译AndroidManifest.xml,且把class.dex中的源码反编译为smali文件,命令如下:
apktool.bat d xxx.apk
执行成功后,会在当前文件夹下生成一个xxx目录,里面会有反编译的东西,重要的就是smali文件夹,可以对smali文件进行修改,重新打包。
中止
如果你只是想查阅java代码,则以上步骤足矣。
如果你想修改代码,重新打包,则继续往下看。
修改
注:只能对smail文件进行修改。如果你是一个老码农,则简单的看一下smali语法,就可以魔改代码了,如果你是新手,就需要研究一下,简单语法参考这里:https://www.jianshu.com/p/730c6e3e21f6。smail文件有很多坑,修改特别容易出错,特别是加了.line标签的,恶心到死!小改可以,大改容易伤身!。如果你需要加入很复杂的逻辑,给你个建议:
- 用java写个源码,把你的逻辑封装成函数
- 先用javac编译成.class文件
- 把.class文件编程成.dex文件
- 用dex2jar工具下面用 d2j-dex2smali 把.dex文件转成.smail文件
- 把对应的代码拷贝到需要修改的smail文件中
- 在相应的位置调用该函数即可
麻烦?!如果你不用上述步骤,强撸smail代码,能把你恶心死!一个Log.v的java代码,就得至少写5行smali代码,还各种需要注意的坑!
重新打包
修改之后,则需要打包了,这个时候就仍旧需要apktools了,命令很简单:
apktool.bat b xxx -o .\out\xxx_new.apk
然后你就会在out文件夹中看到了xxx_new.apk
这个时候还不能安装,必须要签名,如果你不想自己生成签名,刚好我有一个测试签名demo.keystore,密码:123456,拿走不谢!当然如果你要搞一个正式包,还是自己生成一个签名,很简单:
keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000 -keystore demo.keystore
#您的名字与姓氏是什么?
[Unknown]: webyang
#您的组织单位名称是什么?
[Unknown]: webyang
#您的组织名称是什么?
[Unknown]: webyang
#您所在的城市或区域名称是什么?
[Unknown]: new york
#您所在的省/市/自治区名称是什么?
[Unknown]: new york
#该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=webyang, OU=webyang, O=webyang, L=new york, ST=new york, C=cn是否正确?
[否]: Y
然后,就会在当前文件夹下生成一个demo.keystore
打签名包
jarsigner -verbose -keystore demo.keystore -signedjar .\out\xxx_signed.apk .\out\xxx_new.apk demo.keystore
签名成功后,就会在out文件下生成xxx_signed.apk,这个包就是一个可安装包!
IDA Pro
研究的不多,只会一个查找,F5,修改二进制,不想说太多,会吐!网上大把教程,自搜即可!
结束
以上就是反编译,查看,修改,打包,签名的整个流程,当然里面还有很多坑,且行且摸索!
我遇到过一个使用代码混淆策略的,里面通篇使用 a b c作为变量名, 各种无用赋值,变量传来传去,当时我想获取里面的资源图片,资源是加过密的,资源加载方式也被混淆的很复杂,我尝试复原加载方式,但是怎么搞都出错,在某个地方我看到了他的一个破绽,就是filestream,我就把文件流拦截下来,然后保存到本地,然后再把图片复制出来!
其实,稍微厉害的码农,都不会把核心逻辑直接暴露给你,有专一针对这些反编译工具的策略,例如代码混淆,apk加壳,签名校验等等。然,道高一尺魔高一丈!只要花费些功夫,都能破解出来,只不过是成本问题,就是你获得的利益是否大于你付出的成本!
网友评论