当前位置: 首页 > news >正文

周口seo 网站如何制作视频网站

周口seo 网站,如何制作视频网站,做彩票网站违法吗,网站建设最安全的宽度From#xff1a;使用 frida hook 插件化 apk#xff1a;https://bbs.pediy.com/thread-258772.htm 最近拿到一个XX视频apk样本#xff0c;里面有视频、直播和小说#xff0c;没有VIP只能试看30秒#xff0c;刚好最近学习frida#xff0c;用来练习下#xff0c;分析过程中… From使用 frida hook 插件化 apkhttps://bbs.pediy.com/thread-258772.htm 最近拿到一个XX视频apk样本里面有视频、直播和小说没有VIP只能试看30秒刚好最近学习frida用来练习下分析过程中发现是一个插件化的apk本文记录下分析的过程。 初步分析 首先从AndroidManifest.xml中获取到apk的包名并且查看下activity情况 发现只有4个Activity正常情况下一个apk肯定不止这些所以初步怀疑这只是外壳真正逻辑是在其他地方会动态加载进来。 ps 查看 打开 apk 可以看到有两个进程从上图也可以看到2、3和4处的Activity是运行在plugin进程中为了确认下视频播放所在的进程使用dumpsys meminfo查看 dumpsys meminfo查看 打开任意播放界面 确认视频播放是在plugin进程中此时真正的逻辑已经加载到进程中查看下plugin进程的maps cat /proc/7906/maps 从上图可以看到真正逻辑所在的apk是plugin-shadow-apk-debug.apk是在该apk的私有文件目录中。 从代码中分析也可知道此apk是插件化apk使用的是腾讯开源的插件化框架Shadow感兴趣的可以去了解下。 定位关键代码 既然已经找到真正的apk那我们就需要定位到关键代码地方。 字符串定位 从字符串中定位到有多个类满足此时一个一个去分析排查太耗时接下来通过frida来枚举出所有加载的类。 frida 枚举所有加载的类 Java.enumerateLoadedClasses(callbacks) 是用来枚举当前所有加载的类通过和上述几个关键类对比来找到实际调用的类callbacks需要提供回调函数对应onMatch和onComplete。具体如下面 Java.perform(function () {// 上述搜索到的多个类var key_class [com.facebook.plugin.widget.dkplayer.controller.PlayerVideoController,com.iqiyi.plugin.widget.dkplayer.controller.PlayerVideoController,com.facebook.plugin.widget.dkplayer.controller.VideoController,com.iqiyi.plugin.widget.dkplayer.controller.VideoController]Java.enumerateLoadedClasses({onMatch: function(name, handle) {for (var i 0; i key_class.length; i) {if (key_class[i] name) {console.log(name);}}},onComplete: function() {console.log(success);}}); }); 运行结果 com.iqiyi.plugin.widget.dkplayer.controller.VideoController success 第一行为输出结果即表示当前使用的类为 com.iqiyi.plugin.widget.dkplayer.controller.VideoController 第二行为执行完成的日志。 VideoController 类分析 找到字符串位置 public int setProgress() {... ...if (this.tryWatchTv ! null position 0) { // 如果是试看pos (int) (((long) this.stopPlayTime) - position);TextView textView this.tryWatchTv;StringBuilder stringBuilder new StringBuilder();stringBuilder.append(剩余试看时间: ); // 此处是我们看到的字符串if (pos 0) {j (long) pos;}stringBuilder.append(stringForTime(j));textView.setText(stringBuilder.toString());}if (!this.isVip) { // 此处是通过isVip变量执行不同逻辑StringBuilder stringBuilder2 new StringBuilder();stringBuilder2.append(position );stringBuilder2.append(position);stringBuilder2.append( showVipHintTime );stringBuilder2.append(this.showVipHintTime);LogHelper.i(stringBuilder2.toString());if (position ((long) this.showVipHintTime) || this.showVipHintTime 0) {this.vipHintView.setVisibility(8);} else {this.vipHintView.setVisibility(0);}if (position ((long) this.stopPlayTime)) {this.mMediaPlayer.pause();}}... ...} 可以看到类中通过isVip变量来执行不同逻辑继续看下isVip是如何设置的 public void setVip(boolean isVip) {this.isVip isVip;this.tryWatchTv.setVisibility(this.isVip ? 8 : 0);if (this.isVip) {this.vipHintView.setVisibility(8);} } 可以看到当前类有setVip方法用于设置该变量此时可以不用在继续分析调用者最终都会调用此处所以我们可以使用frida hook该方法。 frida hook setVip var videoController Java.use(com.iqiyi.plugin.widget.dkplayer.controller.VideoController); videoController.setVip.implementation function() {console.log(hook setVip);this.setVip(true); }; 运行结果 从运行结果来看出现ClassNotFoundException错误说明没有找到我们要hook的类。 frida枚举classloader 由于是插件化apk类加载是在插件化框架自定义的所以classloader不能使用默认的。我们可以使用Java.enumerateClassLoaders(callbacks)来打印出所有的加载器。 Java.perform(function () {Java.enumerateClassLoaders({onMatch: function(loader) {console.log(loader);},onComplete: function() {console.log(success);}}); }); 运行结果 由上面分析可知真正逻辑代码是在plugin-shadow-apk-debug.apk中那该apk对应的classloader是com.tencent.shadow.core.loader.classloaders.PluginClassLoader。 frida指定classloader 来看下Java.ClassFactory中loader的介绍read-only property providing a wrapper for the class loader currently being used.loader是当前classloader的wrapper我们修改classloader可以通过修改该字段。Java.classFactory是默认的class factory所以我们需要修改的是Java.classFactory.loader。 Java.perform(function () {Java.enumerateClassLoaders({onMatch: function(loader) {if (loader.toString().startsWith(com.tencent.shadow.core.loader.classloaders.PluginClassLoader)) {Java.classFactory.loader loader; // 将当前class factory中的loader指定为我们需要的}},onComplete: function() {console.log(success);}}); }); 最终脚本 Java.perform(function () {Java.enumerateClassLoaders({onMatch: function(loader) {if (loader.toString().startsWith(com.tencent.shadow.core.loader.classloaders.PluginClassLoader)) {Java.classFactory.loader loader; // 将当前class factory中的loader指定为我们需要的}},onComplete: function() {console.log(success);}});// 此处需要使用Java.classFactory.usevar videoController Java.classFactory.use(com.iqiyi.plugin.widget.dkplayer.controller.VideoController);videoController.setVip.implementation function() {console.log(hook setVip);this.setVip(true);}; }); 运行结果 可以看到我们已经成功hook并且视频上已经没有显示剩余时间。 frida hook enum 直播和小说的vip判断和视频是不一致的是通过enum中VIP字段值和1进行对比来判断具体定位过程和上面类似。 判断代码为 if (TextUtils.equals(1, PluginEnum.VIP.getValue())) {...} enum 测试 我们的目的是为了hook VIP但是对enum的这种用法不是很熟于是写了个测试程序来进一步了解 public enum TestEnum {A(a),B(b),C(c);private String value;private TestEnum(String value) {this.value value;}public String getValue() {return this.value;}} 使用 javap 打开对应的 class 文件 Compiled from TestEnum.java public final class TestEnum extends java.lang.EnumTestEnum {public static final TestEnum A;public static final TestEnum B;public static final TestEnum C;public static TestEnum[] values();public static TestEnum valueOf(java.lang.String);public java.lang.String getValue();static {}; } 从这里可以很明显看到 A、B和C都属于TestEnum中的静态成员变量。来看下调用的smali代码 sget-object v3, Lcom/iqiyi/plugin/base/PluginEnum;-VIP:Lcom/iqiyi/plugin/base/PluginEnum; invoke-virtual {v3}, Lcom/iqiyi/plugin/base/PluginEnum;-getValue()Ljava/lang/String; 从smali上也能看出来类似的逻辑VIP是com/iqiyi/plugin/base/PluginEnum的静态成员然后在调用getValue()方法。所以我们hook com/iqiyi/plugin/base/PluginEnum类的getValue方法然后判断调用者是否为VIP。 最终脚本 Java.perform(function () {var pluginEnum Java.classFactory.use(com.iqiyi.plugin.base.PluginEnum);var String Java.use(java.lang.String);pluginEnum.getValue.implementation function() {var value this.getValue();if (this VIP) { // 此时this 或者 this.getString() 返回的是静态成员名var vip String.$new(1);this.setValue(vip); // 调用 setValue 修改VIP值return vip;} else {return value;}} }); 整体脚本 Java.perform(function () {Java.enumerateClassLoaders({onMatch: function(loader) {if (loader.toString().startsWith(com.tencent.shadow.core.loader.classloaders.PluginClassLoader)) {Java.classFactory.loader loader;}},onComplete: function() {console.log(success);}});var videoController Java.classFactory.use(com.iqiyi.plugin.widget.dkplayer.controller.VideoController);videoController.setVip.implementation function() {console.log(hook setVip);this.setVip(true);};var pluginEnum Java.classFactory.use(com.iqiyi.plugin.base.PluginEnum);var String Java.use(java.lang.String);pluginEnum.getValue.implementation function() {var value this.getValue();if (this VIP) {var vip String.$new(1);this.setValue(vip);return vip;} else {return value;}}}); 总结 通过对该样本的分析逆向找寻关键代码相对简单但是在使用frida hook时相对难点特别是对于frida和插件化不熟的情况下。本文涉及到的有 frida枚举所有加载的类frida枚举classloaderfrida对enum类型的hook。
http://www.zqtcl.cn/news/623715/

