博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
API HOOK(MessageBoxA)
阅读量:5260 次
发布时间:2019-06-14

本文共 2420 字,大约阅读时间需要 8 分钟。

笔记,非专业,只为自己看得懂,用语不专业。

API HOOK

HOOK 5字节。

新地址-老地址-5= HEX,     HEX是倒过来显示的。    

比如

00411082 > /E9 590B0000 JMP 00411BE0

 0B59

 

直接上代码。

// HookTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"int MyMessageBoxA(                  HWND hWdn,                  LPCTSTR lpText,                  LPCTSTR lpCaption,                  UINT uType){    char *txt="";    _asm    {        RETN 2;    }    //Sleep();    return 0;}//ULONG OldFunAddr;void My_Hook(ULONG OldFunAddr,ULONG NewFunAddr,int CodeLen);ULONG My_GetApiAddress(char *lpDllName,char *lpFunName);int _tmain(int argc, _TCHAR* argv[]){    char *dllName="user32.dll";    char *lpfunName="MessageBoxA";        ULONG NewFuncAddr=(ULONG)MyMessageBoxA;    MessageBoxA(NULL,"坐等HOOK","坐等HOOK title ",MB_YESNO);    ULONG     OldFunAddr=My_GetApiAddress(dllName,lpfunName);    if (OldFunAddr==NULL)    {        return NULL;    }    My_Hook(OldFunAddr,NewFuncAddr,5);    MessageBoxA(NULL,"关闭句柄","坐等HOOK title ",MB_YESNO);    //printf("1");    //return 0;}BYTE hook_code[5] = {
0xe9, 0, 0, 0, 0};//存放跳转到MyMessageBoxA的HEXBYTE jmp_org_code[5] = {
0xe9, 0, 0, 0, 0};//存放跳转到原起始地址后5字节的指令BYTE m_lpJmpCode[5]={
0x90,0x90,0x90,0x90,0x90};void My_Hook(ULONG OldFunAddr,ULONG NewFunAddr,int CodeLen){ //if (IsBadReadPtr((void *)OldFunAddr,CodeLen)) //{ //} BYTE JmpMyCode[5]={
0}; ULONG m_oldFunAddr=OldFunAddr; ULONG m_NewFunAddr=NewFunAddr; INT m_CodeLen=CodeLen; DWORD lpflOldProtect =NULL; HANDLE hprocss=GetCurrentProcess(); VirtualProtectEx(hprocss,(LPVOID )m_oldFunAddr,5,PAGE_EXECUTE_READWRITE,&lpflOldProtect); //旧地址 *((ULONG*)(hook_code+1))=m_NewFunAddr-m_oldFunAddr-5;//计算HEX 地址。 memcpy((LPVOID)m_oldFunAddr,hook_code,5);//用无类型指针 把 HEX拷贝过去。 VirtualProtectEx(hprocss,(LPVOID)m_oldFunAddr,5,lpflOldProtect,&lpflOldProtect);//修改回来。 CloseHandle(hprocss);}ULONG My_GetApiAddress(char *lpDllName,char *lpFunName){ FARPROC fun; HMODULE dll; UINT m_oldFunAdd; dll =GetModuleHandleA(lpDllName);//获取DLL 模块句柄 if (dll==0) { dll=LoadLibraryA(lpDllName); printf("LoadLibraryA \r\n"); } if (dll==0) { return NULL; } fun=GetProcAddress(dll,lpFunName); m_oldFunAdd=(ULONG)fun; printf("GetProcAddress \r\n"); printf("%s Address:%d \r\n",lpFunName,m_oldFunAdd); return m_oldFunAdd;}

刚开始学习C++ 语法方面很不熟悉。

 

然后

转载于:https://www.cnblogs.com/yueyue184/archive/2012/04/30/2476666.html

你可能感兴趣的文章
如何在PHP中使用FusionCharts
查看>>
读《一个人的朝圣》| 沾染上称为信仰的东西,都会不一样
查看>>
MySQL导入数据报 Got a packet bigger than‘max_allowed_packet’bytes 错误的解决方法
查看>>
jquery中“this”不同时刻的不同含义
查看>>
hdu 1686 & poj 2406 & poj 2752 (KMP入门三弹连发)
查看>>
iOS的多版本配置(版本分离,多环境配置)
查看>>
Java中定时器相关实现的介绍与对比之:ScheduledExecutor
查看>>
【URAL】1297 Palindrome
查看>>
Android学习笔记:如何设置ImageView中图片的显示方式
查看>>
三次握手
查看>>
Scale和Resolution的含义及转换算法
查看>>
according
查看>>
配置tomcat的开发环境
查看>>
实现可串行化类的步骤
查看>>
mac安装OpenCV
查看>>
二分查找算法
查看>>
Bootstrap响应式导航
查看>>
21天战拖记——Day20:整理自己的桌面(2014-05-23)
查看>>
Linux curl命令中,HTTP 302处理
查看>>
WS103C8例程——串口2【worldsing笔记】
查看>>