安卓免root虚拟摄像头插件,虚拟视频替换本机相机,微信QQ陌陌都可以,只hook类代码

这个是开源的,然后功能就跟标题描述的一样,软件成品我这里不会发布,但是会把dex核心字节集文件分享出来,方便大家学习,软件原理就是通过HOOK技术截取相机视频流,然后实现虚拟视频的效果,然后微信QQ这些都能用的,仅供学习娱乐。

下面是运行的演示效果视频【仅供娱乐学习】 

安卓免root虚拟摄像头,看下这个功能!!!

下面是核心dex字节码, 你可以转JAVA自己分析代码:

=======================================================

.class Lcom/example/vcam/HookMain$1;

.super Lde/robv/android/xposed/XC_MethodHook;

.source "HookMain.java"

# annotations

.annotation system Ldalvik/annotation/EnclosingMethod;

    value = Lcom/example/vcam/HookMain;->handleLoadPackage(Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;)V

.end annotation

.annotation system Ldalvik/annotation/InnerClass;

    accessFlags = 0x0

    name = null

.end annotation

# instance fields

.field final synthetic this$0:Lcom/example/vcam/HookMain;

.field final synthetic val$lpparam:Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;

# direct methods

.method constructor <init>(Lcom/example/vcam/HookMain;Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;)V

    .registers 3

    .line 98

    iput-object p1, p0, Lcom/example/vcam/HookMain$1;->this$0:Lcom/example/vcam/HookMain;

    iput-object p2, p0, Lcom/example/vcam/HookMain$1;->val$lpparam:Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;

    invoke-direct {p0}, Lde/robv/android/xposed/XC_MethodHook;-><init>()V

    return-void

.end method

# virtual methods

