总结一下最近的逆向工作(可能是比较全面的反编译工具汇总)

首先呢,1024,大家程序员节快乐~

刚毕业,一开始想要走Java,到第一家公司,经理看我有点安卓基础,就先让我做安卓,那么既然做了,就把安卓搞好。工作里除了写APP,遇到了坑总是要填的,自己填不上,网上又找不到合适的帖子解决怎么办?那么只有去学习别人的做法,这就不得不用到反编译,包括后面进了第二家手游公司,也需要做一些逆向工作。积累了一些东西,总觉得整理一下才比较安心。

感觉基本上把能用到的、频率比较高的都写下来了,对自己表述能力还算自信喜欢纯码字,比较懒没有图,见谅。

自己找各类工具并且尝试去用也是发现了很多问题的,因为毕竟好多帖子都很旧了,这里我也都写出来,可以让看到的人少走些弯路。(当然要说一句,反编译拿来学习和研究安全是很好的方式,不要用在歪路上)

反编译的环境我也就不说了,%JAVA_HOME%.这个大家都熟悉,python可能运行一些脚本也会用到,不过我用的不多。

1、我最常用的反编译工具

(1)apktool

这应该是最常用的工具了,apk本质是个压缩包,直接改后缀解压就能看到完整的文件结构,但这样做,文件都是加密的,看不到明文。用apktool工具反编译拿到的资源文件,包括AndroidManifest.xml、各布局文件等就可以直接看到了。如果一个app你觉得某个页面写的不错,自己又想不到怎么写,就可以反编译出来参考。

刚开始去找这个工具,很多老的帖子并没有贴出官方网址,都是自己存的文件,很多版本比较老。这就导致用的时候我发现好多apk完全不能反编译,我找了很久是不是我的方法不对,出错信息也都读的晕头转向。最后我才知道,要用最新的jar包,才能保证能够使用。

官方地址:https://ibotpeaches.github.io/Apktool/

这个网址我不太懂为什么很少有帖子直接贴出来,install标签写了如何安装、documentation也就是使用文档。上如果刚开始就找到官网,会节省很多时间,里面各方面都写的十分详尽了,并且也有jar包的更新地址:

