随着移动金融的发展,移动支付的使用场景越来越丰富。出门不需要带钱包,打开手机使用各种APP就可以搞定吃饭、打车、看电影等诸多支付环节。对于移动支付类APP,用户最关心的还是其安全问题。对APP开发者而言,更肩负着保护用户账号、信息、支付等安全问题的责任。 为了提高开发者的移动应用安全意识,以某银行类APP为例,360加固保为开发者和用户揭秘破解者如何盗取移动支付APP的账号和密码。 盗取移动支付APP账号和密码主要有三个步骤:反编译APP,得到源码>>定位账号密码登录的代码,插入恶意代码>>重打包,盗取账号和密码。
一、反编译APP,得到源码 首先可以通过使用ApkTool、Jeb、baksmali/smali等反编译工具,反编译apk安装包,找到APP的MainActivity。 该款银行APP带有签名校验,想成功得到源代码,需要绕过签名校验。如果无法通过签名校验,会对MainActivity进行finsh。所以我们在MainActivity中直接检索finish函数,来找到APP的finish逻辑,也就可以回溯该APP是怎样做到签名校验的。 找到finish逻辑后,可以看到在if v0不等于0的情况下会等于0,那么可以根据v0进行它的复制操作,来找到它在什么情况下会签名校验失败。 在截图中可以看到代码中做了一个v3和v0的比较,意思是如果v3这个字符串如果和v0匹配的话结果就为0,也就是校验通过。如果v3和v0不一致,则校验失败。所以该APP的签名校验只要把v0的值进行修改,强制复制成和v3一样的字符串,就可以绕过签名校验了。
二、定位账号密码登录的代码,插入恶意代码 得到源代码后,用JEB打开该APP,找到EditTextView,在里面看到一个OnInsertCharacters的函数,这个就是用户在输入账号密码时,它会做哪些处理。根据红框中的代码逻辑,可以判断arg6就是用户输入的字符的明文。 可以做一下验证,我们在这个函数里插入log,把arg6的值打印出来,然后观察log,看是否可以打印出用户在手机上所操作的按钮对应的字母。 打开该银行APP的登录界面,在密码框里输入:asdfgh,看到log里是可以打印出明文的字符。这样就可以获取到用户登录APP时输入的密码了。 对于用户名的获取,就更加简单了。因为用户名是一个TextView的形式,直接get text就可以获取到。
三、重打包,盗取账号和密码 最后将该银行APP进行编译重打包。然后打开APP的登录界面,输入用户名和密码,点击登录。这个时候,破解者会接收到一条请求,请求的参数就带有刚刚输入的账号和密码。这样就模拟了破解者盗取移动支付类APP登录账号和密码的全过程。
对APP进行加固保护,防止账号密码被盗取 通过以上几个简单步骤,开发者辛苦开发的APP就轻易被破解了。对破解者而言,这只是分分钟的事情,而对于开发者来说,却是无数的汗水和心血。 保护手机APP安全,避免被破解,还需要从源头着手,对APP进行加固保护,让破解者无从下手。下面使用360加固保对APP进行加固前后的对比图,加固后再对APP进行反编译,可以看到APP里的代码文件全部被隐藏,暴露的只是加固程序的少部分代码,破解者拿不到源码,也就无法再对源程序进行篡改来盗取账户密码了。 360加固保通过dex文件加密、so文件加密、数据加密、签名校验、防内存修改、完整性校验等技术手段,对手机APP进行多维度的加固保护,能有效防止应用被反编译和恶意篡改,保护应用的数据信息不会被黑客窃取。
|