BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #32553同步于 2011/6/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

Android大揭“秘”

ColdZenLeft
2011/6/22镜像同步12 回复
PS一个先:其实这个题目取得有点诡异,想不到更好的说法了,就姑且吧。这个...因为偶然忘了360手机卫士的登录密码,让我想到了这个蛋痛的XX调研,其实这个没有什么技术含量,北邮大神们轻拍哈。而且,现在DNF出70了,我每天忙着练级,实验室项目也是无形地压在心头,所以就只能看那么几个了,表示无能为力了。 准备的条件:你的Android手机可以ROOT,我是Android 2.2的,反正手机拿了个Z4临时性地ROOT了 目的: 1、针对手机客户端,例如聊天的,一般都有存储密码的功能,我的目标就是将密码原文提取出来。 2、针对手机安全软件,这里指的如360、网秦等含有私密空间功能的,目标就是乱输入密码可以进入。 意义: 其实说不清楚,有的同学说这个没有意思,或许吧。不过我在想如果你的手机不小心丢了,又可以被人ROOT(蛮有可能的),或者是有人趁你中午睡觉把你手机里面的数据XX一下抑或是什么。总之,密码存在手机客户端可以被人搞出明文,或者说隐私空间不再是秘密的时候,并不是一件好事,也希望大家重视一下。 大致方法: 手机应用的数据一般都是存到什么/data/data/<PackageName>/下面的,存储之后的密码帐号也是某种形式保存到下面的。不过应用有的存了密码之后就直接登录了,我们如果想搞到密码,关键就是靠应用自己“说”出来。所以ROOT就是这个目的,替换两个文件,一是应用的原始文件,一般非系统存到/data/appa/下的,一个是ODEX文件,存到/data/dalvik-cache下面,ODEX文件可以由自己改造的APK在模拟器里面生成出来,或者是用手机/system/目录下JAR生成,不过我推荐用模拟器生成,应为两个文件都必须同时替换。 我还是说下有同学一直认为我是改装了APK骗别人装,不是这样的,没人会上当的,我是说不管你是不是官方签名的,在手机里面其实不重要,就是安装的时候比较重要。所以自签名就够了,主要是搞到异构的ODEX文件和异构的APK 具体内容: 1、 对象版本:对象版本:QQ2011(Android) BETA1 Build0037 目标效果:QQ登录的时候,或者说将原本存在手机中的密码显示出来 总结:这不是最最新的版本了,毕竟发帖前2周搞的,不过新版本也有这毛病。QQ电脑客户端想搞出原密码是很难的,手机端上真是有点放水啊,着实想不到。不过QQ也有做得很好的就是,即使是将/data/data/com.tencent.qq目录下数据完全复制,也不能借此登录,这点还是保留了电脑上的风格。 2、 对象版本:360手机卫士 V1.9.6.1121 目标效果:不输入密码或者输入任意密码进入其手机卫士和隐私空间 总结:好像也升级了,不管了,新版不了解。不过360这个做得,貌似有点水啊,远不如PC强,ROOT权限也是白给它了。 3、 对象版本:飞信3.0.1 目标效果:飞信我是CMNET登录,WAP地那个不能搞到密码,大家都懂。 总结:和QQ差不多,不过貌似/data/目录下的复制过来可以直接登录。 4、 对象版本:网秦通讯管家4.0.00.08 目标效果:乱输入密码直接进入(无图示) 总结:网秦这个明显比360难,主要是网秦有不同的密码进入不同隐私空间,这点很恶心,我只是简单的破解到进入最后一个隐私空间,不同的密码有个列表匹配,估计花些时间可以让它把所有隐私空间的密码全部一个一个的显示出来,修改大致如下: private boolean a(String paramString) { int i = 0; Cursor localCursor = n.d(); if (localCursor != null) { while (localCursor.moveToNext()) { int j = localCursor.getColumnIndex("password"); //这个地方是匹配计算密码的,如果不一样,就继续,因为隐私空间可能不只是一个 if (!localCursor.getString(j).equals(paramString)) continue; //破解的办法,最有效果的就是,注释掉它。 i = 1; a locala = ca.k(this.a); int k = localCursor.getColumnIndex("_id"); long l = localCursor.getLong(k); locala.b(l); } localCursor.close(); } return i; } SMALI中修改: move-result v2 invoke-interface {v1, v2}, Landroid/database/Cursor;->getString(I)Ljava/lang/String; move-result-object v2 invoke-virtual {v2, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v2 ####可能是匹配密码的地方 # if-eqz v2, :cond_7 #### 网秦这个真有创意啊,感觉是包了小三的人士专用的 - -#(见熟人说隐私A空间,自己用隐私B空间,你懂的) 5、 对象版本:阿里旺旺 V1.2.3 目标效果:搞出存在手机中的登录密码 总结:阿里旺旺绝对是目前看到的做得非常好的了,它应该是做得最接近PC那种,除了登录时候可以显示密码以外。存的密码是假存的,真是情况是在NDK中进行处理。它里面有个大型SO,有相关密码方面的处理部分,我简单的逆向了下: int __cdecl IAIM_LoginEx(char, int, char, char *src) 这里的src是存密码的指针,来源于nLoginEx函数参数2,这里会先对登录进行一次注销(IAIM_Logout),然后判断传入的密码是不是空,当然我这里不是第一次截获为空: .text:00015CAE CMP R3, #0 .text:00015CB0 BEQ loc_15CC2 .text:00015CC2 loc_15CC2 ; CODE XREF: IAIM_LoginEx+2Cj .text:00015CC2 LDR R3, [SP,#0x50+var_1C] .text:00015CC4 LDR R2, [R3] .text:00015CC6 LDR R3, [SP,#0x50+s] .text:00015CC8 MOVS R0, R2 .text:00015CCA MOVS R1, R3 .text:00015CCC BL IAccountModel_findHistoryAcnt 然后在IAccountModel_findHistoryAcnt的调用中,涉及到从原始的数据中读东西,老实说所谓的原始参数没有去验证,能力不足,加上NDK的SO调试可能有些麻烦。因为Windows的DLL调试我们有个Loader.exe来加载,NDK的SO调试目前还真的没有找到一个合适的办法,纠结啊。好吧继续说明。 这个函数的作用就是比较的帐号,如果说帐号是以前的,那么就是使用IAccount_dup函数,这里IAccount_dup函数调用的数据有: IAccount_dup -> IAccount_SetNameType(应该是登陆类型) -> IAccount_SetPwd(原始密码吧?) -> IAccount_SetToken -> IAccount_SetPhoneNum 这里就是初始化之前的数据,将其全部赋值应该是,其中最为关注的应该就是IAccount_SetPwd,然后里面有个申请内存复制数据的一步: MOVS R0, R1 ; dest MOVS R1, R2 ; src MOVS R2, R3 ; n BLX memcpy 不过遗憾的是,这个最有可能是拷贝密码的地方最后发现居然丫的没有执行到这里来,晕。。。能力有限,搞不定啊,不过看来人家是专门防了这个搞密码的,不愧是商业平台的啊。阿里旺旺相当出色!!! 6、 对象版本:新浪微博Android手机客户端 V2.4.1 破解目标:从保存密码的帐号中获得密码 总结:卧槽,密码明文存在安装目录配置文件下的,貌似有点凶残啊,都不用花什么力气了。 对了,容我吐槽两句:尼玛C程序员伤不起啊,新浪微博你实习笔试4道都是JAVA题啊,我想洗点啊,有木有!学C和汇编的上辈子都是折了翅膀的天使,找不到工作和实习真TM活该啊,我真后悔啊! 7、 对象版本:人人网Android手机客户端 V3.0.2 破解目标:将存储的密码从手机中找出来,不过人人包括密码和登录帐号,事实上应该破解两个数据(无图片) 我直接打了个LOG,用LOGCAT看,人人做得还很好: invoke-direct {v0, p0}, Lru;-><init>(Lcom/renren/mobile/android/ui/Desktop;)V sget-object v1, LmJ;->c:Ljava/lang/String; sget-object v2, LmJ;->d:Ljava/lang/String; invoke-static {v1, v2, p0, v0}, LjC;->a(Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;Leq;)V ########测试显示帐号和密码 const-string v3, "ACCOUNT:" invoke-static {v3, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I const-string v3, "PASSWORD:" invoke-static {v3, v2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I ########结束 return-void .end method 输出结果: W/ACCOUNT:( 273): coldzenleft@163.com W/PASSWORD:( 273): ec83bc2c482ad83b92b7a3fe305e894a 这个,人人在存账户的时候,直接把密码整成MD5了,MD5这个我估计就算有办法,也比明文难吧?不过值得一提的是,如果你能搞到这个MD5,在登录的时候直接修改APK固定MD5,你随便输入什么密码都可以进(有点废话了),反正密码明文除了第一次登录可以搞到后期不行,相比我连阿里旺旺HASH都不知道是什么还是稍微好点 8、 对象版本:MSN V6.5.0 目标效果:搞出存在手机中的登录密码 总结:和QQ、飞信那类差不多吧,没什么好说的。 PS:其实客户端和安全软件还有很多很多,一个人精力有限啊,而且这个最近DNF很让人分心。在IM中人人和阿里旺旺做得真的很好,特别是阿里旺旺。虽然说密码存到手机中,丢了你可以改嘛,但是有时候你周围的人,还是不好说,反正密码存到手机里面可以被A出来应该不是一件好事,希望大家能有所重视。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
houlen机器人#1 · 2011/6/23
最近信安,牛人不少,好文不断啊 !
ColdZenLeft机器人#2 · 2011/6/23
【 在 houlen 的大作中提到: 】 : 最近信安,牛人不少,好文不断啊 ! : -- 这个很水的,看起来唬人罢了,找不到工作的人飘啊... 不过这事想来唯一让我觉得欣慰的就是,被新浪微博笔试(鄙视)这口恶气终于出了...然后调节心态继续找工作吧
houlen机器人#3 · 2011/6/23
【 在 ColdZenLeft 的大作中提到: 】 : : 最近信安,牛人不少,好文不断啊 ! : : -- : 这个很水的,看起来唬人罢了,找不到工作的人飘啊... : ................... 大牛说这话就谦虚了,大牛成名已久。。。 话说,怎么要转行做web了啊?
charnugagoo机器人#4 · 2011/6/23
厉害
o101机器人#5 · 2011/6/23
llssw机器人#6 · 2011/6/23
厉害啊
llssw机器人#7 · 2011/6/23
赞一个
oloyd机器人#8 · 2011/6/23
牛叉啊
mcone机器人#9 · 2011/6/29
哇!大牛啊!菜鸟低空飘过……留下羡慕溜走~~