使用工具
1、IDA32
2、AS
3、反编译工具,MT管理器
本来只写了熊猫看书,但准备发表的时候感觉只有一种软件帖子篇幅太小了,就找了另外两款没有加固的软件充数,所以一共有3款软件,分别是熊猫、纵横、番茄。MOD软件之前要先去掉自带的保护,广告的话都是常见的穿山甲、腾讯、百度等,这类的教程发太多了,可以自己找一下论坛。
禁止转载本帖内容
,一些博客怎么老喜欢转我的帖子,最主要的是还分类在原创标签到处引流。
一、熊猫看书9.4.1.01
跟下载评论一样,差不多是个流氓软件了。我刚安装,想点击开屏广告的跳过按钮,点几次都点不到,结果打开京东购物APP。
主要是那个按钮过小,而且太靠近顶端,容易和状态栏冲突,点错就会打开购物软件了。换了另一部手机,状态栏比较高,就容易点。
这软件我用mt管理器一键hook失败,那就不用hook了,来看一下怎么回事。
还是老生常谈的
>signatures
,dex内直接搜索这个代码,有很多个结果,一些广告三方sdk就不要理了。
反编译后查看AndroidManifest,入口名是android:name="com.baidu.shucheng91.Application",定位到结果com/baidu/shucheng91/util/g。
[Java] 纯文本查看 复制代码package com.baidu.shucheng91.util;
import android.content.Context;
/* compiled from: CheckUtil */
public class g {
public static byte[] a = {-26, -126, -88, -27, -82, -119, -24, -93, -123, -26, -104, -81, -25, -101, -105, -25, -119, -120, -27, -70, -108, -25, -108, -88, -17, -68, -116, -24, -81, -73, -27, -82, -119, -24, -93, -123, -27, -82, -104, -26, -106, -71, -25, -119, -120, -26, -100, -84};
public static int b = 1654413599;
public static int a(Context context) {
try {
return context.getPackageManager().getPackageInfo(context.getPackageName(), 64).signatures[0].hashCode();
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}
其原理就是获取签名的哈希值,然后对比b,如果不一致就弹出a提示。b的值smali代码已经给出,直接写死就可以了。我本以为这样就完成了,结果安装后还是弹出盗版提示。
回到smali代码,有一句sput-object v0, Lcom/baidu/shucheng91/util/g;->a:[B,dex继续搜索Lcom/baidu/shucheng91/util/g;->a:[B,主要关注sget-object,这些成员变量都是比较好分析的。定位到com/baidu/shucheng/ui/main/MainActivity$l,然后查找是哪个地方调用了这里。
1.png (66.44 KB, 下载次数: 0)
下载附件
2022-7-20 18:15 上传
部分代码如下:
[Java] 纯文本查看 复制代码 invoke-static {v0}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J
move-result-wide v0
sput-wide v0, Lcom/baidu/shucheng/ui/main/MainActivity;->K:J
const-wide/32 v3, 0xa6d833
sub-long/2addr v0, v3
.line 40
sput-wide v0, Lcom/baidu/shucheng/ui/main/MainActivity;->K:J
:cond_6
const-string v0, "classes.dex"
.line 41
invoke-virtual {v6, v0}, Ljava/util/zip/ZipFile;->getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
move-result-object v0
.line 42
invoke-virtual {v0}, Ljava/util/zip/ZipEntry;->getCrc()J
move-result-wide v0
sget-wide v3, Lcom/baidu/shucheng/ui/main/MainActivity;->K:J
cmp-long v5, v0, v3
if-eqz v5, :cond_7
.line 43
new-instance v0, Landroid/os/Handler;
invoke-static {}, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;
move-result-object v1
invoke-direct {v0, v1}, Landroid/os/Handler;->(Landroid/os/Looper;)V
new-instance v1, Lcom/baidu/shucheng/ui/main/MainActivity$l;
invoke-direct {v1, p0}, Lcom/baidu/shucheng/ui/main/MainActivity$l;->(Lcom/baidu/shucheng/ui/main/MainActivity;)V
invoke-virtual {v0, v1}, Landroid/os/Handler;->post(Ljava/lang/Runnable;)Z
这里读取了压缩包内的classes.dex值,用来判断(
cmp-long v5, v0, v3
)是否被修改过。目的就是防止你hook或者修改了dex代码。所以先把第一个dex拉出来备份,用一键过签,再把第一个dex放回去,hook才会成功。原判断if-eqz,改成if-nez即可绕过检测。
二、纵横小说
直接签名后安装卡死闪退,还是直接搜索>signatures,发现是校验签名哈希值。
1.jpg (86.69 KB, 下载次数: 1)
下载附件
2022-7-20 18:39 上传
现在MT管理器支持查看哈希值,方便许多。直接把哈希值写死就可以解决卡屏问题了。
2.jpg (84.24 KB, 下载次数: 0)
下载附件
2022-7-20 18:40 上传
三、番茄小说5.3.9.32
1.jpg (133.11 KB, 下载次数: 0)
下载附件
2022-7-20 18:47 上传
直接重签名后提示盗版,同样hook无效。ida加载libmetasec_ml,修改如下图的跳转,BEQ改成
BNE
指令(静态地址227e0)。
1.jpg (124.88 KB, 下载次数: 0)
下载附件
2022-7-20 19:08 上传
再编写一个Java,代码可自行思考:
import android.content.Context;
import java.io.File;
public class y {
public static void a(Context context) {
File xml = new File("data/data/com.dragon.read/shared_prefs", "applog_stats.xml");
if(xml.exists()) {
xml.delete();
}
}
}
可以得到smali:
.class public Ly;
.super Ljava/lang/Object;
.source "y.java"
# direct methods
.method public constructor ()V
.registers 1
.prologue
.line 4
invoke-direct {p0}, Ljava/lang/Object;->()V
return-void
.end method
.method public static a(Landroid/content/Context;)V
.registers 4
.param p0, "context" # Landroid/content/Context;
.prologue
.line 7
new-instance v0, Ljava/io/File;
const-string v1, "data/data/com.dragon.read/shared_prefs"
const-string v2, "applog_stats.xml"
invoke-direct {v0, v1, v2}, Ljava/io/File;->(Ljava/lang/String;Ljava/lang/String;)V
.line 8
.local v0, "xml":Ljava/io/File;
invoke-virtual {v0}, Ljava/io/File;->exists()Z
move-result v1
if-eqz v1, :cond_12
.line 9
invoke-virtual {v0}, Ljava/io/File;->delete()Z
.line 11
:cond_12
return-void
.end method
利用MT管理器快速添加到一个dex,然后在入口处(
com.dragon.read.app.MainApplication
)和阅读界面(
com.dragon.read.reader.ReaderActivity
)调用这个代码。
[Java] 纯文本查看 复制代码invoke-static {p0}, Ly;->a(Landroid/content/Context;)V
.method public onCreate(Landroid/os/Bundle;)V
.registers 13
.prologue
invoke-static {p0}, Ly;->a(Landroid/content/Context;)V
const/4 v0, 0x1
const-string v1, "com.dragon.read.reader.ReaderActivity"
const-string v2, "onCreate"
invoke-static {v1, v2, v0}, Lcom/bytedance/apm/agent/v2/instrumentation/ActivityAgent;->onTrace(Ljava/lang/String;Ljava/lang/String;Z)V
new-array v3, v0, [Ljava/lang/Object;
.method public attachBaseContext(Landroid/content/Context;)V
.registers 4
invoke-static {p0}, Ly;->a(Landroid/content/Context;)V
const-string v0, "attachBaseContext"
const/4 v1, 0x1
invoke-static {v0, v1}, Lcom/bytedance/apm/agent/v2/instrumentation/AppAgent;->onTrace(Ljava/lang/String;Z)V
invoke-super {p0, p1}, Lcom/dragon/read/app/AbsApplication;->attachBaseContext(Landroid/content/Context;)V
const/4 p1, 0x0
invoke-static {v0, p1}, Lcom/bytedance/apm/agent/v2/instrumentation/AppAgent;->onTrace(Ljava/lang/String;Z)V
return-void
.end method
主要目的是干扰APP获取设备信息,覆盖安装后就不会提示盗版了,如果你觉得删除太频繁的话可以自己写个定时的,每隔多少天删一次,这里我就不示范了。
但还有个问题是福利和搜索不能用,实际上这里是官方验证签名信息,把签名值对比结果写到dex里面就可以正常使用搜索和福利功能,在哪我不说了,为了那几个金币没必要,想省事可以挂个hook。如果不去掉这个验证,后面是否会出现盗版信息我也不清楚,毕竟这两个软件都是临时增加的。