本帖最后由 风绕柳絮轻敲雪 于 2019-12-9 12:14 编辑
1.直接签名安装,出现了如图所示的盗版提示
2.尝试在字符串中搜索该盗版提示,找到一个,复制其ID
3.DEX++编辑器里搜索该ID,找到其引用的地方,有两处(第三个在R类中,自动排除
4.分别点进去,都是调用了j这个方法来判断,为true也就是1就执行盗版提示
[Java] 纯文本查看 复制代码
public static void a(@NonNull Context context) {
if (g.j()) {
Toast.makeText(context, context.getResources().getString(R.string.a_msg_pirate_app_prompt), 1).show();
}
}
5.跳转到j这个方法,修改如下,全都返回为零就行了,当然如果你有闲心你也可以关注一下b这个变量,它的值最终来源于scannercs这个so文件里的initEngine,进去看了一哈,原来是签名验证在so上,不过这里貌似不影响使用,就不用关注它了
[Java] 纯文本查看 复制代码 public static boolean j() {
return (b == 0 || b == -3) ? false : true;
}
修改如下
[Java] 纯文本查看 复制代码
sget v0, Lcom/intsig/camscanner/b/g;->b:I
if-eqz v0, :cond_b
sget v0, Lcom/intsig/camscanner/b/g;->b:I
const/4 v1, -0x3
if-eq v0, v1, :cond_b
const/4 v0, 0x0
return v0
:cond_b
const/4 v0, 0x0
return v0
6.点击升级按钮,它会跳转到升级到高级账户这个页面,我们依旧搜这个字符串
7.重复步骤二步骤三,找到几处引用的地方,主要看最后一处,看一下代码,最终是返回一个字符串对象
[Java] 纯文本查看 复制代码
private static String a(Context context) {
if (!u.d()) {
return context.getResources().getString(R.string.a_label_upgrade_to_premium);
}
if (u.f()) {
return context.getResources().getString(R.string.a_super_vip_desc);
}
return context.getResources().getString(R.string.a_label_premium_description);
}
8.看一下f方法的代码,其实修改这个条件就够了,因为他要满足第一个
f方法
[Java] 纯文本查看 复制代码
public static boolean f() {
if (!d()) {
return false;
}
Object obj = 1 == w.g() ? 1 : null;
long h = w.h();
Calendar instance = Calendar.getInstance();
instance.set(2100, 1, 1);
long timeInMillis = instance.getTimeInMillis() / 1000;
if (obj == null || h <= timeInMillis) { // w.g()为1或者h大于4102416000就为true
return false;
}
return true;
}
9.跳转到d看看,出现了两种状况,去e看看,emmm,继续跳到f看看,f这代码有点熟悉,继续跳到b看看,再看看h方法
d方法
[Java] 纯文本查看 复制代码
public static boolean d() {
if (e() || 1 == w.g()) {
return true;
}
return false;
}
g方法
[Java] 纯文本查看 复制代码
public static long g() {
return y.a().b("qp3sdjd79xhdas02sd", 2);
}
e方法
[Java] 纯文本查看 复制代码
public static boolean e() {
return 0 == w.f();
}
f方法
[Java] 纯文本查看 复制代码
public static long f() {
return y.a().b("tafdseddfeasfeafaewf", -1);
}
h方法
[Java] 纯文本查看 复制代码
public static long h() {
return y.a().b("tkreds3sdvv22ccsx3xd3", 0);
}
b方法
[Java] 纯文本查看 复制代码
public final long b(String str, long j) {
e();
return this.b.getLong(str, j);
}
10.这里区别开来和不区别开来也行,这样改满足了两个条件了,改的时候其实满足一个就行了,最后一个超级会员满不满足都行了,反正就是图个好看
[Java] 纯文本查看 复制代码
public final long b(String str, long j) {
if(str.equals("afdseddfeasfeafaewf"){
return 0;
}
if(str.equals("qp3sdjd79xhdas02sd"){
return 1;
}
else{
e();
return this.b.getLong(str, j);
}
}
修改如下
[Java] 纯文本查看 复制代码
invoke-direct {p0}, Lcom/intsig/utils/y;->e()V
.line 166
iget-object v0, p0, Lcom/intsig/utils/y;->b:Landroid/content/SharedPreferences;
invoke-interface {v0, p1, p2, p3}, Landroid/content/SharedPreferences;->getLong(Ljava/lang/String;J)J
move-result-wide p1
const-wide/16 p1, 0x1 //这里改为0或1都行,0就是高级会员,1就是超级会员
return-wide p1
11.打包安装完事,当然某些联网功能是无效的,所以说是本地破解,仅限娱乐,没测试破解功能,自己动手自己去测试吧
由于论坛规定,所以不提供成品....... |