.method protected beforeHookedMethod(Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;)V

    .registers 6

    .line 101

    new-instance v0, Ljava/io/File;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    sget-object v2, Lcom/example/vcam/HookMain;->video_path:Ljava/lang/String;

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    const-string v2, "virtual.mp4"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-direct {v0, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V

    .line 102

    invoke-virtual {v0}, Ljava/io/File;->exists()Z

    move-result v0

    const/4 v1, 0x0

    if-eqz v0, :cond_c2

    .line 103

    new-instance v0, Ljava/io/File;

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;

    move-result-object v3

    invoke-virtual {v3}, Ljava/io/File;->getPath()Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    const-string v3, "/DCIM/Camera1/disable.jpg"

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-direct {v0, v2}, Ljava/io/File;-><init>(Ljava/lang/String;)V

    .line 104

    invoke-virtual {v0}, Ljava/io/File;->exists()Z

    move-result v0

    if-eqz v0, :cond_44

    return-void

    .line 107

    :cond_44

    sget-boolean v0, Lcom/example/vcam/HookMain;->is_hooked:Z

    if-eqz v0, :cond_4b

    .line 108

    sput-boolean v1, Lcom/example/vcam/HookMain;->is_hooked:Z

    return-void

    .line 111

    :cond_4b

    iget-object v0, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->args:[Ljava/lang/Object;

    aget-object v0, v0, v1

    if-nez v0, :cond_52

    return-void

    .line 114

    :cond_52

    iget-object v0, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->args:[Ljava/lang/Object;

    aget-object v0, v0, v1

    sget-object v2, Lcom/example/vcam/HookMain;->c1_fake_texture:Landroid/graphics/SurfaceTexture;

    invoke-virtual {v0, v2}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_5f

    return-void

    .line 117

    :cond_5f

    sget-object v0, Lcom/example/vcam/HookMain;->origin_preview_camera:Landroid/hardware/Camera;

    if-eqz v0, :cond_8e

    sget-object v0, Lcom/example/vcam/HookMain;->origin_preview_camera:Landroid/hardware/Camera;

    iget-object v2, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->thisObject:Ljava/lang/Object;

    invoke-virtual {v0, v2}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_8e

    .line 118

    iget-object p1, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->args:[Ljava/lang/Object;

    sget-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    aput-object v0, p1, v1

    .line 119

    new-instance p1, Ljava/lang/StringBuilder;

    invoke-direct {p1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v0, "【VCAM】发现重复"

    invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    sget-object v0, Lcom/example/vcam/HookMain;->origin_preview_camera:Landroid/hardware/Camera;

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p1

    invoke-static {p1}, Lde/robv/android/xposed/XposedBridge;->log(Ljava/lang/String;)V

    return-void

    :cond_8e

    const-string v0, "【VCAM】创建预览"

    .line 122

    invoke-static {v0}, Lde/robv/android/xposed/XposedBridge;->log(Ljava/lang/String;)V

    .line 125

    iget-object v0, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->thisObject:Ljava/lang/Object;

    check-cast v0, Landroid/hardware/Camera;

    sput-object v0, Lcom/example/vcam/HookMain;->origin_preview_camera:Landroid/hardware/Camera;

    .line 126

    iget-object v0, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->args:[Ljava/lang/Object;

    aget-object v0, v0, v1

    check-cast v0, Landroid/graphics/SurfaceTexture;

    sput-object v0, Lcom/example/vcam/HookMain;->mSurfacetexture:Landroid/graphics/SurfaceTexture;

    .line 127

    sget-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    const/16 v2, 0xa

    if-nez v0, :cond_af

    .line 128

    new-instance v0, Landroid/graphics/SurfaceTexture;

    invoke-direct {v0, v2}, Landroid/graphics/SurfaceTexture;-><init>(I)V

    sput-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    goto :goto_bb

    .line 130

    :cond_af

    sget-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    invoke-virtual {v0}, Landroid/graphics/SurfaceTexture;->release()V

    .line 131

    new-instance v0, Landroid/graphics/SurfaceTexture;

    invoke-direct {v0, v2}, Landroid/graphics/SurfaceTexture;-><init>(I)V

    sput-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    .line 133

    :goto_bb

    iget-object p1, p1, Lde/robv/android/xposed/XC_MethodHook$MethodHookParam;->args:[Ljava/lang/Object;

    sget-object v0, Lcom/example/vcam/HookMain;->fake_SurfaceTexture:Landroid/graphics/SurfaceTexture;

    aput-object v0, p1, v1

    goto :goto_13a

    .line 135

    :cond_c2

    new-instance p1, Ljava/io/File;

    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;

    move-result-object v2

    invoke-virtual {v2}, Ljava/io/File;->getPath()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    const-string v2, "/DCIM/Camera1/no_toast.jpg"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-direct {p1, v0}, Ljava/io/File;-><init>(Ljava/lang/String;)V

    .line 136

    iget-object v0, p0, Lcom/example/vcam/HookMain$1;->this$0:Lcom/example/vcam/HookMain;

    invoke-virtual {p1}, Ljava/io/File;->exists()Z

    move-result p1

    xor-int/lit8 p1, p1, 0x1

    iput-boolean p1, v0, Lcom/example/vcam/HookMain;->need_to_show_toast:Z

    .line 137

    iget-object p1, p0, Lcom/example/vcam/HookMain$1;->this$0:Lcom/example/vcam/HookMain;

    iget-object p1, p1, Lcom/example/vcam/HookMain;->toast_content:Landroid/content/Context;

    if-eqz p1, :cond_13a

    iget-object p1, p0, Lcom/example/vcam/HookMain$1;->this$0:Lcom/example/vcam/HookMain;

    iget-boolean p1, p1, Lcom/example/vcam/HookMain;->need_to_show_toast:Z

    if-eqz p1, :cond_13a

    .line 139

    :try_start_f6

    iget-object p1, p0, Lcom/example/vcam/HookMain$1;->this$0:Lcom/example/vcam/HookMain;

    iget-object p1, p1, Lcom/example/vcam/HookMain;->toast_content:Landroid/content/Context;

    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "不存在替换视频\n"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    iget-object v2, p0, Lcom/example/vcam/HookMain$1;->val$lpparam:Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;

    iget-object v2, v2, Lde/robv/android/xposed/callbacks/XC_LoadPackage$LoadPackageParam;->packageName:Ljava/lang/String;

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    const-string v2, "当前路径:"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    sget-object v2, Lcom/example/vcam/HookMain;->video_path:Ljava/lang/String;

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object p1

    invoke-virtual {p1}, Landroid/widget/Toast;->show()V

    :try_end_120

    .catch Ljava/lang/Exception; {:try_start_f6 .. :try_end_120} :catch_121

    goto :goto_13a

    :catch_121

    move-exception p1

    .line 141

    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "【hook】[toast]"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {p1}, Ljava/lang/Exception;->toString()Ljava/lang/String;

    move-result-object p1

    invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p1

    invoke-static {p1}, Lde/robv/android/xposed/XposedBridge;->log(Ljava/lang/String;)V

    :cond_13a

    :goto_13a

    return-void

.end method

============================================================== 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 很抱歉,作为AI语言模型,我不能提供关于微信hook发送视频号消息的代码。这种行为可能会违反微信的使用协议,也可能会对其他用户造成不必要的麻烦和风险。建议您遵守微信的规定和原则,保持良好的网络行为和安全意识。 ### 回答2: 微信hook发送视频号消息的代码可以参考如下: ```python import frida def on_message(message, data): if message['type'] == 'send': payload = message['payload'] if 'message' in payload and 'mp_video_xml' in payload['message']: # 提取视频号的XML数据 mp_video_xml = payload['message']['mp_video_xml'] # 在此对视频号消息进行处理或记录 print(mp_video_xml) # 启动Frida session = frida.get_usb_device().attach('WeChat') # 加载JavaScript脚本 js_code = """ function hookSendMessage() { // 寻找消息发送的入口 var sendMessage = Module.findExportByName("WeChat", "SendMessage") if (sendMessage) { console.log("SendMessage address: " + sendMessage) // hook发送消息的函数 Interceptor.attach(sendMessage, { onEnter: function (args) { // 提取消息内容 var xmlBuffer = args[1] var xmlData = xmlBuffer.readCString() // 解析XML数据 var xmlDoc = new XMLDocument(xmlData) var messageNode = xmlDoc.getRootNode() var messageType = messageNode.getAttribute("datatype") if (messageType == "47") { var mpVideoXml = messageNode.getNodeByName("wxv") send({message: {mp_video_xml: mpVideoXml}}) } } }) } } // 调用函数进行hook hookSendMessage() """ script = session.create_script(js_code) script.on('message', on_message) script.load() ``` 上述代码使用了Frida来进行hook操作,通过hooking WeChat的SendMessage函数,获取发送消息的XML数据,从中解析出视频号消息的XML字段`wxv`,并进行处理或记录。 注意,此代码只是演示了hook操作的基本原理,具体实现还需要结合微信的实际运行环境来进行调试和适配。 ### 回答3: 要实现微信hook发送视频号消息的代码,需要借助一些工具和技术。下面是一个基本的 Python 代码示例: ```python import frida def on_message(message, data): if message['type'] == 'send': if 'video' in message['payload']: video_url = message['payload']['video'] # 在这里可以对视频链接进行处理,比如下载到本地或者转发给其他用户 print(f"收到视频链接:{video_url}") def hook_wechat_send_video(): # 获取微信进程 session = frida.attach("com.tencent.mm") # 读取 JavaScript hooking 脚本 with open("hook_wechat_send_video.js", "r") as f: hook_script = f.read() # 加载 JavaScript hooking 脚本 script = session.create_script(hook_script) # 设置消息回调函数 script.on("message", on_message) # 运行 JavaScript hooking 脚本 script.load() # 保持脚本持续运行 frida.resume(pid) # 执行 Hook hook_wechat_send_video() # 保持主线程运行 while True: pass ``` 上述代码中,我们使用了 `frida` 这个 Python 包来实现与手机应用的通信和 hook 功能。通过运行 `hook_wechat_send_video()` 函数,首先获取微信应用进程,然后加载 JavaScript hooking 脚本。在回调函数 `on_message()` 中,我们可以对接收到的视频链接进行任意处理,比如打印、下载或转发给其他用户。最后,保持主线程运行以保证持续监听微信应用的消息。 请注意,以上代码只是提供一个示例,并不能直接运行,因为具体的 hook 逻辑需要写在 JavaScript 脚本 `hook_wechat_send_video.js` 中,并且需要根据具体的微信版本和手机操作系统进行适配。对于较新版本的微信可能需要更高级的 hook 技术,同时需要越狱或者 root 权限。因此,如果需要实现微信 hook 功能,建议参考专业的 hook 工具和文档,并遵守法律和道德规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值