46.修复HOOK对代码造成的破坏

news2024/10/6 18:24:08

上一个内容:45.使用hook点链表实现指定跳转

以 45.使用hook点链表实现指定跳转 它的代码为基础进行修改

此代码已实现无敌与秒杀功能

HOOKPOINT.h文件里的修改

#pragma once

typedef struct CPUINFO {
    unsigned eflags;
    unsigned edi;
    unsigned esi;
    unsigned ebp;
    unsigned esp;
    unsigned ebx;
    unsigned edx;
    unsigned ecx;
    unsigned eax;
    unsigned eip;
}*PCPUINFO;
typedef bool (*HOOKBACK)(PCPUINFO);
typedef  unsigned char uchar;


typedef class HOOKPOINT
{
private:
    // Address表示在哪进入外挂代码,也就是在什么地方做hook
    LPVOID Address;
    HOOKPOINT* NextPoint;
    HOOKPOINT* BackPoint;
    
public:
    // 外挂代码的地址
    HOOKBACK DestCall;
    // 修复区代码
    char* CodeFix;
    LPVOID AddressRet;
public:
    HOOKPOINT();
    ~HOOKPOINT();
    HOOKPOINT(LPVOID, LPVOID, HOOKBACK, uchar lenth, HOOKPOINT*, HOOKPOINT* _NextPoint = NULL);
    HOOKPOINT* AddPonit(LPVOID, LPVOID, HOOKBACK, uchar lenth);
    HOOKPOINT* FindPoint(LPVOID);
}*PHOOKPOINT;

HOOKPOINT.cpp文件里的修改

unsigned GetJMPCode(unsigned distance, unsigned eip);
HOOKPOINT::~HOOKPOINT()
{
    delete CodeFix;
}
HOOKPOINT::HOOKPOINT(LPVOID _adr, LPVOID _adrRet, HOOKBACK _hbk, uchar lenth, HOOKPOINT* _BackP, HOOKPOINT* _NextPoint):
    Address(_adr), AddressRet(_adrRet), DestCall(_hbk), BackPoint{ _BackP }, NextPoint{ _NextPoint }
{
    CodeFix = new char[lenth + 0x5];
    memcpy(CodeFix, _adr, lenth);
    /**
      下面是之前分析剑侠情缘用来无敌的代码
      mov [esi + 10], edi   
      mov eax, [esi+10]
      jmp Address+lenth // 这个是执行完剑侠情缘原有代码让它再跳回去

      CodeFix长度是 lenth+0x5,lenth是要进行hook位置的指令长度,0x5是执行完指令之后让他跳回去

    */
    DWORD dOld;
    CodeFix[lenth] = 0xE9;
    unsigned* adr = (unsigned*)(CodeFix + lenth + 1);
    adr[0] = GetJMPCode((unsigned)_adr + lenth, (unsigned)&CodeFix[lenth]);

    VirtualProtect(CodeFix, lenth+0x5, PAGE_EXECUTE_READWRITE, &dOld);
}
HOOKPOINT* HOOKPOINT::AddPonit(LPVOID _adr,LPVOID _adrRet, HOOKBACK _hbk, uchar lenth)
{
    NextPoint = new HOOKPOINT(_adr, _adrRet, _hbk, lenth, this);
    return NextPoint;
}

htdHook.cpp文件里的修改

void _stdcall DisHook(PCPUINFO e) {

    /**
        call指令执行时会让eip指向下一条指令的位置,
        这里减去0x5是让他回到call的位置,也就是得到从哪来的
    */
    unsigned _eip = e->eip - 0x5;

    PHOOKPOINT point = htdHookPtr->Points.FindPoint((LPVOID)_eip);
    if (point) {
        if(point->DestCall(e)){
            // 继续执行原有代码
            e->eip = (unsigned)point->CodeFix;
        }else{
            // 调转到指定位置执行
            e->eip = (unsigned)point->AddressRet;
        }
    }
}
void htdHook::SetHook(LPVOID Address, HOOKBACK hokBack, uchar len, LPVOID AddressRet)
{
    DWORD dOld;
    DWORD dNew;

    PPointLast = PPointLast->AddPonit(Address, AddressRet, hokBack, len);

    VirtualProtect(Address, 0x5, PAGE_EXECUTE_READWRITE, &dOld);

    char* code = (char*)Address;
    code[0] = 0xE8;
    unsigned* Adr = (unsigned*)(code + 1);
    Adr[0] = GetJMPCode((unsigned)data_code, (unsigned)Address);

    VirtualProtect(Address, 0x5, dOld, &dNew);
}

