欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

Inline Hook(ring3)的簡單C++實(shí)現(xiàn)方法

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

C++的Inline Hook代碼,采用了備份dll的方法,因此在自定義的函數(shù)中可以直接調(diào)用在內(nèi)存中備份的dll代碼,而不需要把函數(shù)頭部改來改去。用SetWindowsHookEx程序的穩(wěn)定性應(yīng)該會(huì)增加許多。

需要注意的是,例子中沒有把原函數(shù)的頭部幾個(gè)字節(jié)改回去是因?yàn)椋绦蚝芎唵?,僅僅測試了效果后便可以退出,沒有其他的功能。實(shí)際應(yīng)用中,還要在你注入的dll模塊卸載時(shí),把原函數(shù)的頭幾個(gè)字節(jié)改回去,以免影響到程序繼續(xù)運(yùn)行的穩(wěn)定性。(因?yàn)樽⑷氲某绦虿皇亲约旱?,我們?dāng)然不可能知道它到底在何時(shí)、有多少個(gè)我們所Hook的函數(shù)的調(diào)用)。

具體實(shí)現(xiàn)代碼如下:

#include <ntifs.h>
#include <windef.h> 
#include <stdio.h>
#pragma comment(lib, "psapi.lib")
//BYTE Org_Code[7];// 備份dll法, 因此就可以不需要
BYTE New_Code[7];
HMODULE hDllHandle = NULL; // 被 Hook 的 DLL 句柄
HANDLE hProcess = NULL; // 進(jìn)程句柄
LPVOID _MessageBoxA = NULL; // MessageBoxA() 原地址
DWORD _ShowMessage = NULL; // 自定義函數(shù)地址
void InlineHook();
//void UnInlineHook(); // 備份dll法, 因此就可以不需要
void BackupDll();
// 自定義函數(shù)
int WINAPI ShowMessage(HWND, LPTSTR, LPTSTR, UINT);
void main()
{
  hProcess = ::GetCurrentProcess();
  hDllHandle = ::LoadLibrary("user32.dll");
  if (hDllHandle == NULL)
    return;
  _MessageBoxA = (LPVOID)::GetProcAddress(hDllHandle, "MessageBoxA");
  if (_MessageBoxA == NULL)
    return;
  BackupDll();
  InlineHook();
  char szText[256];
  char szTitle[256];
  memset(szText, 0x0, sizeof(szText));
  memset(szTitle, 0x0, sizeof(szTitle));
  // 下列循環(huán)接收來自于用戶輸入的字符, 并使用 MessageBoxA()
  //來顯示, 嘗試下, 看看發(fā)生了什么. :)
  while (TRUE)
  {
    printf("Message Text: ");
    scanf("%s", szText);
    printf("Message Title: ");
    scanf("%s", szTitle);
    MessageBoxA(NULL, szText, szTitle, 0);
    printf("\n");
  }
  return;
}
void InlineHook()
{
  DWORD _JmpAddr = (DWORD)ShowMessage;
  // 構(gòu)造新頭部代碼
  New_Code[0] = 0xB8;            //
  memcpy(&New_Code[1], &_JmpAddr, 4);    // mov eax, _JmpAddr
  New_Code[5] = 0xFF;            //
  New_Code[6] = 0xE0;            // jmp eax
  DWORD dwOldProtect = 0;
  // 去內(nèi)存保護(hù)
  ::VirtualProtect(_MessageBoxA, 7, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  // 把新代碼寫入 MessageBoxA() 的頭部, 這也是Inline Hook
  //的核心所在.
  ::WriteProcessMemory(
    hProcess,
    _MessageBoxA,
    New_Code,
    sizeof(New_Code),
    NULL
  );
  // 寫內(nèi)存保護(hù)
  ::VirtualProtect(_MessageBoxA, 7, dwOldProtect, &dwOldProtect);
  return;
}
/*
void UnInlineHook() // 備份dll法, 因此就可以不需要
{
  return;
}
*/
int WINAPI ShowMessage(HWND hWnd, LPTSTR lpText, LPTSTR lpTitle, UINT uType)
{
  typedef int WINAPI SHOWMSG(HWND hWnd, LPTSTR lpText, LPTSTR lpTitle, UINT uType);
  SHOWMSG *pShowMsg = (SHOWMSG*)_ShowMessage;
  // 廢棄原先傳入的參數(shù), 自己定義對話框文本
  char buf[1024];
  ::wsprintf(buf, "The Text:"%s" was hacked by miku_fl", lpText);
  return pShowMsg(hWnd, buf, lpTitle, MB_ICONINFORMATION | MB_TOPMOST);
}
void BackupDll()
{
  MODULEINFO  Mdl_Info;
  LPVOID    lpNewDLL  =  NULL;
  // 獲取模塊信息
  ::GetModuleInformation(hProcess, hDllHandle, &Mdl_Info, sizeof(Mdl_Info));
  // 分配內(nèi)存空間, 用于備份 dll (這樣一來就不需要恢復(fù)原頭部代碼, 調(diào)用
  //完之后再重新寫自定義的頭部代碼).
  lpNewDLL = ::VirtualAllocEx(
    hProcess,
    NULL,
    Mdl_Info.SizeOfImage,
    MEM_COMMIT,
    PAGE_EXECUTE_READWRITE
  );
  if (lpNewDLL == NULL)
    return;
  // 在分配的內(nèi)存中寫入 dll 文件的內(nèi)容
  ::WriteProcessMemory(hProcess, lpNewDLL, Mdl_Info.lpBaseOfDll, Mdl_Info.SizeOfImage, NULL);
  // 計(jì)算自定義函數(shù)的地址.
  // 公式: 自定義地址 = 原API函數(shù)地址 - 模塊基址 + 分配內(nèi)存的基址
  _ShowMessage = (DWORD)_MessageBoxA - (DWORD)Mdl_Info.lpBaseOfDll + (DWORD)lpNewDLL;
  return;
}

希望本文所述程序?qū)嵗軐Υ蠹矣兴鶐椭?/p>

上一篇:VC++的if語句應(yīng)用范圍分析

欄    目:C語言

下一篇:C++實(shí)現(xiàn)inline hook的原理及應(yīng)用實(shí)例

本文標(biāo)題:Inline Hook(ring3)的簡單C++實(shí)現(xiàn)方法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3525.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有