逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

admin 2024年7月9日21:11:58评论79 views字数 3178阅读10分35秒阅读模式

🌟 ❤️

作者:yueji0j1anke

首发于公号:剑客古月的安全屋

字数:1696

阅读时间:    30min

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外


目录

  • 前言

  • windows端微信

  • Android 端微信

  • 总结



0x01 前言

最近学一些app安全的理论觉得有些枯燥了,想动手实操,刚好看到最近网上有微信防护撤回功能的hook,追踪溯源就来学一学



0x02 windows端微信实验

基本上微信的所有核心功能都在wechatwin.dll该动态链接库中

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

用ida打开该文件

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

打开需要耗时一定的时间

shift+f12 搜索.*data存放的字符串

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

此时我们就需要找寻微信撤回功能的入口点了

搜索关键字,revoke

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

看到这些不少都像是微信撤回功能的入口点的,如何确定是哪个函数呢?

就需要对相关函数进行注入调试,需要用到frida


dll中的初始header地址 16进制  0x180000000

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)


进行虚拟地址转换

function getRealAddr(addr) {
           const idaBase = ptr('0x180000000');
           const offset = ptr(addr).sub(idaBase);
           const result = ptr(baseAddr).add(offset);
           return result;
      }

代码全部如下

import frida
import sys


def inject_func(process):
   session = frida.attach(process)
   # 创建脚本
   jscode = """
      // 加载dll文件
      const baseAddr=Module.findBaseAddress('WeChatWin.dll');
      console.log("baseAddr: "+ baseAddr);
      // 准备就绪后只有这个地址需要变换
      const revokeMsgFuncAddr = convertAddr('0x181CDE330');
       
      Interceptor.attach(revokeMsgFuncAddr, {
          onEnter(args) {
              console.log("test successfully");
          }
      });
       

      // dll地址加上偏移地址,从虚拟内存地址转换到实际内存地址
      function convertAddr(addr) {
          const idaBase = ptr('0x180000000');
          const offset = ptr(addr).sub(idaBase);
          const result = ptr(baseAddr).add(offset);
          return result;
      }
  """
   script = session.create_script(jscode)
   script.load()

   print("Process attached successfully")
   # 程序一直执行,不会退出
   sys.stdin.read()



if __name__ == '__main__':
   target_process = 'WeChat.exe'
   inject_func(target_process)


工作准备就绪,我们先来尝试几个看着比较像撤回功能的函数,比如说这个

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

将这个地址填入对应函数区域,进行消息撤回

发现没有输出调试信息,找下一个

(就在这样找了一个又一个后,终于发现了对应功能函数)

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

调试成功,下一步即阻止调用该函数

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

进入该函数,f5进行反汇编

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

可以大致看到一个if else逻辑结构

发现存在太多逻辑结构,不好判断,于是我们看看有什么函数调用了该函数

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

进入1823E59A0该函数

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

可以看到也是一个判断逻辑才决定是否进行该函数调用

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

发现这里确实是初始函数入口,那防撤回就很简单了,仅需要把edi寄存器的值变成不是4即可

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

那就直接让它为0即可

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

我们再来进行撤回

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

成功实现,如果要实现持久化防撤回的话,就需要修改dll文件


逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)


把其全部变成空转指令

0x9090  x86 空转机器周期,不执行任何代码

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)


逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)


修改后反汇编成dll文件替换即可


0x03 安卓端微信实验

将apk直接拖入jadx,等待反汇编完成,腾讯乐固加固并没有在微信中有明显的特征,我估计是会影响程序的使用性能,毕竟那么多人都在用(bushi)

我这里的微信版本是8.0.49版本的(目前好像是最新)

加载一会儿,搜索关键词revokemsg

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

根据英文,不出意外的话是这个revokemsgevent

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

继承IEvent类,这里的代码并没有太多的东西,我们直接找其引用

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

但确实电脑太卡了,无奈只好直接写frida查看其调用方法

这里的调用堆栈方法参考的是

https://bbs.kanxue.com/user-home-984774.htm

jscode = """
Java.perform(function () {
   var revokemsg = Java.use('com.tencent.mm.autogen.events.RevokeMsgEvent');
   var activity = Java.use('android.app.Activity')
   // 实例化一下
   // hook 普通方法
   
   console.log("[****] Hook succesfully.... [****]");
   

   revokemsg["$init"].implementation = function() {
        console.log("revoke类被调用");
        showStacks()
        this.$init();
  }
   
   function showStacks(){
       console.log(
           Java.use("android.util.Log")    //首先找到log类
          .getStackTraceString(              //调用log类的该方法
               Java.use("java.lang.Throwable").$new()      //new一个对象
          )
      )
  }


});
"""

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

发现初次调用在这里

那接下来就很简单了,把该方法置空即可

jscode = """
Java.perform(function () {
   var revokemsg = Java.use('com.tencent.mm.autogen.events.RevokeMsgEvent');
   var activity = Java.use('ik0.t');
   // 实例化一下
   // hook 普通方法
   
   console.log("[****] Hook succesfully.... [****]");
   

   activity.k.implementation = function() {
        console.log("撤回不了我吧!!");
  }
});
"""


逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

展示如下

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)



0x04 总结

这次算是通过学习将一些理论上学到的知识进行融会贯通了。

hook的关键还是找到关键代码,像这次我就学会了打印堆栈(耗时确实太久,以及windows一些偏移地址的重新复习,有空还是下来好好看看反汇编代码

后续将熟悉熟悉编写xposed框架进行安卓持久化防撤回




参考链接

https://bbs.kanxue.com/user-home-984774.htm



原文始发于微信公众号(剑客古月的安全屋):逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月9日21:11:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向攻防-微信防撤回Hook实操(安卓最新版 windows3.9.10.19)https://cn-sec.com/archives/2937262.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息