(https://bitbucket.org/iBotPeaches/apktool/downloads/)

程序员嘛,英语总是要能看懂的,还是简单说一下安装和基本使用。(其实就是翻一下install标签的内容)

Windows平台为例:

把官网给的脚本(网址里脚本是个链接,点进去复制就好)放到记事本,后缀改bat

下载最新jar包,下载后改名为apktool.jar,后面一般都有版本号,为了方便,脚本里固定写成apktool。

把两个文件放到系统文件夹下C://Windows,这样你只要打开cmd就能用了

不过我的习惯来说还是只要保证两个文件在同一个文件夹下就可以了。用的时候在文件夹内shift+右键调cmd即可。

常用命令:

apktool.bat d test.apk ——会在当前目录生成与安装包同名的文件夹

apktool.bat b -o test-new.apk test ——可以把上面生成的文件夹回打包成apk

至于反编译后修改了文件怎么反打包和签名,很多帖子写的很详细,也不难,没什么要补充的。

(2)dex2jar

apktool拿到的除了布局资源文件,就是smali代码和assets资源,还有一些lib库,所以如果你没有了解smali或者不做手游,apktool也就只能帮你到这了。如果你想知道一些除了页面怎么写之外的逻辑代码,就要去找怎么才能看Java代码。

这就要用到d2j,这是一个可以做很多事的工具包,根据包里文件名,你就能知道它能把文件在各种格式相互转换。我们反编译app用的比较多的就是dex2jar,apk解压后会发现有一个class.dex文件(当然现在大部分包会有很多,也就是multiDex),这里面有app的src也就是源代码。

这个工具最开始找来用,也是要强调,一定要用最新版。先贴出工具包的更新地址:

https://github.com/pxb1988/dex2jar/releases

最初看到最多的帖子说的就是解压apk后,用命令dex2jar.bat class.dex拿到jar包。但我总觉得好麻烦,每次都要改后缀、解压,不过这样已经能看到jar了,还是可以接受的。后来我又发现,很多apk的class文件就不只一个,这我就很头疼了,看了很多帖子,刚毕业的我这么菜,只能说我看不懂。

最后才知道,从这个工具包2.1版本之后,就已经支持多dex文件转换了,而且不需要解压,只需要最简单的一行命令就能拿到需要的jar包:

d2j-dex2jar.bat test.apk

所以还是要强调,什么都要去官方找最新版!

二、拿到资源和源代码后

(1)jd-gui

如果你需要做逆向工作,smali不得不学,因为反编译后重新打包,还是需要用apktool,改代码也要改smali包里的代码。当然,不需要完全熟悉语法自己去那么累的编写(我第一次尝试用smali写一个hello world,用了几十行,可怕),一般来说,用ide写好java代码后,自己打包再反编译出来,做替换就行了。推荐一个android studio的插件,java2smali。

如果你只是想看看某个功能别人是怎么写的,那么只需要能读java代码就好了。而d2j拿到的jar包,直接解压的class文件是不可读的,所以需要用到这个jd-gui,还是先贴个官网地址:

http://jd.benow.ca/

记得什么都尽量找官网,很重要。

使用方法比较简单,把d2j拿到的jar拖到界面里就好了,包结构也都很清楚。

小Tips:我在使用的时候发现,jd-gui在处理内部类的时候还是不够完善的,jar包拖进去有些地方是不完整的,所以我现在基本都是先把jar包解压出来,然后拖进去任意一个文件,这样他就会把每个文件都自动导进去,里面class$1这样的内部类也能都读到。

当然,现在大部分代码都是经过混淆的,而解混淆的方法,我看了很多文章,感觉这个应该现在还没有一个完善的方案,所以,对照一下资源文件,稍微理解一下逻辑就好了,编程还是要靠自己动脑。

(2)IDA Pro

很多厂家现在都不会在java中写下全部代码,毕竟不够安全,都是用ndk写一些c与java交互的代码,然后打包成so库使用。so库就类似dll文件一样,在windows下其实是打不开的。而有些时候,要看清代码全貌,还是得想办法去看一下的。刚开始找到的答案都是不能看,还有的说要在linux下打开,我总不能为了看这个再装个虚拟机吧。

最后找到了这个工具,IDA Pro

https://www.hex-rays.com/products/ida/support/download.shtml

不过这个嘛。不是免费的,可以去找下破解或者绿色版。

使用方法也不难,打开后so库拖进去,会让你选解析格式,一般so库都是elf,选择后进了软件等待编译完成,里面会列出方法列表,点进去想看c代码的话,按F5就好了。这个工具我也还没用太熟练,没法说太多。

三、其他工具

还有一些其他工具,很多帖子也都是强烈推荐的。不知道是不是我不会用,总觉得不顺手,用了几次也就还是回归上面四种了,他们基本能应付大部分问题。

其实下面很多也就是上面工具包的一些集成,帮我们把需要用命令做的事可视化,往ui里一拖就行。懒人化的东西确实不错,但他们实在让我更懒得去用,最关键就是因为好多都不更新了,下载下来还要自己替换一些文件,更麻烦,还不如自己动手。不过工具里一些功能还是不错的。而且既然说总结,还是全面一点好。

(1)jadx

这个还是很好用的,相当于d2j和jd-gui的结合,把apk直接拖进界面,就能看到源码,省略了我们自己拿jar包这个过程。

https://github.com/skylot/jadx

(2)android killer

也是一种集成,把apktool、d2j和jd-gui都结合了起来,可以查壳、反编译、改代码,还能连接模拟器、编译、反打包调试。功能很齐全,还有一些小插件很好用,但就是很久没更新,自己要把里面的apktool和d2j的最新jar包都替换掉。但我的毛病就是,集成度太高看不见过程我总感觉会出问题,喜欢自己动手,所以也就没怎么用。

编码转换和代码搜索功能很不错,经常会用到,安装和使用贴一个帖子:

https://www.52pojie.cn/thread-726176-1-1.html

反编译很多内容都是在吾爱破解找到的,很多大神都在里面。

(3)jeb

同样很出名的反编译工具,除了一键反编译出可视化代码之外,特点就是能运行各种脚本去处理smali代码,批量反编译、批量解混淆,需要python环境。缺点就是对java环境比较挑,兼容一般。

我使用的时候试了很多,只有jdk8u121版本才行。其他版本会闪退,至于现在最新的稳定版本java11我也试了一下,没有闪退但还是不能用,报空指针错误。

由于我当时在找反混淆的相关内容,找到了这个,经测试也都效果一般,毕竟现在混淆手段比较完善了,加上软件同样很久不更,也就没怎么用。

需要的可以去52破解找一下。

四、抓包

反编译时经常需要看一些请求的url,推荐一个很好用的抓包软件——charles,经常被叫做青花瓷。

至于他的使用,可以用一整篇的篇幅去写了,网上很多大神也都总结的很完整,这里只是提一句,推荐给没用过的人。

而且这个软件官方就是免费的,只是每半小时就要关闭一次。所以平时如果不专门做抓包,完全够用,很良心,当然注册方法也不难。配置好之后,手机设置代理、装证书就可以了。

五、手游相关

原来喜欢玩一些单机手游,又不像肝,经常去找破解版。自己做了这行后,就突然想,能不能也试一下。

最早的手游破解还是很简单的,单机游戏都是把存档文件留在本地,还都是明文,只要有root,改一下data里的文件就能无法无天。遗憾是现在就算是手游,也很少会这样做了,甚至有些单机手游,不联网都不能玩,用云端存数据,接口我们又没法篡改,毫无办法,这也是为什么现在破解手游这么少的原因了。

不过虽然不能像原来一样直接改数据,却可以通过改手游里的逻辑,比如改一些参数让任务奖励放大、消耗物品不减反增这样的方式来实现。至于怎么操作,我只是总结一下工具,原理就不提了。

现在的手游,大多是h5、cocos2d、unity3d这三种。

我反编译过一个h5游戏微端,就一个webview加载了一个页面,这类我们可以说放弃就好了,除非你能黑服务器。

看到的比较多的是cocos2d,apktool拿到的assets文件里一般就会放游戏的lua脚本,但都是加密的。

unity3d我不太懂,也没有实际需求就还没看。

由于也是刚接触手游逆向,好多东西我也没有成功实践,但看了很多文章之后,大概知道了几种常用的工具,记录一下

(1)xxtea

一般cocos2d的游戏都稳定会有一个名为libcocos2dlua.so的文件,通过ida去反编译这个库,能拿到很多有用的信息。很多lua脚本加密都是用xxtea,所以如果你能找到sign和key,就可以用这个工具反编译出明文代码(介绍工具就不提其他语言上的知识了)。当然,现在很多脚本都并不是单一的加密,需要多种工具结合去用。

也是52破解大神写了xxtea_decrypt这个工具,输入了签名和key就可以解码了。

(2)unluac

如果你用notepad++打开反编译出的lua文件(很多是luac后缀),能看到开头有luaQ、luaR、luaS(代表不同的lua版本),那么你可以用unluac这个工具包来处理。

提一句,这些文件记事本打开是乱码,sublime打开直接是加密的十六进制格式,只有notepad++能看出来一些标志,不分文件这样打开,开头就是用xxtea加密的sign,这也是个取巧拿签名的方式。

这里贴一个写的很好的lua脚本解密系列贴:https://www.52pojie.cn/thread-694364-1-1.html

(3)ljd

我想反编译的第一个手游,就遇到了跟网上大多数方法都不同的情况,就是luajit字节码加密方式。这也是被认为最难解码的方式,没有一个很完善的工具来用,很多都是介绍了ljd这个脚本,不过还是因为没更新了,基本没什么效果。

主要是我不搞lua,很多东西还都不懂,很多大神说有那个coco2dlua的so库就能做很多事了,可以通过里面一些函数dump出代码,看来还有很长的路要走。

 

最近做了很多相关工作,写之前觉得这可能是一个比较全面的反编译,写完才感觉其实没什么内容,差的很远。

感谢阅读,共同进步。

你可能感兴趣的:(Android)