前言
反编译别人的程序并不是很高深的技术,希望大家最好只是兴趣探索仅做学习。
PS:大佬勿喷,小弟在此感谢
什么是反编译
Android的程序打包后会生成一个APK文件,这个文件可以安装到Android手机上,所以,反编译就是对这个APK进行反编译。Android的反编译分成两个部分:
代码反编译:Java文件反编译
资源反编译:res文件
所需的工具
java 不用说,先装这个玩意
Android Studio:安卓开发IDE
下载地址:https://developer.android.com/studio/index.html
这个玩意跟phpstorm一样一样的
反编译代码的工具
dex2jar: 把dex文件转成jar文件
下载地址:https://sourceforge.net/projects/dex2jar/files/
jd-gui: 这个工具用于将jar文件转换成java代码
下载地址:http://jd.benow.ca/
#反编译资源的工具 #
APKTool: APK逆向工具
下载地址: http://ibotpeaches.github.io/Apktool/install/
好了,工具准备好了,阔以开始瞎几把搞了
先下载一个APK,鉴于学习使用,下载个不知名的小软件就可以了,别下正规公司的APK一般都加密了,没得玩。
这里我做个示范,下载了一款据说可以锁屏的APK勒索软件
图片一:
emmm~ 也就是这个玩意,名字也是感觉牛哄哄的样子,我们来探索一下
施法安装!
图片二:
安装成了,我们点进去看看
图片三:
OJBK,被锁了,还附带著名神曲东进热出场音乐,666。接下来,我们开始反编译和破解他的加锁。
开始编译
首先,先把APK复制一份,重命名为.zip的后缀名,然后解压得到如下文件列表
图片四:
可以看到有MATE-INF等等
MATE-INF:这个玩意你就当做是jar包要编译时需要的一个目录,没有这个玩意会报错出现找不到缺失class文件啥啥啥的
res:这个是资源文件夹
AndroidManifest.xml:这玩意是应用清单,声明什么包在什么位置,不用管它,当做index.php就行了
classes.dex:这个编译后可以看到整体项目的逻辑。
编译classes.dex文件
我们现在开始编译,先看看逻辑,这里要使用的工具是dex2jar,我已经放出下载地址了,解压后可以得到很多文件
d2j-dex2jar.bat----这个是对应的Windows系统的。(Mac土豪请使用 .sh 谢谢 (╯╰)~ )
为了简洁明了,我们把解压好的文件classes.dex文件放在与d2j-dex2jar.bat同一个目录下,执行如下命令
d2j-dex2jar.bat classes.dex
图片五:
得到了classes-dex2jar.jar文件,现在使用JD-GUI工具打开
图片六:
可以看到整个项目的大概逻辑了,现在我们开始编译资源文件
编译资源
为啥要编译资源呢,不编译的话,看xml文件都是乱七八糟的不知道哪国文字,为了方便查看,我们需要编译它
这里使用到apktool工具,我下载的是Windows的
图片七:
apktool工具下载完成后有一个.bat文件和.jar文件,我们把APK文件放在与apktool同一个文件夹下面
然后执行如下命令
apktool.bat apktool d 应用名.apk
图片八:
编译后会得到一个与APK同名的文件夹,我们打开它
(emmm 貌似有个警告 但是,我们程序员是不在乎警告的,只在乎错误!好,不管他。MATE-INF文件放在了origin文件夹里面了,不管他。)
smali:这个是寄存文件夹,是Android虚拟机所使用的寄存器语言,如果能看懂,直接改这个就行了。
好了,编译完成了,剩下的就是自己看代码,然后到smali文件夹里面去找编译后对应的逻辑,重新打包就可以了。
接下来是拓展,毕竟我虚拟机还锁着的,一直播放着东进热出场音乐.........
解锁我苦逼的虚拟机
在被锁界面,我一直寻找突破,找不到关键文字,我就找资源文件,看看那个xml文件调用了图片,然后在看逻辑代码,哪儿调用了这个xml文件。果然,功夫不负有心人, 我没找到。
好吧,既然是安全问题,锁屏,肯定会调用layout这个关键,恩恩,jar-GUI工具里面使用全局搜索一波....
MMP***太多的....
最后,我全局查找中文“请输入”找到了.......
图片九:
既然找到了,我们就来看看他写的蛇皮逻辑是什么鬼,尝试一下能不能破解
看代码ing...........
惊喜的发现,有个onCreate()方法,貌似我以前看到的某些软件禁止截图也是这个名....
图片十:
能看见了,随机数啥啥啥的,不要慌,继续看,既然有创建create ,那肯定有启动start,点击click等关键的词语
public void onClick(View paramAnonymousView)
{try
{
if (s.this.ed.getText().toString().equals(s.this.des.decrypt(s.this.share.getString("passw", ""))))
{
s.access$L1000001(s.this).removeView(s.access$L1000002(s.this));
s.this.stopSelf();
}
return;
}
catch (Exception paramAnonymousView) {}
}```
看不懂没关系,我也看不懂,看个大概意思就差不多了,这里就是个根据输入的解密,利用WindowManager设置最高权限,窗口锁机法。
``` public void onCreate()
{
super.onCreate();
this.pass = ((Math.random() * 100000000));
this.passw = new Long(this.pass + 1);
this.des = new DU("s.java");
try
{
this.des = new DU(this.des.decrypt("18403cf257a48178"));
this.share = getSharedPreferences("Flowers", 0);
this.editor = this.share.edit();
((Vibrator)getApplication().getSystemService("vibrator")).vibrate(new long[] { 100, '?', 100, '?' }, 0);
if (this.share.getLong("m", 0) == 0)
{
this.editor.putLong("m", this.pass);
this.editor.commit();
}
}
catch (Exception localException2)
{
try
{
this.editor.putString("passw", this.des.encrypt("" + this.passw));
this.editor.commit();
if (is(getApplicationContext())) {
this.ppss = (this.share.getLong("m", 8) + "");
}
}
catch (Exception localException2)
{
try
{
for (;;)
{
this.password = this.des.decrypt(this.share.getString("passw", ""));
new Thread()
{
public void run() {}
}.start();
return;
localException1 = localException1;
}
localException2 = localException2;
}
catch (Exception localException3)
{
for (;;) {}
}
try
{
this.editor.putLong("m", Long.parseLong(this.des.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9")));
this.editor.commit();
this.editor.putString("passw", "4423d1f68fdbfdad18645d4353e09e0c");
this.editor.commit();
return;
}
catch (Exception localException4) {}
}
}
}
这里发现,在 this.pass = ((Math.random() * 100000000));
this.passw = new Long(this.pass + 1);
这里passw+1,然后在解密,解密包是DU(s.java)
有意思了,我们看看pass是一个随机数,随机数+1?
也就是说,他一波瞎几把加密,展示窗口的那个数字加1就行了
图片十一:
没错,进来了,但是出现新的问题,还有一道锁
图片十二:
这个是系统自带的锁,我们继续在文件中查找系统自带的锁屏函数onDisableRequested()
图片十三:
轻而易举的找到了,施法解锁,输入1027 成功!
在smali文件夹中,我们也能找到

总结就是他把随机数处理后显示在界面上,我们看代码逻辑是随机数+1,DU类里面进行了解密压缩等操作,得出的结果在界面上,我们+1就行了,解锁后还有一道系统锁,查找函数输入他设定的数字就可以解锁了。
PS:我只是运气好瞎试出来的,大佬勿喷。