Detours Express 3.0 使用测试 函数劫持

新建一个win32控制台项目做为测试

根据上一篇文章,把编译好的detours.lib,和detours.h 2个文件拷贝到项目路劲
一下为源码:

// detoursTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "detours.h"

#pragma comment(lib,"detours.lib")

static int (WINAPI *pold)(
    HWND hWnd,
    LPCWSTR lpText,
    LPCWSTR  lpCaption,
    UINT uType) = MessageBoxW;
int WINAPI newMessageBoxW(
    HWND hWnd,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType)
{
    printf("小伙,你被劫持了");
    return 0;
}

void hook()
{
    DetourRestoreAfterWith();//恢复原来的状态,重新开始劫持。
    DetourTransactionBegin();//拦截开始//   GetCurrentThread() DetourAttach() DetourTransactionCommit
    DetourUpdateThread(GetCurrentThread());//刷新当前的线程
    DetourAttach((void **)&pold, newMessageBoxW);//实现函数劫持 传入函数指针的地址 转换为指向空指针的指针 修改地址跳转到新的函数
    DetourTransactionCommit();//拦截生效
}

void unhook()
{
    DetourRestoreAfterWith();//恢复原来的状态,重新开始劫持。
    DetourTransactionBegin();//拦截开始//   GetCurrentThread() DetourAttach() DetourTransactionCommit
    DetourUpdateThread(GetCurrentThread());//刷新当前的线程
                                           //DetourAttach((void **)&pold, newMessageBoxW);//实现函数劫持,传入函数指针的地址,转换为指向空指针的指针
    DetourDetach((void **)&pold, newMessageBoxW);//实现撤销函数劫持,传入函数指针的地址,转换为指向空指针的指针,
                                                 //修改地址,跳转到原来的函数
    DetourTransactionCommit();//拦截生效
}

int main()
{
    MessageBoxW(0, L"她谁的老婆", L"徐倩是老太婆", 0);
    hook();
    MessageBoxW(0, L"她谁的老婆", L"徐倩是老太婆", 0);
    system("pause");
}

Detours 3.0 Express VS2015的编译

之前在VS2013下编译过Detours3.0
https://www.imxfeng.com/index.php/archives/145/

这次是记录在VS2015下的编译过程,win10 64位系统。
下载好Detours默认安装路劲:
C:Program Files (x86)Microsoft ResearchDetours Express 3.0

然后使用cd指令,在开发人员命令行中进入到detour的根目录

cd C:\Program Files (x86)\Microsoft Research\Detours Express 3.0

detour express3.0提供了makefile,也就是说可以使用vcvarsall自带的nmake命令对这个文件进行编译,从而生成静态库lib文件。这时我们使用nmake命令编译

nmake



- 阅读剩余部分 -

用vector实现二维向量

vector<vector<int> >vv(3, vector<int>(4));//这里,两个“>”间的空格是不可少的

将构造一个二维向量vv,它含有三个元素,每个元素含有4个int型元素的向量。编译器两次调用vector的构造函数构造对象vv,第一次调用构造函数构造了一个无名的含有4个0的vector<int>对象:

![[0] [1] [2] [3]
0 0 0 0][1]

第二次调用构造函数,以这个无名向量为初值初始化它的三个元素,结果是:
QQ截图20150929132707.png

vv[i]表示第i(i=0,1,2)行的元素组成的向量。vv.size()的值是3,vv[1].size()的值是4.



- 阅读剩余部分 -