美文网首页
APK反编译后对Smail修改

APK反编译后对Smail修改

作者: e196efe3d7df | 来源:发表于2020-01-17 11:24 被阅读0次

前言

最近想自己做一个小游戏,一直在留意一些核心玩法好玩但是已经不火的游戏,想吸收核心玩法,然后加工改造,做成一款网游。有一款游戏我真的非常喜欢,玩法简单但是特别上瘾,但是一番折腾后,发现资源文件根本就拿不到,研究后,发现是用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标签的,恶心到死!小改可以,大改容易伤身!。如果你需要加入很复杂的逻辑,给你个建议:

  1. 用java写个源码,把你的逻辑封装成函数
  2. 先用javac编译成.class文件
  3. 把.class文件编程成.dex文件
  4. 用dex2jar工具下面用 d2j-dex2smali 把.dex文件转成.smail文件
  5. 把对应的代码拷贝到需要修改的smail文件中
  6. 在相应的位置调用该函数即可

麻烦?!如果你不用上述步骤,强撸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加壳,签名校验等等。然,道高一尺魔高一丈!只要花费些功夫,都能破解出来,只不过是成本问题,就是你获得的利益是否大于你付出的成本!

相关文章

网友评论

      本文标题:APK反编译后对Smail修改

      本文链接:https://www.haomeiwen.com/subject/dqtxzctx.html