本帖最后由 zpp0196 于 2019-7-4 12:04 编辑

2019.7.4 补充:

本来这个帖子是申请账号写的,申请到之后一段时间后没登给我收回去了,然后一年半过去了,我又看到了这篇帖子,发现前天还有人回复(好感动),于是我抱着死马当活马医的心态又尝试登了一下账号,结果登上了,在这里说明一下,回复我不一定看,评论区留给你们自己讨论吧

以下是原文:

不知道从哪个版本开始抖音加入了 Xposed 检测,但是这个检测并不影响 APP 的使用,只是简单的用 Toast 提示(但是每次进去看着也很不舒服),如果没有安装 Xposed 自然不会有任何的提示,那既然他是检测 Xposed 的,那我就用 Xposed 解决他,下面是分析思路:

用到的工具:

apk:抖音短视频_v1.6.8.apk

IDE:Android Studio 3.0

反编译工具:Android killer 1.3.1.0、MT 管理器 2.4.4(需要 VIP)

1. 首先先看一下 hook 前的原图:

S80107-144804.jpg (53.36 KB, 下载次数: 1)

2018-1-8 17:41 上传

2. 找关键字:

以 Xposed 为关键字(突破点)在工程(抖音短视频_v1.6.8.apk)中搜索,最后确定最有嫌疑的位置为:classes2/com.ss.android.ugc.aweme.app.i.smali

TIM截图20180107150502.jpg (29.37 KB, 下载次数: 1)

2018-1-8 17:41 上传

3. 分析代码:

smali 源码不好分析所以我转换成 Java 代码分析:

转换完可以看到 com.ss.android.ugc.aweme.app.i 这个类中有 4 个boolean 返回值的方法:

private static boolean a()*

public static boolean a(Context paramContext)

private static boolean b()*

private static boolean b(Context paramContext)*

其中带 * 号的方法里面可以搜到 Xposed 关键字:

private static boolean a():

TIM截图20180107151650.jpg (7.32 KB, 下载次数: 0)

2018-1-8 17:41 上传

private static boolean b():

TIM截图20180107151705.jpg (22.75 KB, 下载次数: 1)

2018-1-8 17:41 上传

private static boolean b(Context paramContext):

TIM截图20180107151723.jpg (13.88 KB, 下载次数: 0)

2018-1-8 17:41 上传

但是并没有像上面图中那样完整的一句话(基本都在 Log 中)。

4. 首次试水:

[Java] 纯文本查看 复制代码package me.zpp0196.ss.xpatch;

import android.content.Context;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XC_MethodReplacement;

import de.robv.android.xposed.XposedHelpers;

import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**

* Created by zpp0196 on 2018/1/8.

*/

public class Hook implements IXposedHookLoadPackage{

@Override

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{

if(!lpparam.packageName.equals("com.ss.android.ugc.aweme")){

return;

}

findAndHookMethod("com.ss.android.ugc.aweme.app.i", lpparam.classLoader, "a", new XC_MethodReplacement(){

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable{

logI("com.ss.android.ugc.aweme.app.i.a()");

return false;

}

});

findAndHookMethod("com.ss.android.ugc.aweme.app.i", lpparam.classLoader, "a", Context.class, new XC_MethodReplacement(){

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable{

logI("com.ss.android.ugc.aweme.app.i.a(Context param)");

return false;

}

});

findAndHookMethod("com.ss.android.ugc.aweme.app.i", lpparam.classLoader, "b", new XC_MethodReplacement(){

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable{

logI("com.ss.android.ugc.aweme.app.i.b()");

return false;

}

});

findAndHookMethod("com.ss.android.ugc.aweme.app.i", lpparam.classLoader, "b", Context.class, new XC_MethodReplacement(){

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable{

logI("com.ss.android.ugc.aweme.app.i.b(Context param)");

return false;

}

});

}

private void findAndHookMethod(String p1, ClassLoader lpparam, String p2, Object... parameterTypesAndCallback){

try{

XposedHelpers.findAndHookMethod(p1, lpparam, p2, parameterTypesAndCallback);

}catch(Throwable throwable){

logE(throwable.getMessage());

}

}

private void logI(String msg){

if(BuildConfig.DEBUG)

Log.i(getTAG(), msg);

}

private void logE(String msg){

if(BuildConfig.DEBUG)

Log.e(getTAG(), msg);

}

private String getTAG(){

return getClass().getSimpleName();

}

}

编译后重启手机运行抖音 APP,依然会有提示,而且日志里面也没有打印任何有用的信息,证明这些方法都没有被调用过(起码目前是这样)。

5. 入手strings.xml:

既然在 java 代码里面没找到,Xposed这个关键字也没有在 strings.xml 里面出现,那还有一种可能就是 Toast 中的字符串是拼接得到的,这次换一种搜索方式:

这次只搜前面的几个字「检测到」:

TIM截图20180107152949.jpg (21.54 KB, 下载次数: 0)

2018-1-8 17:41 上传

