c++拦截(hook)函数的实现方法


dll的写法如下:

yufd.cpp

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

 char pcName[1024] = "";
 char className[1024] = "";
 HWND h = 0;
extern "C" _declspec(dllexport) int  TxEntry()
{
    //int id = GetCurrentProcessId();
    //
    
    while(true)
    {
        // EnumWindows(EnumWindowsProc,-1);//枚举所有窗口
        //HWND h = FindWindow("QQTangWinClass","");
        HANDLE d = (HANDLE)GetCurrentProcess();
        if(d>0)
        {
            sprintf_s(pcName,"%d",d);
            MessageBox(NULL,"成功",pcName,MB_ICONSTOP);
            break;
        }
        else
            MessageBox(NULL,"还未","d",MB_ICONSTOP);
        Sleep(2000);
    }
    return 1;
}

yufd.h

extern "C" _declspec(dllexport) int  TxEntry();
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

开始实现注入代码:

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

#include "stdafx.h"
#include "windows.h"

#include "Tlhelp32.h"
#include<stdio.h>
#include<string>
using namespace std;

#define FLATJMPCODE_LENGTH 5            //x86 平坦内存模式下,绝对跳转指令长度
#define FLATJMPCMD_LENGTH  1            //机械码0xe9长度
#define FLATJMPCMD         0xe9         //对应汇编的jmp指令

// 记录被打桩函数的内容,以便恢复
BYTE g_apiBackup[FLATJMPCODE_LENGTH+FLATJMPCMD_LENGTH];

bool setStub(LPVOID ApiFun,LPVOID HookFun)
{
  HANDLE file_handler = GetCurrentProcess();           //获取进程伪句柄
  DWORD oldProtect,TempProtectVar;
  char newCode[6];                                     //用于读取函数原有内存信息
  int SIZE = FLATJMPCODE_LENGTH+FLATJMPCMD_LENGTH;     //需要修改的内存大小
  if(!VirtualProtectEx(file_handler,ApiFun,SIZE,PAGE_READWRITE,&oldProtect))  //修改内存为可读写
  {
    return false;
  }
  if(!ReadProcessMemory(file_handler,ApiFun,newCode,SIZE,NULL))              //读取内存
  {
    return false;
  }
  memcpy((void*)g_apiBackup,(const void*)newCode, sizeof(g_apiBackup));      //保存被打桩函数信息
  *(BYTE*)ApiFun = FLATJMPCMD;                                    
        *(DWORD*)((BYTE*)ApiFun + FLATJMPCMD_LENGTH) = (DWORD)HookFun - (DWORD)ApiFun - FLATJMPCODE_LENGTH;   //桩函数注入 
    VirtualProtectEx(file_handler,ApiFun,SIZE,oldProtect,&TempProtectVar);  //恢复保护属性
}
void test()
{
    MessageBox(NULL,"hook","",1);
}
int _tmain(int argc, _TCHAR* argv[])
{
    typedef int (*proc)();
    HMODULE h=LoadLibrary("yufd.dll");
    BYTE* v = (BYTE*)GetProcAddress(h,"TxEntry");
    //v();
    proc tt = (proc)v;
    tt();
    string str ;
    //strcat(str,);
    str += "{";
    for(int i=0;i<100;i++)
    {
        //printf("%d,",*(v+i));
        char ss[10] ;
        sprintf_s(ss,"%d,", *(v+i));

        str += ss;
    }
    str +="}";

    FILE *file;
    errno_t err = fopen_s(&file,"log.txt","w");

    if(err==0)
    {
        fprintf(file,"%s",str);    
    }
    else
    {
    printf("Thefile'crt_fopen_s.c'wasnotopened\n");
    }
    fclose(file);
    /*PROCESSENTRY32 uProcess;
    uProcess.th32ProcessID = warpid;
    CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,uProcess.th32ProcessID);*/
    //{195}
    //HANDLE file_handler = GetCurrentProcess();           //获取进程伪句柄
    
    setStub(v,test);

    tt();
    //system("pause");
    return 0;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM