Android安全防护之旅---带你把Apk混淆成中文语言代码

一、前言

最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示:

瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的。所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果:

运行是没有任何问题的。看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能。下面就来介绍一下这种高度混淆的原理:

二、分析混淆工具源码

首先我们知道每个正式app发布之前都会进行代码混淆,而关于混淆的知识点,可以自行搜索了解了,混淆有很多好处,优化代码,增加安全性等,而混淆一般是采用了proguard.jar工具,这个工具混淆之后的代码默认都是26个大小写字母,所以如果想把代码混淆成中文,那么就需要对这个工具下手。幸好这个工具是开源的,所以从网上搜他的源码下载下来,导入工程即可:

找到入口类Proguard,这里为了演示方便,咋们就直接模拟一个命令直接运行看效果,关于命令后面会说到。这里有一个解析命令的类功能:

这里可以看到混淆规则,也就是我们一般用到的proguard.cfg文件,后面会介绍这个文件内容。那么下面我们就不要在深入代码了,直接找到混淆代码的地方即可,可以通过包名中有obfuscate快速找到这个类:SimpleNameFactory

进入这个类查看内容,有一个生成混淆名的方法:

这里CHARACTER_COUNT=26,也就是字母的个数,再看看charAt方法:

这个方法也很简单,就是取52个字符中的顺序一个。所以newName方法的实现逻辑就是:从52个字符中依次取出字符,如果发现这个字符被使用过了,就取下一个,如果单个字符被用完了,就双字符,依次类推多字符等。所以这里还有一个全局的名称字符缓存池:

用来记录这个字符名称有没有被用过,所以通读了一遍代码,没什么难度,而且这个类还有一个测试方法:

直接运行看看效果:

看到了,会生成不同字符名。

三、修改混淆工具

所以知道了上面的代码逻辑之后,下面我们就可以动手来修改这个类,让他生成中文词语,首先去网上搜一下中文字符的范围,然后在定义一个生成五个字的词语方法即可:

这里可以看到韩文,日文的范围,所以我们不仅可以修改成中文,也可以修改成其他国家的语言,然后定义一个随机五字词语的方法:

生成不规则词句之后,修改newName方法实现:

然后我们在运行一下测试方法:

看结果,我们已经实现成功了。到这里其实我们已经将proguard.jar改造成功了,下面为了演示修改的结果,需要用一个apk做测试,我们随便弄一个apk,因为这里不想给一个工程编写脚本,然后将系统的proguard.jar工具替换成我们修改之后的proguard.jar。所以就直接拿到apk中的classes.dex文件,然后将其转化成classes.jar文件。然后直接放到这个proguard工程中运行即可

四、运行混淆工具

下面简单看一下运行proguard工程需要准备哪些东西:

因为我们操作的是Android应用需要引用到系统api所以需要导入android.jar,然后就是混淆规则文件proguard.pro:

这里要说明就是引用第三方的jar,和输入输出jar文件路径设置,其他的设置都是正常的混淆规则,不多解释了,下面就直接用上面得到app中的dex文件转化之后的jar文件作为案例,运行proguard工程:

看到混淆之后的jar文件,和混淆的map文件了。接下来咋们在将混淆之后的jar文件打包回去,首先用dx命令将jar文件变成classes.dex文件,然后直接替换apk中原始的dex文件,在重新签名即可。最后咋们在用Jadx工具打开这个apk查看内容:

看到了,我们成功了将原来的apk混淆成中文语言的代码了,而对于这种混淆也是可以增加阅读难度的。当然这个apk安装运行也是不会报错的,这里就不演示了。

五、技术总结

到这里我们就成功的实现了,如何将一个apk混淆成功中文语言代码的功能了。下面还需要总结几点:

1、本文主要是利用proguard是开源项目,修改他的混淆代码达到我们的目的。

2、本文是将其代码改成中文语言的,而从我们分析的过程中可以知道,可以变成其他国家的语言都是可以的。

3、本文为了方便就随机生成一个五字词语,而如果你想生成一些有规则有个性的词语,可以自定义一个词语库,然后随机取即可。

4、本文为了演示方便,就没有正式的编写一个编译脚本,而是通过简单粗暴的方式混淆jar方式进行操作。

