4.1 应用层Hook挂钩原理分析

这篇具有很好参考价值的文章主要介绍了4.1 应用层Hook挂钩原理分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。

首先我们来探索一下Hook技术是如何实现的,如下图所示是一个简单的弹窗程序,当读者点击测试弹窗按钮时则会弹出一个MessageBox提示窗口,本次实现目标很简单,通过向目标内注入一个DLL库,实现Hook挂钩住MessageBox弹窗,从而实现去除弹窗的目的;

4.1 应用层Hook挂钩原理分析

我们先来看看如何实现Hook思路;

  • 1.调用GetModuleHandle函数来获取到user32.dll模块的基址
  • 2.调用GetProcAddress函数获取到MessageBoxA弹窗的基址
  • 3.调用VirtualProtect来修改MessageBoxA前5个字节内存属性
  • 4.计算Dest - MsgBox - 5重定位跳转地址,并写入JMP跳转指令
  • 5.计算Dest + Offset + 5 = MsgBox +5得到需要跳转回RET的位置
  • 6.最后调用VirtualProtect来将内存属性修改为原始状态

我们载入带有MessageBoxA弹窗的程序,然后在x64dbg上按下Ctrl+G输入MessageBoxA找到我们需要Hook的位置(或者说替换),如下图所示为了完成弹窗转向功能,只需要在函数开头写入jmp无条件跳转指令即可,在32位系统中JMP指令默认占用5个字节,前三条指令恰好5个字节,为了能够保持堆栈平衡,我们需要记下前三条指令,并在自己的中转函数中对其进行补齐。

4.1 应用层Hook挂钩原理分析

此外,我们还需要计算出程序的返回地址,使用0x76600BE5 - 0x76600BA0 = 0x45从而得出返回地址就是基址加上0x45,这里的返回地址其实就是返回到原MessageBoxA弹窗的RET 0x10的位置76600BE6,从这里可以看出屏蔽弹窗的原理就是通过中转函数跳过了原始弹窗函数的执行。

由于开头位置被替换为了我们自己的Transfer()函数,当程序中弹窗被调用时默认会路由到我们自己的函数内,首先执行补齐原函数的替换部分,并执行自定义功能区中的增加内容,当执行结束后则通过jmp ebx的方式跳转回原函数的ret 0x10的位置处,从而实现增加功能的目的。这里读者需要注意__declspec(naked)的意思是不添加任何的汇编修饰,当使用了此修饰符时则编译器会只编译我们自己的汇编指令,并不会增加默认的函数开场或离场原语。

__declspec(naked) void Transfer()
{
  __asm{
    mov edi, edi
    push ebp
    mov ebp, esp
    // 自定义功能区
    mov ebx, jump     // 取出跳转地址
    jmp ebx           // 无条件转向
  }
}

通过应用上述案例中的知识点我们能很容易的实现对弹窗的替换功能,以下代码中实现了对MessageBoxA弹窗的屏蔽功能,也就是通过跳过弹窗实现流程实现的一种劫持方法,读者可自行编译这段DLL程序,但需要注意一点,读者在编译DLL时应该关闭DLL的DEP以及ASLR模式,否则会出现无法定位的问题。

#include <Windows.h>
#include <stdio.h>

DWORD jump = 0;

// 不添加任何的汇编修饰
__declspec(naked) void Transfer()
{
    __asm
    {
        mov edi, edi
        push ebp
        mov ebp, esp
        mov ebx, jump     // 取出跳转地址
        jmp ebx           // 无条件转向
    }
}

// DLL程序入口地址
bool APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid)
{
    // 取进程内模块基址
    HMODULE hwnd = GetModuleHandle(TEXT("user32.dll"));
    DWORD base = (DWORD)GetProcAddress(hwnd, "MessageBoxA");
    DWORD oldProtect = 0;

    // 将内存设置为可读可写可执行状态,并将原属性保存在oldProtect方便恢复
    if (VirtualProtect((LPVOID)base, 5, PAGE_EXECUTE_READWRITE, &oldProtect))
    {
        DWORD value = (DWORD)Transfer - base - 5;    // 计算出需要Hook的地址
        jump = base + 0x45;                          // 计算出返回地址

        // 替换头部汇编代码
        __asm
        {
            mov eax, base
            mov byte ptr[eax], 0xe9        // e9 = jmp 指令机器码
            inc eax                        // 递增指针
            mov ebx, value                 // 需要跳转到的地址
            mov dword ptr[eax], ebx
        }

        // 恢复内存的原始属性
        VirtualProtect((LPVOID)base, 5, oldProtect, &oldProtect);
    }
    return true;
}

读者可通过注入软件将hook.dll动态链接库注入到进程内,此时我们可以再次观察0x76600BA0位置处的代码片段,读者应该能看到已经被JMP替换,如下图所示;

4.1 应用层Hook挂钩原理分析

继续跟进则读者能看到,在跳转指令的下方则是我们自己补齐的汇编指令,此处由于没有做任何事就被返回了,这就导致当读者再次点击弹窗时,弹窗失效;

4.1 应用层Hook挂钩原理分析

当我们需要替换程序标题时同样可是使用该方式实现,一般来说程序设置标题会调用SetWindowTextA函数,我们可以拦截这个函数,并传入自定义的窗口名称,从而实现修改指定窗口的标题的目的,代码只是在上面代码的基础上稍微改一下就能实现效果,只要程序使用了该函数设置标题,则可以实现替换的目的;文章来源地址https://www.toymoban.com/news/detail-709743.html

#include <Windows.h>
#include <stdio.h>

DWORD jump = 0;

