|

提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream>
DWORD head;
int nRet;
BYTE orig_code[5] = {0x90, 0x90, 0x90, 0x90, 0x90};//存放原始的指令
BYTE hook_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到MyMessageBoxA的指令
BYTE jmp_org_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到原起始地址后5字节的指令
int MyMessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
int MyFunc();
void Hook();
int jmp_back();
ULONG OldFuncAddr;
ULONG MyFuncAddr;
ULONG jmp_backAddr;
void Hook()
{
DWORD dwOldProtect;
OldFuncAddr = (ULONG)MessageBoxA;
//1
MyFuncAddr = *(ULONG *)((BYTE *)MyMessageBoxA+1) + (ULONG)MyMessageBoxA + 5; //计算函数myMessageBoxA的实际地址
//2
jmp_backAddr = *(ULONG *)((BYTE *)jmp_back+1) + (ULONG)jmp_back + 5; //计算jmp_back函数的实际地址
//3 修改jmp_back函数的实际地址 与 MESSAGEBOX前五个字节内存为可读可写
VirtualProtect((LPVOID)jmp_backAddr, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);
VirtualProtect((LPVOID)OldFuncAddr, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
//计算跳转地址
*((ULONG*)(hook_code+1)) = (ULONG)MyFuncAddr - (ULONG)OldFuncAddr - 5; //计算需要从MESSAGEBOX跳转到自己函数的差距地址
memcpy(orig_code,(BYTE *)OldFuncAddr, 5);//保存老函数中的5个字节
memcpy((BYTE*)OldFuncAddr, hook_code, 5);//修改老函数的前五个字节
//计算返回地址
*((ULONG*)(jmp_org_code+1)) = (ULONG)OldFuncAddr - (ULONG)jmp_backAddr - 5; //计算 老函数到jmp_back函数的差异地址
//这里一开始我很疑惑,这样不就死循环了 注意他前面还有五个字节,也就刚好错开
memcpy((BYTE *)jmp_backAddr, orig_code, 5); //把老函数的前五个值复制到jmp_back的五个字节
memcpy((BYTE *)jmp_backAddr + 5, jmp_org_code, 5); //这里是jmp_back到老函数的差异地址
}
__declspec(naked) int jmp_back()
{
__asm
{
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
}
}
__declspec(naked) int MyMessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
__asm
{
pop head //ebp+4都知道是什么
pop hWnd
pop lpText
pop lpCaption
pop uType
}
MyFunc();//加入自己的函数
__asm
{
//压栈过程
push uType
push lpCaption
push lpText
push hWnd
push head
//跳回MessageBoxA入口点
jmp jmp_back;
ret;
}
}
int MyFunc() //随便定义的函数
{
printf("Hello World\r\n");
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
Hook();
int rt = MessageBoxA(NULL, "Hello World", "Title", MB_OK);
getchar();
return 0;
}
联系我时,请说是在 挂海论坛 上看到的,谢谢! |
上一篇: 【此贴必火】麋鹿助手开源超级变态菜单 、、、、类似迷茫菜单下一篇: 解决TP在X64内核级别对调试对象做的手脚
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。
|