相关文章:

  • 做网站业务提成多少厦门十大装修公司排名榜
  • 为什么用开源建站wordpress rss 插件
  • 语文建设投稿网站南昌做网站的公司多不多
  • 石家庄网站建设的公司功能性质网站
  • 企业网站主页模板装饰公司名字起名大全
  • 马鞍山网站设计价格如何在微信公众号内部做网站
  • 申请网站建设经费的报告生态建设网站
  • 建网站要多少钱用自己的服务器河北工程大学网站开发成本
  • 宁波网站建站公司商务网站模块设计时前台基础设施建设不包括
  • 徐州免费网站制作怎么用阿里云服务器搭建wordpress
  • php猎奇源码 织梦新闻视频图片八卦娱乐趣事资讯门户网站模板html代码表格
  • 南通做网站优化哪家好网页策划书 网站建设定位
  • 防止访问网站文件夹绵阳 网站设计
  • 网页与网站的区别是什么东莞网站公司排名
  • 盐城市城乡和住房建设厅网站wordpress文章订阅
  • 济南网站优化wordpress文件上传到那个文件
  • 外贸网站租用外国服务器好还是自己装一个服务器好高质量外链网站
  • 珠海专门做网站成都到西安
  • 网站做1920px好吗长沙seo优化排名
  • 哈尔滨微信网站开发wordpress 视
  • wordpress 分享封面图片尺寸重庆官网优化乐育公司
  • dede手机网站更新受欢迎的昆明网站建设
  • 网站设计外包合同专做自驾游的网站
  • 网站建设服务预算游戏网站怎么赚钱
  • 怎么做网站关键词视频手机网页前端开发
  • 好网站具备条件网站建设外链
  • 青岛如何建立企业网站企业中国数据域名注册
  • 怎么看网站做的好不好南京h5 网站建设
  • 贵阳微信网站制作下列哪一项不属于电子商务网站建设
  • 有没有做电子名片的网站网络广告怎么投放