AD Blocker Trial 注册算法
来源:互联网 发布:中兴和华为知乎 编辑:程序博客网 时间:2024/06/05 18:47
把以前在看雪的帖子放到这里来
【文章标题】: 【原创】AD Blocker Trial 注册算法
【下载地址】: http://as.baidu.com/a/item?docid=150568&pre=web_am_se
【操作平台】: Ubuntu11.10
【使用工具】: Apktool v1.4.3 , dex2jar-0.0.9.9, jd-gui-0.3.3
【作者邮箱】: iltgcl@163.com
【作者声明】: 仅作为研究交流使用。
【软件名称】: 英文名: AD Blocker Trial 中文名:广告拦截器及净触发器的审判。
【破解过程】
先安装程序,启动以后,点击弹出菜单Buy 选项,进入到注册界面。发现程序已经给出了我的Product Code:44173112, 输入试练码:12345678,程序弹出对话框表示出错了。
好了,基本信息搜集完了。使用dex2jar反编译,然后用jd-gui打开,太好了,代码尽然没有混淆,省了不少麻烦。虽然这个程序的算法非常简单,但我还是尽量详细的将分析过程写下来。
首先需要找到注册界面。从前面信息搜集过程中知道是在弹出菜单中点击Buy选项出现的注册界面,找到如下代码片段
由于反编译不太可能与原码一样,所以上面这段代码流程比较乱。通常这种情况需要通过smali文件来仔细分析,
不过这里你可以试着猜猜看,我反正一眼就看到了showDonateDialog() 。
我们知道,点击OK会进行注册判断,继续进入ADBlocker.3看看
哦,点击后会调用ADBlocker.access$3(...),我输入的试炼码会作为参数。比较讨厌的是access$3是什么意思呢?
当在JAVA内部类中调用外部类的私有方法时,编译器会自动合成一个静态函数。好了,使用Apktool工具反编译吧,然后打开
仅仅调用了reg函数而已。
看到这里,聪明的你一定知道RegUtil.check就是关键比较点了!只要返回true就可以了。
看后面那个check函数
paramString1 :Product Code(模拟器上就是44173112)
paramString2:试炼码
显然只要genKey函数返回值等于试炼码就可以了,注意genKey函数的参数就是ProductCode,那么来看看该函数吧
我靠,这么简单!用白话来说就是将ProductCode分成两个部分:l2 = 前4位,l3 = 后4位
试炼码应该等于(l2 + l3) * (l2 * l3)
那么对于44173112来说,注册码=((4417+3112)*(4417*3112)) = 103491405416
【文章标题】: 【原创】AD Blocker Trial 注册算法
【下载地址】: http://as.baidu.com/a/item?docid=150568&pre=web_am_se
【操作平台】: Ubuntu11.10
【使用工具】: Apktool v1.4.3 , dex2jar-0.0.9.9, jd-gui-0.3.3
【作者邮箱】: iltgcl@163.com
【作者声明】: 仅作为研究交流使用。
【软件名称】: 英文名: AD Blocker Trial 中文名:广告拦截器及净触发器的审判。
【破解过程】
先安装程序,启动以后,点击弹出菜单Buy 选项,进入到注册界面。发现程序已经给出了我的Product Code:44173112, 输入试练码:12345678,程序弹出对话框表示出错了。
好了,基本信息搜集完了。使用dex2jar反编译,然后用jd-gui打开,太好了,代码尽然没有混淆,省了不少麻烦。虽然这个程序的算法非常简单,但我还是尽量详细的将分析过程写下来。
首先需要找到注册界面。从前面信息搜集过程中知道是在弹出菜单中点击Buy选项出现的注册界面,找到如下代码片段
代码:
public boolean onOptionsItemSelected(MenuItem paramMenuItem) { int i = 1; switch (paramMenuItem.getItemId()) { default: i = 0; case 1: case 0: case 2: case 3: case 4: } while (true) { return i; showAbout(); continue; showHelp(); continue; Intent localIntent = new Intent(); localIntent.setClass(this, ProtectorPreferencesActivity.class); startActivity(localIntent); continue; showDonateDialog(); continue; startActivity(new Intent("android.intent.action.VIEW", Uri.parse("market://search?q=\"SmartDog Studio\""))); } }
不过这里你可以试着猜猜看,我反正一眼就看到了showDonateDialog() 。
代码:
private void showDonateDialog() { View localView = LayoutInflater.from(this).inflate(2130903043, null); EditText localEditText = (EditText)localView.findViewById(2131296263); ((TextView)localView.findViewById(2131296262)).setText(RegUtil.getProdCode(this)); ((TextView)localView.findViewById(2131296264)).setText(ContentUtil.getDonateGuide(this)); new AlertDialog.Builder(this).setTitle(Html.fromHtml("<b>" + getText(2131165207) + "</b>")).setView(localView).setPositiveButton("OK", new ADBlocker.3(this, localEditText)).setNeutralButton("Buy", new ADBlocker.4(this)).setNegativeButton("Cancel", null).show(); }
代码:
class ADBlocker$3 implements DialogInterface.OnClickListener{ public void onClick(DialogInterface paramDialogInterface, int paramInt) { if (this.val$key.getText() != null) ADBlocker.access$3(this.this$0, this.this$0, this.val$key.getText().toString()); }}
当在JAVA内部类中调用外部类的私有方法时,编译器会自动合成一个静态函数。好了,使用Apktool工具反编译吧,然后打开
代码:
.method static synthetic access$3(Lnet/xdevelop/adblocker_t/ADBlocker;Landroid/content/Context;Ljava/lang/String;)V .locals 0 .parameter .parameter .parameter .prologue .line 476 invoke-direct {p0, p1, p2}, Lnet/xdevelop/adblocker_t/ADBlocker;->reg(Landroid/content/Context;Ljava/lang/String;)V return-void.end method
代码:
private final void reg(Context paramContext, String paramString) { if (RegUtil.check(paramContext, paramString)) { ProtectorPrefModel localProtectorPrefModel = ProtectorPreferences.getPref(this); localProtectorPrefModel.donated = true; ProtectorPreferences.savePref(this, localProtectorPrefModel); showMsg(getText(2131165201).toString(), getText(2131165203).toString()); } while (true) { return; showMsg(getText(2131165202).toString(), getText(2131165204).toString()); } }
代码:
public static boolean check(Context paramContext, String paramString) { return check(getProdCode(getLocalPhone(paramContext)), paramString); }private static boolean check(String paramString1, String paramString2) { int i = 0; if ((paramString1 == null) || (paramString2 == null)); while (true) { return i; try { boolean bool = genKey(paramString1).equals(paramString2); if (!bool) continue; i = 1; } catch (Exception localException) { } } }
paramString1 :Product Code(模拟器上就是44173112)
paramString2:试炼码
显然只要genKey函数返回值等于试炼码就可以了,注意genKey函数的参数就是ProductCode,那么来看看该函数吧
代码:
private static String genKey(String paramString) { long l1 = Long.parseLong(paramString); long l2 = l1 / 10000L; long l3 = l1 - 10000L * l2; return Long.toString((l2 + l3) * (l2 * l3)); }
试炼码应该等于(l2 + l3) * (l2 * l3)
那么对于44173112来说,注册码=((4417+3112)*(4417*3112)) = 103491405416
- AD Blocker Trial 注册算法
- AD Blocker Trial 注册算法
- MyEclipse Trial Expired,手动注册MyEclipse
- DVB-AD 注册
- MyEclipse 8.5 注册--取消MyEclipse Trial Expired解决办法(转)
- MyEclipse 8.5 注册--取消MyEclipse Trial Expired解决办法
- MyEclipse 8.5 注册--取消MyEclipse Trial Expired解决办法
- Mobiscroll脚本破解,去除Trial和注册时间限制
- Mobiscroll脚本破解,去除Trial和注册时间限制
- MyEclipse 8.5 注册--取消MyEclipse Trial Expired解决办法
- Mobiscroll脚本破解,去除Trial和注册时间限制
- blocker.exe
- 【转】 AD采集滤波算法
- Potential blocker issue!
- The potential blocker again.
- build-blocker-plugin
- Trial run
- MYECLIPSE TRIAL
- Android ScrollView的使用
- 关于全局变量被修改以及volatile的用法
- ARM处理器模式切换(含MRS,MSR指令)
- html5笔记(1)概述
- 『Android』activity的生命周期
- AD Blocker Trial 注册算法
- imageNamed和dataWithContentsOfFile的区别
- C++接口与实现分离(转
- XE2 和D7 的对比:
- 对微信PHPdemo的分析
- 项目三 按总成绩输出
- 求整数数组中和最大的子数组的3种方法
- JVM监控工具介绍
- linux学习入门2——linux文件系統基本结构(linuxcast.net)(倒转树状结构、命名机制、查看文件类型)