恶意代码分析-秒抢红包

效果

双层密码,安装完成后有运行时解锁密码,重启之后有屏幕锁屏密码

重启之后的 pin 码,在反编译代码中很容易找到,搜 resetPassword 可以。

而安装时出现的美图界面,是不太容易获取到密码的。

思路

当点击按钮解锁时,密码会进行解密,解密函数如果 Hook 加入 smali 代码,打印输 出参数,就可以获得运行时密码!

分析

第一层密码分析

通过从入口类开始分析,可以定位到服务类是关键类,搜索 equals

可以看到密码是通过读取一个 xml 文件中的键值获取的字符串解密得到的
① this.share.getString(“passw”,””); // 获取 xml 文件中 key=”passw”的 value
② this.des.decrypt(xxx); // 解密字符串

通过上面代码,我们要找到 xml 中的 key-value 是如何赋值的,查找 share

可以看上面的代码,xml 文件名是:Flowers,这个文件是通过 getSharedPreferences 获取的。 getSharedPreferences 获取的 xml 文件是固定路径,是当前程序安装目录下的 shared_prefs 文件夹。

写入的字符串是事先被 dex 加密了。所以使用 adb shell 命令行查看文件,字符串是加密的

加密前的值需要找到 passw 是如何赋值的,onCreate 函数开始处有代码
this.pass = ((Math.random() * 100000000));
this.passw = new Long(this.pass + 8985);
只要知道随机码,就可以计算出密码,随机码在界面中有一个,尝试可以解密

Smali 注入

首先找到 smali 注入点,在秒抢红包 apk 中,可以搜索 equals 函数的调用,最终可以找到有 一处地方非常像比较密码的代码:


可以看到参数是 des 对象,查看定义是 DU 类型

找到 DU 类中的 decrypt 函数,可以在这个函数返回之前插入 log,当调用时会输出 log,输 出密码。

Smali 代码:

插入的代码为

发现报错,自己修改代码:

修改完代码之后保存,然后编译。 报错:

查看可知,资源中的 png 不是真正的 png 文件,使用画图工具修改为真正的 png,即可编译 成功。

程序重打包之后,使用 Monitor 观察

点击界面按钮之后,日志会输出密码