本帖最后由 世事繁华皆成空 于 2015-5-12 14:50 编辑
原创:世事繁华皆成空
工具:ddms,apkide,海马玩模拟器
软件地址:http://apk.r1.market.hiapk.com/d ... ojectgps_051308.apk
有朋友反馈,地图无法显示,我估摸着是不是key校验的问题,找到manifest文件下发现使用的是腾讯的地图,自己跑到腾讯地图api下,自己也申请了一个key
发现这个key跟包名,签名并没有联系,那估计就是软件自身的设置或者其它问题了
顺带着也研究了新的一种破法,当然算法我就不告诉大家了,自己研究,主要讲方法,安装软件,打开
我们点击注册,
我们估计软件大概采用了硬件码再加密算号生成,我们任意输入一个错误的注册码
我们apkide反编译后搜索“注册码错误”
[Java] 纯文本查看 复制代码 public void onClick(View paramView)
{
if (this.val$regEditText.getText().toString().trim().toUpperCase().equals(Algorithm.info(DisplayActivity.access$100(this.this$0))))
{
DisplayActivity.access$101(this.this$0, 1);
paramView = new ContentValues();
paramView.put("key", this.val$regEditText.getText().toString().trim().toUpperCase());
paramView.put("period", "0");
paramView.put("remark", "58E52C1E37311A4D5857");
DisplayActivity.access$68(this.this$0).update("configure", paramView, null, null);
this.val$popSign.dismiss();
new AlertDialog.Builder(this.this$0).setIcon(2130837615).setTitle("����").setMessage("��������������������").setPositiveButton("����", null).show();
return;
}
new AlertDialog.Builder(this.this$0).setIcon(2130837651).setTitle("����").setMessage("������������������������").setPositiveButton("����", null).show();
}
我们看到,当this.val$regEditText.getText().toString().trim().toUpperCase().equals(Algorithm.info(DisplayActivity.access$100(this.this$0)))相等后会来到成功条件下,我们来到Algorithm.info方法下
我们看到了软件调用了MD5的加密方法,而且调用了很多次
[Java] 纯文本查看 复制代码 public static String info(String paramString)
{
return MD5_16(new StringBuilder(String.valueOf(MD5_32(MD5_16(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(MD5_16(new StringBuilder(String.valueOf(paramString)).append("gps").toString()).substring(3))).append("871006").toString()).substring(3))).append("sqs").toString()).substring(3)).substring(2, 15))).append("pk").toString()) + MD5_32(new StringBuilder(String.valueOf(MD5_32(MD5_16(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(paramString)).append("gps").toString()).substring(3))).append("880612").toString()).substring(3))).append("zzj").toString()).substring(3)).substring(2, 15))).append("zj").toString()).substring(2, 6);
}
既然该方法会返回一个string类型的数据,不如我们就查看一下数据是什么,通常在软件开发的时候会经常试用ddms的logcat查看软件方法的调用,这个地方我也利用ddms打印log
[Java] 纯文本查看 复制代码 move-result-object v0
const-string v1, "TAG"
invoke-static {v1,v0} ,Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
smail代码下,最后将加密后的string类型的数据存放到v0中,我添加一个标记符“TAG”,然后打印出来,包装完成后回编译,
如何试用ddms,需要安装sdk环境,如果没有的请下载一个sdkmanager或者eclipse,然后打开后安装必要的组件,如下图
打开tool目录下的monitor,会成功打开ddms,然后再运行模拟器,切记打开之后再运行模拟器,再logcat下新建一个
上方的filter name随意,下方建议选择包名,之后就可以模拟器运行软件了
运行后成功在logcat中生成一个字符串,
看似像注册码一样,我们试试
点击注册
算法已经在上面出现过了,大家自己研究下md5加密,我就不解释了,只要硬件码不变,大家就可以试用带log的软件生成注册码后,再安装原版apk,输入注册码,无需破坏软件签名,直接注册成功了
教程结束,@淡然出尘 @Hmily
|