恶意代码分析-秒抢红包
效果
双层密码,安装完成后有运行时解锁密码,重启之后有屏幕锁屏密码
重启之后的 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 观察
点击界面按钮之后,日志会输出密码