htdHook.h文件里的修改

    void SetHook(LPVOID Address, HOOKBACK ookBack, uchar len, LPVOID AddressRet);

CWndMain.cpp文件中的修改


bool Wudi(PCPUINFO e) {

    if (e->esi==0x4cef08)
    {
        e->edi = 0;
    }
    else {
        e->edi = *((int*)(e->esi + 0x10));// 秒杀(除了我们的角色都得死)
    }
    return true;
}

bool NewWudi(PCPUINFO e) {
    //AfxMessageBox(L"测试执行完这个辅助代码跳转");
    return true;
}

void CWndMain::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    hook.SetHook((LPVOID)0x41FDB2, Wudi, 6, 0);
    hook.SetHook((LPVOID)0x41FD40, NewWudi, 8, (LPVOID)0x41FE40);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)

下面是一些git的常用命令和基本操作,可以当做平常的笔记查询,用于学习!!! 文章目录 前言 一、git 二、git常用命令 总结 前言 下面是一些git的常用命令和基本操作,可以当做平常的笔记查询,用于…

【python】Python中常用的数据结构——列表、元组和字典

python中的数据结构 列表、元组、字典的区别元组,字典,列表三者之间如何实现嵌套生成一个单一元素的元组、列表列表的地址列表、元组和字典的增删改查 列表、元组、字典的区别 列表、元组和字典是Python中常用的数据结构,它们各自有不同的特…

Infinitar链游新发展新机遇

区块链游戏市场在近年来经历了显著增长,吸引了大量的投资和关注。随着加密货币和NFT(非同质化代币)概念的普及,越来越多的投资者、游戏开发者和看到了区块链技术在游戏领域的应用潜力,纷纷涌入市场。区块链游戏的用户量…

昇思25天学习打卡营第07天 | 函数式自动微分

