PP的秘密基地

纸上得来终觉浅,绝知此事要躬行.

0%

前言

在上两个Hook文章中,我实现了虚函数表钩子(VMT Hook)导入地址表(IAT)Hook

VMT Hook和IAT Hook的本质上都修改了内存(重定向了函数指针),所以也比较容易被检测

今天介绍一个不需要修改内存且几乎不会被检测的Hook,也就是向量化异常处理(VEH) Hook

什么是VEH?

在Windows上有着许多的异常处理方法,帮进程在遇到异常时免于崩溃。比如C++原生异常、结构化异常处理SEH(__try__finally__except就是VC++对SEH的封装)以及本文中要使用的向量化异常处理(VEH),VEH基于进程,且捕获异常的优先级仅次于调试器。

阅读全文 »

前言

在上一个Hook文章中,我利用C++虚函数的特性,实现了虚函数表钩子(VMT Hook)

VMT Hook实现起来简单,但使用范围有限。只能用来挂钩有虚函数的对象。

今天介绍一个适用范围相对更广一些的Hook技术,也就是导入地址表(IAT)Hook。

什么是IAT?

如果你熟悉程序编译的过程,你会知道链接分为两种:

  • 静态链接:代码从其所在的静态链接库中拷贝到最终的可执行程序中,在程序被执行时,这些代码会被装入到该进程的虚拟地址空间
  • 动态链接:代码被放到动态链接库中,在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间

而IAT(导入地址表)就是动态链接的实现方法。

阅读全文 »

前言

忙碌的春节过去了(吐槽一下,现在南京不给放炮仗,真是越来越没有年味了,不但是礼炮,连擦炮、摔炮都买不到),终于能闲下来学习和写博文了。今天填一下上篇文章留下的坑。实现一个支持单字通配符的Sunday模糊匹配算法

阅读全文 »

实现 strStr() 函数

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1:

输入: haystack = “hello”, needle = “ll”
输出: 2

示例 2:

输入: haystack = “aaaaa”, needle = “bba”
输出: -1

阅读全文 »

前言

最近在刷LeetCode,昨天做到了这一题 237. 删除链表中的节点,题目很简单,官方题解中,给出的Java代码如下

1
2
3
4
5
6
7
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
// 作者:LeetCode
// 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/solution/shan-chu-lian-biao-zhong-de-jie-dian-by-leetcode/
// 来源:力扣(LeetCode)

可以看出,官方题解的思路是直接将自身替换成了下一个节点

我平时使用C++来做题,但如果简单的将上述代码修改成C++就可能会导致严重的内存泄漏事故

阅读全文 »

前言

虚函数表(VMT)Hook,又叫指针重定向,是一种常见的Hook技术,在游戏外挂程序中最常见。且多用于在Direct3D / OpenGL引擎游戏里实现内置叠加层。

虚函数表(VMT)

本文中VMT就代指虚函数表。

虚函数表是C++实现多态的一种方式。

每一个有虚函数的类(或有虚函数类的派生类)都有一个VMT,VMT本质上就是一个函数指针数组,通常位于对象内存布局的开头或结尾。每当C++类声明虚(virtual)函数时,编译器都会增加一个条目到VMT中。

阅读全文 »