本帖最后由 ttegame 于 2021-04-18 20:42 编辑
闲时随便找了几款视频软件,谷歌上面发现了几种,比如整点视频,南瓜影视、冬瓜影视、加菲猫影视、大象等等,随便挑了一款大象视频,发现有网络校验,不过防护强度比较弱,会点Java基本上都能黑掉保护。
准备工具 1、jadx 1.2.0 2、uiautomatorviewer
软件样品为当前最新版1.6.7,原版有3六0加固,过掉这个的软件很多,不再推荐了。过3六0后脱dex备用。

先看一下过壳后的情况,即便是hook掉原apk仍然提示版本太低。

我原先看了一遍so,没有熟悉的关键字,应该不太可能校验了签名值,像这类视频APP也不是什么大公司的软件,所以应该也没有太复杂的保护逻辑。如果不是校验的签名值,那就是校验了整个apk。通过界面观察到,背景的推荐是正常运行的,而前面的提示挡在前面,无法点击。所以我的思路是先尝试把这个提示窗口给关掉,看看能不能正常运行。

如上图,用uiautomatorviewer抓取界面后找到布局ID,可以得到helloText,那么这个helloText就是弹出盗版的窗口。把脱出来的dex丢进jadx,一搜索helloText就直达老巢了,位于Lcom/pan/onekey/light/ui/activity/MainActivity$d; 。smali要搜索helloText:I。 它的Java代码如下:
public final void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
Intrinsics.checkParameterIsNotNull(methodCall, "methodCall");
Intrinsics.checkParameterIsNotNull(result, "result");
String str = methodCall.method;
if (str != null) {
int hashCode = str.hashCode();
if (hashCode != -1263203643) {
if (hashCode != 3367) {
if (hashCode != 104585) {
if (hashCode == 94426513 && str.equals("cc100")) {
FrameLayout frameLayout = (FrameLayout) this.a.b(R.id.helloText2);
Intrinsics.checkExpressionValueIsNotNull(frameLayout, "helloText2");
frameLayout.setVisibility(0);
FrameLayout frameLayout2 = (FrameLayout) this.a.b(R.id.helloText);
Intrinsics.checkExpressionValueIsNotNull(frameLayout2, "helloText");
frameLayout2.setVisibility(0);
((FrameLayout) this.a.b(R.id.helloText2)).setOnTouchListener(AnonymousClass1.a);
return;
}
} else if (str.equals("iss")) {
if (methodCall.arguments != null) {
String str2 = this.a.getPackageCodePath() + ' ' + com.pan.onekey.light.app.b.a.b();
MethodChannel x = this.a.x();
if (x != null) {
x.invokeMethod("home", String.valueOf(str2));
}
com.pan.onekey.light.app.b.a.a((String) methodCall.argument("iss"), new MainActivity$initData$1$2(this));
return;
}
return;
}
} else if (str.equals("ip")) {
if (methodCall.arguments != null) {
String str3 = (String) methodCall.argument("ip");
cn.junechiu.junecore.c.g.a("ip:: " + str3);
com.pan.onekey.light.app.b.a.b(String.valueOf(str3));
return;
}
return;
}
} else if (str.equals("openUrl")) {
if (methodCall.arguments != null) {
Uri parse = Uri.parse(String.valueOf((String) methodCall.argument("gourl")));
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setData(parse);
this.a.startActivity(intent);
return;
}
return;
}
}
result.notImplemented();
}
}
开头有个hashCode,就是哈希值,字符串哈希值。后面的android.intent.action.VIEW,点击官网更新后会打开下载url,url就是链接,gourl跳转到链接。getPackageCodePath()就是返回一个安装包的完整信息,比如代码和一些资源文件。helloText就是布局id,弹出盗版提示的时候就调用这里的代码,并且覆盖在主界面,无法关闭。
所以问题就出在94426513(0x5a0d591)这里,也就是if (hashCode == 94426513 && str.equals("cc100"))。改法也很简单,回到smali视图,看到下图的黄线处,直接把它的判断删掉即可。

改好后回填测试,需要先卸载旧版,因为缓存已经有盗版链接了。

成功!
PS:当前我的思路是屏蔽窗口,如果你想要骗过服务器的话也不是不可以。从上面的代码可以知道正确的字符串是iss,cc100则会弹出盗版窗口。那么需要分析来源,iss是怎么来的,cc100又是怎么来的。从源头入手才能骗过服务器。
|