果然搜到了,将 "%s" 换成 "Xposed" 不就是上面 Toast 的内容了么,接着在 public.xml中搜索他的 id(a_v):

TIM截图20180107153303.jpg (28.03 KB, 下载次数: 1)

2018-1-8 17:41 上传

很明显用到的是第二个 type="string" 的,接着将他的 id(0x7f09020d) 转换为 10 进制(2131296781) 再次搜索结果没有搜到任何东西,以前就遇到过这种坑,然后我选择换工具继续找。

6. 换工具继续找:

PS:电脑端有其他工具应该也可以查出来,不过我不常用,用的多的还是手机上的 MT 管理器,照猫画虎,按照个人习好来。

这个 apk 有 3 个 dex 文件,除过 classes2 中的R$string 以外,能搜到的唯一一个结果在 classes1/com.ss.android.ugc.aweme.app.b.a.i里面:

S80107-15450182.jpg (23.71 KB, 下载次数: 1)

2018-1-8 17:41 上传

反编译(需要会员)直接查看 java 源码得到:

[Java] 纯文本查看 复制代码public class i implements a {

public static ChangeQuickRedirect a;

public void a() {

if (PatchProxy.isSupport(new Object[0], this, a, false, 4264, new Class[0], Void.TYPE)) {

PatchProxy.accessDispatch(new Object[0], this, a, false, 4264, new Class[0], Void.TYPE);

} else if (com.ss.android.ugc.aweme.app.i.a(AwemeApplication.t())) {

n.a(AwemeApplication.t(), String.format(AwemeApplication.t().getString(0x7f09020d), new Object[]{com.ss.android.ugc.aweme.app.i.b}));

c.a("find_hook", com.ss.android.ugc.aweme.app.i.b, null);

}

}

}

看到 format() 和 getString(0x7f09020d) 就可以猜到这一行应该就是显示 Toast 的方法,他没有返回值,应该不是判断的方法而是显示 Toast 的方法。

7. 再次试水:

这个相对于上面的可能性很大,所以直接 hook 打印日志测试:

[Java] 纯文本查看 复制代码package me.zpp0196.ss.xpatch;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XC_MethodReplacement;

import de.robv.android.xposed.XposedHelpers;

import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**

* Created by zpp0196 on 2018/1/8.

*/

public class Hook implements IXposedHookLoadPackage{

@Override

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{

if(!lpparam.packageName.equals("com.ss.android.ugc.aweme")){

return;

}

logI("start hook ShakeSound");

findAndHookMethod("com.ss.android.ugc.aweme.app.b.a.i", lpparam.classLoader, "a", new XC_MethodReplacement(){

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable{

logI( "com.ss.android.ugc.aweme.app.b.a.i.a()");

return null;

}

});

}

private void findAndHookMethod(String p1, ClassLoader lpparam, String p2, Object... parameterTypesAndCallback){

try{

XposedHelpers.findAndHookMethod(p1, lpparam, p2, parameterTypesAndCallback);

}catch(Throwable throwable){

logE(throwable.getMessage());

}

}

private void logI(String msg){

if(BuildConfig.DEBUG)

Log.i(getTAG(), msg);

}

private void logE(String msg){

if(BuildConfig.DEBUG)

Log.e(getTAG(), msg);

}

private String getTAG(){

return getClass().getSimpleName();

}

}

编译运行,结果就是那个烦人的 Toast 没有了:

S80107-155718.jpg (41.66 KB, 下载次数: 2)

2018-1-8 17:41 上传

控制台的 log:

01-08 18:13:59.469 7209-7209/? I/Hook: start hook ShakeSound

01-08 18:13:59.607 7209-7209/? I/Hook: com.ss.android.ugc.aweme.app.b.a.i.a()

01-08 18:14:00.047 7242-7242/? I/Hook: start hook ShakeSound

01-08 18:14:00.096 7242-7242/? I/Hook: com.ss.android.ugc.aweme.app.b.a.i.a()

01-08 18:14:00.737 7305-7305/? I/Hook: start hook ShakeSound

01-08 18:14:00.770 7305-7305/? I/Hook: com.ss.android.ugc.aweme.app.b.a.i.a()

一共连续打印了 3 次(至于为什么是三次这个要问抖音开发者),并且已经达到了预期的结果并且也不影响 APP 的使用,大功告成。

解析到此结束,感谢观看。

需要此模块的机友可以下载附件中的 zip 解压得到模块打钩重启手机即可(测试1.6.6、1.6.8、1.6.9、1.7.0、1.7.1、1.7.2 可用)。

抖音反 Xposed 检测.zip

(76.37 KB, 下载次数: 1064)

2018-1-14 09:02 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

第一个版本发布的时候忽略了系统版本,导致 5.0 以下的系统不能用,已经更新了。

如果有什么 Bug 影响到了软件的正常使用,请见谅,我平常只是看看视频,目前还没发现有什么影响。

补充:更多内容参考Xposed那些事儿 -- xposed框架的检测和反制,应用下载更新详见https://www.coolapk.com/apk/173571。