昇思25天学习打卡营第07天 | 函数式自动微分 文章目录 昇思25天学习打卡营第07天 | 函数式自动微分函数与计算图微分函数与梯度Stop GradientAuxiliary data 神经网络梯度计算总结打卡 神经网络的训练主要使用反向传播算法,首先计算模型预测值(logits&am…

Prompt-Free Diffusion: Taking “Text” out of Text-to-Image Diffusion Models

CVPR2024 SHI Labshttps://arxiv.org/pdf/2305.16223https://github.com/SHI-Labs/Prompt-Free-Diffusion 问题引入 在SD模型的基础之上,去掉text prompt,使用reference image作为生成图片语义的指导,optional structure image作为生成图片…

【Leetcode笔记】406.根据身高重建队列

文章目录 1. 题目要求2.解题思路 注意3.ACM模式代码 1. 题目要求 2.解题思路 首先,按照每个人的身高属性(即people[i][0])来排队,顺序是从大到小降序排列,如果遇到同身高的,按照另一个属性(即p…

关于SAP SAP NetWeaver AS JAVA 授权问题漏洞(CVE-2020-6287)及修复

路径参考 SAP NetWeaver AS Java 严重漏洞 (CVE-2020-6287) 安全通告 - 威胁通告 - 绿盟科技-巨人背后的专家 SAP NOTE ​​​​​​https://me.sap.com/notes/2939665 找到路径 导航到 http(s)://<主机名>:port/nwa -> 配置 -> 基础架构 -> Java HTTP 提供…

Leetcode - 周赛403

目录 一&#xff0c;3200. 三角形的最大高度 二&#xff0c;3195. 包含所有 1 的最小矩形面积 I 三&#xff0c;3196. 最大化子数组的总成本 四&#xff0c;3197. 包含所有 1 的最小矩形面积 II 一&#xff0c;3200. 三角形的最大高度 本题是一道模拟题&#xff0c;可以先排…

从零开始手写STL库:Vector

从零开始手写STL库–Vector部分 文章目录 从零开始手写STL库--Vector部分Vector是什么Vector需要包含什么函数1&#xff09;基础成员函数2&#xff09;核心功能 基础成员函数的编写核心功能函数的编写总结 Vector是什么 std::vector 是一个动态数组&#xff0c;它在内存中以连…

安装Nginx以及简单使用 —— windows系统

一、背景 Nginx是一个很强大的高性能Web和反向代理服务&#xff0c;也是一种轻量级的Web服务器&#xff0c;可以作为独立的服务器部署网站&#xff0c;应用非常广泛&#xff0c;特别是现在前后端分离的情况下。而在开发过程中&#xff0c;我们常常需要在window系统下使用Nginx作…

SwiftUI中List的liststyle样式及使用详解添加、移动、删除、自定义滑动

SwiftUI中的List可是个好东西&#xff0c;它用于显示可滚动列表的视图容器&#xff0c;类似于UITableView。在List中可以显示静态或动态的数据&#xff0c;并支持垂直滚动。List是一个数据驱动的视图&#xff0c;当数据发生变化时&#xff0c;列表会自动更新。针对List&#xf…

关于下载obsidian SimpRead Sync中报错的问题

参考Kenshin的配置方法&#xff0c;我却在输入简悦的配置文件目录时多次报错。 bug如下&#xff1a; 我发现导出来的配置文件格式如下&#xff1a; 然后根据报错的bug对此文件名进行修改&#xff0c;如下&#xff1a; 解决。

【后端面试题】【中间件】【NoSQL】MongoDB查询优化2(优化排序、mongos优化)

优化排序 在MongoDB里面&#xff0c;如果能够利用索引来排序的话&#xff0c;直接按照索引顺序加载数据就可以了。如果不能利用索引来排序的话&#xff0c;就必须在加载了数据之后&#xff0c;再次进行排序&#xff0c;也就是进行内存排序。 可想而知&#xff0c;如果内存排序…

elasticsearch-users和elasticsearch-reset-password介绍

elasticsearch 内置 elastic, kibana, logstash_system,beats_system 共4个用户&#xff0c;用途如下&#xff1a; elastic 账号&#xff1a;内置的超级用户&#xff0c;拥有 superuser 角色。 kibana 账号&#xff1a;用来连接 elasticsearch 并与之通信。Kibana 服务器以该用…

ACL2023 | 如何用175条种子数据打造顶级指令模型?揭秘self-instruct:媲美InstructGPT001的秘密武器

1. 论文的核心问题和核心贡献 核心问题&#xff1a;该论文解决的问题是大规模语言模型在微调响应指令时过于依赖人工编写的指令数据&#xff0c;这些数据往往在数量、种类和创意上都存在局限&#xff0c;阻碍了模型的广泛泛化能力。研究的主要目标是开发一种方法&#xff0c;通…

Java实习手册(小白也看得懂)

秃狼说 距离俺发布的学习路线已经六个月了&#xff0c;那我给小伙伴的学习周期是四五个月左右&#xff0c;我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段&#xff0c;在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用&#xff0c;所…

代码随想录算法训练营第九天|151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、459.重复的子字符串

打卡Day9 1.151.翻转字符串里的单词2.右旋字符串3.28. 实现 strStr()4.459.重复的子字符串 1.151.翻转字符串里的单词 题目链接&#xff1a;翻转字符串里的单词 文档讲解&#xff1a; 代码随想录 思路&#xff1a;首先&#xff0c;移除多余的空格&#xff1b;然后&#xff0c…

Amesim应用篇-信号传递

前言 在Amesim中常见的信号传递是通过信号线连接&#xff0c;针对简单的模型通过信号线连接还可以是信号线清晰规整&#xff0c;方便查看。如果模型较复杂&#xff0c;传递信号的元件较多时&#xff0c;此时再继续使用信号线进行信号传递&#xff0c;可能会使草图界面看起来杂…

比赛获奖的武林秘籍:02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程,小白必看

比赛获奖的武林秘籍&#xff1a;02 国奖秘籍-大学生电子计算机类竞赛快速上手的流程&#xff0c;小白必看 摘要 本文主要介绍了大学生参加电子计算机类比赛&#xff08;电赛、光电设计大赛、计算机设计大赛、嵌入式芯片与系统设计大赛等比赛&#xff09;的流程和涉及到的知识…

一本超简单能用Python实现办公自动化的神书!让我轻松摆脱办公烦恼!

《超简单&#xff1a;用Python让Excel飞起来》 这本书旨在通过Python与Excel的“强强联手”&#xff0c;为办公人员提供一套高效的数据处理方案。书中还介绍了如何在Excel中调用Python代码&#xff0c;进一步拓宽了办公自动化的应用范围。 全书共9章。第1~3章主要讲解Python编…