5、这种高度混淆对于反编译之后代码阅读难度有一定的增强,因为看惯了英文,一下子看中文反而不习惯了。

项目下载地址:因为proguard工具是开源的,所以我没必要上传了,大家可以自己搜索项目即可。

六、总结

本文就简单的介绍了Android中的一种高度混淆技巧,让我们的代码变得更难读懂,增加安全性。主要修改了混淆工具来实现这一功能。如果你看懂了文章,就可以自己定义属于你们项目的个性化混淆策略。最后如果阅读完了文章,一定要记得多多点赞分享,如果有打赏那就最好了!

更多内容:点击这里

关注微信公众号,最新技术干货实时推送

编码美丽技术圈

微信扫一扫进入我的"技术圈"世界

扫一扫加小编微信
添加时请注明:“编码美丽”非常感谢!

时间: 2024-10-14 06:16:21

Android安全防护之旅---带你把Apk混淆成中文语言代码的相关文章

android黑科技系列——Apk混淆成中文语言代码

一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的.所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果: 运行是没有任何问题的.看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能.下面就来介绍一

Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native层,那么这样一来,我们前篇说到的Eclipse调试smali源码就显得很无力了,因为核心的都在native层,Android中一般native层使用的是so库文件,所以我们这篇就来介绍如何调试so文件的内容,从而让我们破解成功率达到更高的一层.

android开发中系统自带语音模块的使用

android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很多的资料,但是没有直接导入工程就能用的例子,我这里写了一个完整的Demo,代码可以直接粘贴到自己项目中去,实现了语音搜索,并将搜索结果展示.语音搜索大致流程:启动系统自带的Intent,Intent参数设置为RecognizerIntent.ACTION_RECOGNIZE_SPEECH,再加上一些

[学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴趣的朋友可以参考 Android Handler.Message完全解析,带你从源码的角度彻底理解 . 不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程,我们本篇文章的主角也就正是它了. Asyn

Android逆向之旅---动态方式破解apk终极篇(加固apk破解方式)

一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应对Android中一些加固apk安全防护,在之前的两篇破解文章中,我们可以看到一个是针对于Java层的破解,一个是针对于native层的破解,还没有涉及到apk的加固,那么今天就要来介绍一下如何应对现在市场中一些加固的apk的破解之道,现在市场中加固apk的方式一般就是两种:一种是对源apk整体做一

Android 學習之旅!(2)

早幾天因爲學車,弄了幾天時間和精力過去,今天終於考過了(科目二,還是補考的...)嗯..不管這麼多了..今天又開始我的android 學習之旅!! 筆記: platform-tools目錄下的文件: adb.exe : android debug bridge(android調試橋) devices 列出所有連接設備 kill-server 殺掉 adb start-server 啓動 adb dx.bat : 打包生成dex文件 tools目錄下的文件: emulator.exe : 模擬器

解决部分android手机自带浏览器下载 apk 文件的时候提示无法识别该类型的文件

android 有些较为早期的手机自带的浏览器可能会出现无法识别 apk 类型的文件,因此在文件服务器端需要做以下的调整: 解决一: 在IIS服务器上,MIME类型中添加一个: 文件扩展名: .apk MIME类型: application/vnd.android.package-archive 解决二: 服务端部署在tomcat下,已经在tomcat的web.xml里面配置了mini type <mime-mapping> <extension>apk</extension

Android UI组件进阶(1)——带进度条的按钮

Android UI组件进阶(1)--带进度条的按钮 本节引言: 这个系列是继Android UI组件实例大全后的进阶系列,在该系列中我们将进一步的学习 Android UI组件,建议阅读本系列前线学习下UI组件实例大全系列,掌握基本组件的使用; 当然你也可以直接学习本系列!好了,废话不多说,直接开始第一节吧!本节要演示的是: 带进度条的按钮!相信大家在360手机助手到看到这个东东吧: 本节要实现的就是下方这个点击后显示进度的按钮 效果图: 必备基础: 1.进度条的一些属性: backgroun

【转】Android学习系列(1)--为App签名(为apk签名)

原文网址:http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html Android学习系列(1)--为App签名(为apk签名) 写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Pack