android xposed开发视频,【Xposed】抖音短视频检测 Xposed 分析相关推荐

  1. c++怎么做app_想开发一个类似于抖音短视频这样的APP大概多少钱?应该怎么做?...

    随着智能手机和网络速度的发展,类似的实时应用软件或短视频应用软件已经开发出来,也很受用户欢迎.开发一个类似抖音短视频的应用软件要花多少钱?这个问题也成为一些准备开发视频应用软件的商家和客户经常问及的问 ...

  2. python音视频开发_Python音视频开发:消除抖音短视频Logo的图形化工具实现

    一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现消除视频Logo的四种方法,并提供了详细的 ...

  3. Python音视频开发:消除抖音短视频Logo和去电视台标

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...

  4. Python音视频开发:消除抖音短视频Logo的图形化工具实现

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...

  5. 伪原创视频 审核 抖音短视频md5修改在线

             伪原创视频 审核 抖音短视频md5修改在线          内容主打短视频,抖音要怎样"盘活"自己的产品池?以抖音的新晋网红李雪琴为例,以"喊话吴亦凡 ...

  6. 短视频app源码开发:仿抖音短视频热门页面的实现

    在短视频app源码开发中,仿抖音短视频热门页面的实现只不过是多了一个由UICollectionView呈现多个视频图片的中间界面,点开后播放视频界面其实就是推荐界面,所以这里并没有什么核心难点,只是简 ...

  7. 如何做好抖音短视频,抖音短视频的几个小技巧:国仁网络资讯

    抖音短视频行业近两年异军突起,为自媒体行业带来了全新的发展模式和契机,其实自媒体短视频入门并不难,只要确定一个简单的文案,一台手机就可以创作了,时长一般十几秒到几分钟不等,对于信任来说非常友好. 虽然 ...

  8. 沉睡者IT - [短视频运营] 抖音短视频成SEO新风口

    下面会从以下5个企业关心的问题来聊聊,如果有什么不明白的地方可以评论交流. 一.什么是SEO? 二.为什么要做抖音SEO? ​三.哪些企业适合做抖音SEO? 四.抖音SEO怎么做? 五.影响抖音排名的 ...

  9. python去除视频中的logo_Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解...

    moviepy音视频开发专栏<moviepy音视频开发专栏>为收费专栏,基于老猿阅读moviepy1.03版本的源代码以及大量测试验证的基础上,详细介绍moviepy主要音视频剪辑相关类的 ...

  10. 如何开发仿抖音短视频APP源码?

    如何开发仿抖音短视频APP源码? 流程列表 开发一个短视频最主要的流程分为 3 个,下面我将分步教你实现这 3 个流程下的各个功能点,功能点 API 可按需调用: 视频拍摄 a.启动拍摄 b.给拍摄添 ...

最新文章

  1. js函数语法:ASCII 码的相互转换,字符串操作,数学计算
  2. 离群点检测算法-基础概念
  3. JConsole是什么
  4. pyaiml聊天机器人
  5. linux内核中kset是什么意思,Linux内核之设备驱动-底层数据结构kobject/kset
  6. 【EXLIBRIS】图洛克《收入再分配的经济学》中译本序 【ZZ】
  7. matlab替换矩阵中元素的值,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
  8. 如何将kafka中的数据快速导入Hadoop?
  9. ubuntu 18.04 安装teamview(包括正常的安装教程,以及一个纯终端教程)
  10. 一个傻瓜式构建可视化 web的 Python 神器 -- streamlit 教程
  11. 教育大数据采集机制与关键技术研究
  12. python numpy log_工具amp;方法 | 6行代码教你用Python做OLS回归(内附CFPS实例)
  13. 网站域名如何解析到阿里云和腾讯云服务器?
  14. 企业网站常见误区-金瑞帆高端建站
  15. VRF-Virtual Routing Forwarding
  16. 深度 | 实景三维与CIM,谁才是时空数据第一底板 三维视频融合 三维投影融合 时空克隆 点卯-魔镜系列
  17. Markdown Cheat Sheet
  18. AOP--Filter使用,过滤器和拦截器的区别
  19. 切换上下首音乐功能的实现(消息订阅与发布的使用)
  20. 网页后缀php,网页后缀php有什么含义

热门文章

  1. 纯HTML5后台模板
  2. 论文阅读“Automatic detection of hardhats worn by construction personnel”
  3. HTML5表单新特征简介与举例
  4. 苹果app退款_app退款理由写什么好?苹果退款理由怎么写才好?
  5. 多个excel工作簿合并_Microsoft Excel如何快速合并多个工作簿至一个工作簿中?
  6. c14cpm和dpm怎么换算_DPM7001液体闪烁计数器
  7. codelite开发php,CodeLite环境搭建
  8. 《CSDN排行榜冲榜攻略》妙用Emoji表情符号读者提升阅读体验(编码表)
  9. Git develop分支的一些操作
  10. 【LCA】BZOJ1776-[Usaco2010 Hol]cowpol 奶牛政坛