中秋佳节,团圆节日,祝大家中秋节快乐哈O(∩_∩)O
今天上午实验室就我一个人,不过终于把困扰我两天的IDA Pro静态分析dex文件搞定了,坤哥yyds(●’◡’●)。
话不多说,分析正式开始,一大波文字加图片来袭中,请做好准备。
2 分析过程2.1 在Android手机中安装apk使用adb命令安装app-release.apk到自己调试用的Android手机中,打开Crackme0201后进入注册界面,输入用户名为iReverse和注册码为1234567812345678,接着点击注册按钮,发现错误提示信息无效用户名或注册码,如图1所示。
2.2 使用ApkTool工具反编译APK文件ApkTool是一款常用的跨平台APK文件反编译工具,使用命令apktool d app-release.apk -o outdir可以在当前的outdir目录下生成反编译文件。反编译文件包含一系列目录和文件,smali目录中存放了程序的所有反汇编代码,res目录中存放的则是程序中所有的资源文件,这些目录的子目录和文件的组织结构与开发时源码目录的组织结构是一致的,反编译APK文件的过程如图3所示。
2.3 grep分析APK文件如何寻找突破口是分析一个程序的关键。对大部分Android程序来说,错误提示信息是指路明灯。错误提示代码附近通常就是程序的核心验证代码,我们可以通过阅读这些代码理解软件的注册流程。
错误提示属于Android程序中的字符串资源。在开发Android程序时,这些字符串可能会被硬编码到源码中,也可能引用自res/values/strings.xml文件。
首先,使用grep命令可以找到错误提示代码所在的字符串资源文件strings.xml中的string类标识,在public.xml找到字符串对应的唯一的int类型的索引值,在outdir/smali/com/iReverse/crackme0201/MainActivity$1.smali文件中找到错误提示信息对应的id值0x7f0e0055c,如图3所示。
2.4 使用7-Zip工具解压apk打开app-release.apk文件所在的文件夹,使用7-Zip将其解压到当前目录下,如图4所示。
2.5 使用IDAPro静态分析classes.dex文件点击classes.dex文件,右键以IDA Pro(64-bit)方式打开,如图5所示。
在加载新文件的过程中,加载的文件选择Android DEX file,处理器类型选择Dalvik Virtual Machine [dalvik],点击OK按钮后便进行加载,这时尽量多等会,以使classes.dex文件被完全加载。
在IDA Pro主窗口按Alt+T快捷键,在弹出的Text search搜索框中输入unsuccessed字符串的ID0x7f0e005c,只勾选Find all occurrences,然后单击OK按钮进行搜索,如图7所示。
稍等片刻就可以定位调用的代码行了,如图8所示。
双击即可进入IDA View-A的流程图视图,右键进入文本视图,以便修改代码,如图9所示。
进入文本视图后,往上滑动,发现关键代码if-nez,如图10所示。
点击IDA Pro主界面上的Hex-View-1选项卡,发现这行代码的指令为39 03 0F 00,如图11所示。
通过查找Dalvik字节码集合的总结https://source.android.google.cn/devices/tech/dalvik/dalvik-bytecode?hl=zh-cn,得知第一个字节39为if-nez指令的操作码,我们只需将其改成if-eqz指令的操作码。翻看Dalvik指令集列表,得知if-eqz指令的操作码为38。
下面利用IDA Pro给原文件打补丁,操作方法是:定位需要修改的反汇编行,单击菜单项”Edit” -> “Patch program” -> “Change byte…”,如图12所示。
在弹出的修改界面上,将39 03 0F 00 54 23 D1 41 14 01 5C 00 0E 7F 71 30修改为38 03 0F 00 54 23 D1 41 14 01 5C 00 0E 7F 71 30。注意:这里只将第1个字节39修改成了38,其他字节均保持不变。
修改完成后,单击“Edit” -> “Patch program” -> “Apply patches to input file…”,如图14所示。
确认保存路径无误后,单击OK按钮保存即可,如图15所示。
关闭IDA Pro,发现classes.dex文件已经被修改,如图16所示。
2.6 使用d2j-dex-recompute-checksum修改classes.dex的关键字段修改后的classes.dex文件,其DexHeader头部的checksum与signature字段是错误的,需要进行修正。这里,我们使用dex2jar提供的工具d2j-dex-recompute-checksum,在终端提示符下执行如图17中的命令,命令执行后,会在classes.dex的当前目录下生成修正的文件classes-rechecksum.dex。
2.7 使用7-Zip获得压缩包test.zip将classes-rechecksum.dex的文件名修改为classes.dex,并将修改文件名后的classes.dex复制到app-release.apk文件解压的文件目录下,然后选定res、AndroidManifest.xml、app-release、classes.dex和resources.arsc文件使用7-Zip文件进行压缩获得test.zip文件,如图18所示。
2.8 使用signapk签名test.apk将test.zip文件名修改为test.apk,并使用signapk对其进行签名,最终即可获得经过破解后的apk文件test-sign.apk,如图19所示。
2.9 安装apk到Android手机下一步,使用adb命令查看Android手机是否连接到电脑上,并使用adb命令将修改后的test-sign.apk安装到Android手机中,如图20所示。
最后,在Android手机中,输入用户名为iReverse和注册码为1234567812345678,接着点击注册按钮,发现注册成功,如图21所示。
2.10 破解成功3 总结本次使用IDA Pro对注册软件Crackme0201.apk进行静态逆向分析,使用了adb、7-Zip、ApkTool、grep、IDAPro、d2j-dex-recompute-checksum和signapk工具,尽管中间过程有些坎坷,但经过坤哥我的努力,终于还是把这个简单的APP给破解了,以后接着搞更难的。(¬︿̫̿¬☆)
4 参考文献[1]丰生强. Android软件安全权威指南[M]. 电子工业出版社, 2023.
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。