// 汇编中转函数
__declspec(naked) bool _stdcall Transfer(HWND hwnd, LPCSTR lpString)
{
    __asm
    {
        mov edi, edi
        push ebp
        mov ebp, esp
        mov ebx, jump
        jmp ebx
    }
}

// 自己的设置窗体标题函数
bool __stdcall MySetWindowTextA(HWND hwnd, LPCSTR lpString)
{
    char * lpText = "LyShark 修改版";
    return Transfer(hwnd, lpText);
}

// DLL程序入口地址
bool APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid)
{
    HMODULE hwnd = GetModuleHandle(TEXT("user32.dll"));
    DWORD base = (DWORD)GetProcAddress(hwnd, "SetWindowTextA");
    DWORD oldProtect = 0;

    if (VirtualProtect((LPVOID)base, 5, PAGE_EXECUTE_READWRITE, &oldProtect))
    {
        DWORD value = (DWORD)MySetWindowTextA - base - 5;
        jump = base + 5;
        __asm
        {
            mov eax, base
            mov byte ptr[eax], 0xe9
            inc eax
            mov ebx, value
            mov dword ptr[eax], ebx
        }
        VirtualProtect((LPVOID)base, 5, oldProtect, &oldProtect);
    }
    return true;
}

到了这里,关于4.1 应用层Hook挂钩原理分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络原理】| 应用层协议与传输层协议 (UDP)

    🎗️ 主页:小夜时雨 🎗️ 专栏:javaEE初阶 🎗️ 乾坤未定,你我皆黑马 应用层是和代码直接相关的一层,决定了数据要传输什么,怎么去使用这些数据等问题。 应用层这里,虽然存在一些现有的协议(比如HTTP),但是也有很多的情况,需要我们去自定义一些协议,这里的自

    2024年02月06日
    浏览(51)
  • 9.3.5网络原理(应用层HTTP/HTTPS)

    一.HTTP: 1. HTTP是超文本传输协议,除了传输字符串,还可以传输图片,字体,视频,音频. 2.  3.HTTP协议报文格式:a.首行,b.请求头(header),c.空行(相当于一个分隔符,分隔了header和body),d.正文(body). 4. 5.URL:唯一资源描述符(长度不限制).  a. b.注意:查询字符串(query string)是键值对的格式.键值对

    2024年02月07日
    浏览(47)
  • 《计算机网络》实验八 应用层相关协议分析

    实验八 应用层相关协议分析.............................................................................................. 2 一、实验目的.................................................................................................................... 2 二、实验原理.......................................................................

    2024年02月03日
    浏览(53)
  • 「网络编程」应用层协议_ HTTPS协议学习及原理理解

    「前言」文章内容大致是应用层协议的HTTPS协议讲解,续上篇HTTP协议。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) HTTPS(HyperText Transfer Protocol Secure) 是一种通过加密和身份验证保护网络通信安全的协议。它是基于HTTP协议的安全版本,也是工作在应用

    2024年02月16日
    浏览(53)
  • Android 12 源码分析 —— 应用层 一(SystemUI准备篇)

    在接下来的时间中,将会使用Pixel 3(blueline)作为研究对象,选用AOSP的android-12.0.0_r34分支作源代码。 先从android的应用层进行探析,然后慢慢深入android的framework,接着进入android的hal层,最后以android的linux内核结束,期间可能会穿插一些其他文章如android的art虚拟机分析等。 本文

    2024年02月12日
    浏览(48)
  • Android 12 源码分析 —— 应用层 三(SystemUIFactory及其Dependency解析)

    在上一篇文章中,介绍了SystemUI的启动流程,并且简单提及了Dagger2用来管理各个SystemUI中要用的依赖。而这部分代码就在:mContextAvailableCallback.onContextAvailable(this);流程中。而这部分流程我们只是一笔带过,并没有仔细分析。 接下来将会从这个调用开始,介绍SystemUI中Component,

    2024年02月11日
    浏览(40)
  • Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

    在前一篇文章中,我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础,希望读者能尽量掌握。 本篇文章,将会介绍SystemUI的大概组织架构,以及它的启动过程。本篇文章读完,将会知道: SystemUI为什么选择使用Dagger2 SystemUI怎么新建一个模块 SystemUI的启动

    2024年02月06日
    浏览(81)
  • Android 12 源码分析 —— 应用层 四(SystemUI的基本布局设计及其基本概念)

    更新历史 日期 内容 1 2023-9-11 增加文中提及的渐变动画的效果图 在上两篇文章中,我们介绍SystemUI的启动过程,以及基本的组件依赖关系。基本的依赖关系请读者一定要掌握,因为后面的文章,将会时常出现这些依赖关系的使用,届时将会一笔带过,而不会详细说明他们的实

    2024年02月08日
    浏览(67)
  • 【网络原理进阶篇】ip协议,ip地址组成,ip地址分类网关,路由选择,数据链路层,应用层,ip与mac地址等

    前言: 大家好,我是 良辰丫 ,我们已经学习了网络原理基础版,初步认识了网络,还学习了网络编程,了解了网络通信的各种程序,接下来我们更深入的了解网络是如何工作的.这篇文章我们主要介绍协议,UDP和TCP的一些原理.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎

    2024年02月06日
    浏览(49)
  • 应用层与传输层~

    应用层是负责应用程序之间沟通的一层。由于不同的网络应用的应用进程之间,有着不同的通信规则,因此自然就需要应用层协议来解决这些问题,这就构成了应用层的主要内容即:精确定义这些通信规则。 应用层有不少应用广泛的协议,像域名系统(DNS)、文件传输协议(

    2023年04月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包