暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Android手游逆向工程-自由添加逻辑

Renk 2020-04-17
1536

(本篇专业性较强,默认你了解java基础、android基础。同时本篇不作脱壳/解析等介绍)

    Android由于是开源系统。所以各大厂商都是基于其定制做系统。造成碎片化严重,每个手机厂商都会有应用商店。由于各种原因应用上架不能像iOS App Store那样审核严格。所以Android应用市场里面参差不齐。这其中游戏类应用尤为突出。各种弹框广告应接不暇。本篇带你逆向一款休闲类App。然后逆向为Android工程。自由修改逻辑。话不多说,我们开始吧。

准备工具包

    AndroidStudio开发工具,jadx工具包软件,010 Editor,smali.jar,dex2jar。Android开发环境伴随着Androidstudio的安装一并完成,下面给出几个工具包的链接:

smali.jar(将smali转换为dex文件的工具包):

https://bitbucket.org/JesusFreke/smali/downloads/

jadx(Android Dex和Apk文件生成Java源代码的命令行和GUI工具):

https://bintray.com/skylot/jadx/releases

010Editor (全球最佳十六进制编辑器): 

https://www.sweetscape.com/010editor/

dex2jar(dex文件转jar):

https://sourceforge.net/projects/dex2jar/

我们在Google Play上随便搜索一款评分最高的休闲类App,今天的主角我们把它下载下来:

反编译
    直接进入jadx中的bin目录双击jadx.bar就会弹出工具面板。操作也是相当简单。点击文件--->打开文件夹--->选择我们之前下载的apk包。该工具会自动将源代码、资源文件及签名信息等信息展示出来。

    由于这款apk没有任何加固及混淆措施。所以到这步没有任何难度。然后我们进入资源文件,找到AndroidManifest.xml文件。每个应用项目必须在项目的根目录中加入 AndroidManifest.xml 文件(且必须使用此名称)。 清单文件会向 Android 构建工具、Android 操作系统和 Google Play 描述应用的基本信息。所以,通过这个文件可用获取很多信息。如包名,activity,server等类信息。

新建Android项目

    在文件中第一行<manifest>标签里面有一个属性package,顾名思义就是应用的包名。我们拿到这个包名,新建一个Android项目。将上图中的java代码复制进去,注意保持包名路径不变,项目目录结构如:

assets 目录就是把jadx反编译后资源文件的目录复制过来。

新建jniLibs文件夹,里面放so包-游戏的核心逻辑全在里面。c/c++编写

res目录存放资源文件,layout、drawable、color等等直接复制粘贴

AndroidManifest.xml文件内容同样替换过去,删除里面带有google/facebook的标签。这些都是广告用的。

jadx这个工具虽然好是好,可是有些时候还是有问题。反编译不出来。比如

这个时候,复制的话就会有问题。我们可以把这个些对应的smali文件找出来,做成jar包,引入我们的Android项目里面。那怎么讲smali文件转换成jar包呢。

    了解java的朋友都知道。java在编译的时候会转换为class文件。然后加载到jvm里面。而Android其底层也是基于jvm实现的只不过,Android项目被编译成dex文件。然后系统通过dex文件在解析为可执行的class。所以,我们要将smali先转换为dex文件。再将dex文件转换为jar文件。这样我们项目中就可以引用了。

    好我们来实际操作一下,smali-->dex 我们会用到前文提到的smali.jar工具包。dex-->jar我们会用到前面提到的dex2jar。具体步骤如下:

1,将无法反编译的smali文件单独复制出来。包括他的层级。什么意思?比如说上面那张图,ImageItem 在com文件夹下king文件夹下kvast文件夹,我们复制的时候,也会创建com.king.kvast这样的一个目录结构,然后将相应的smali文件复制进去。

2,打开控制台。在控制台输入java -jar [smali.jar的路径] assemble [输出dex文件路径包括名称已.dex结尾] smali源路径    然后回车就会看到在当前目录创建.dex的文件,命令举例:java -jar d:/smali.jar  c:/renk.dex  c:/abc

3,将生成的dex文件复制进前文所说的dex2jar文件夹内。使用命令:d2j-dex2jar.bat [.dex文件]   回车后就会看到在该目录下生成了[]-dex2jar.jar这样的文件。

4,将生成后的jar文件放入Android项目的lib目录下,然后点击右键Add Library... 就完成的导入工作。

    经过以上步骤其实就可以运行我们的Android项目了,但是我们想取消App里面的广告/内购。那么接下来我们就会去修改里面的逻辑。

优化

    首先我们找到,程序中判断网络的逻辑,在network包里面我们看到两个方法上面isInternetReachable()判断网络是否可用,我们修改为false,getNetworkType方法判断网路连接类型,根据上面的常量值我们返回0。

    在打开app后,我们在首页看到有两个按钮。一个PLAY,一个Retrieve...。如果你只想安静的玩,不想看到多余的东西,这个时候我们可以直接把该按钮删除。只需如下几步:

1,全局搜索该按钮的文字。

2.再全局搜索,该字符串前面的id name

3.在资源文件里面找到该.xml文件。删除即可。这个app的控件不像传统的Android应用都是放在res目录下layout目录里面的。它是通过so动态加载到里面的。所以删除更方便。

如果想对其他的控件删除,都可以用这种操作。我们这个应用也是随便找的。不同的应用方式不一样,具体问题具体分析。

    好了,build运行就可以了。当然如果你想自己在游戏启动的时候加入广告,就在CandyCrushSagaActivity或者GameActivity里面添加自己的广告逻辑就可以。这里就不多介绍

    本篇也没有过多介绍so文件(游戏核心)的内容,因为涉及到反汇编的内容。如果我们想改掉包名换掉UI重新上架应用市场。就只是属于网上的黑产了。本篇不会介绍替换包名(涉及包名验证等),替换UI这些内容。希望本篇给你一个对逆向工程有一个初步的认识。



文章转载自Renk,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论