-
-
[转帖]覆盖地址HOOK API
-
发表于: 2006-3-9 16:53 4890
-
前天看到kruglinski的一段程序,我看了一下今天花了一下午的时间来自己实现了一个。不过我的没有用动态地址的方法,而是自己去写了静态的地址到里面灵活性没有他的大不过功能上面还是差不多的。下面我简单讲一下我的原理。
跳转的具体原理
就是用两句汇编句:
mov eax , 12345678 (自定义函数的地址,每个机器各不相同是需要手动调整)
jmp eax
汇编代码:
e8 78 56 34 12 //第2,3,4,5是需要手工调整的
ff e0
1。计算出地址“冒名顶替函数”的入口地址。
2。得要HOOK的API函数的地址。
3。保存API函数的入口内容。
4。修改API函数的入口内容。
5。再在“冒名顶替函数”里面实现完其他功能后,把原来的API函数的入口内容给回去。
代码如下:
//通过覆盖系统函数的地址来实现HOOK API
//
#include "stdio.h"
#include "windows.h"
#include "tchar.h"
BYTE addr_old[8] = {0};
BYTE addr_new[8] = { 0xB8, 0x20, 0x10, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; //第2,3,4,5是需要手工调整的(重要的步骤)
DWORD pfnMsgBox=0; //API函数地址
int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)
{
int ret = 0;
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery((void *)pfnMsgBox, &mbi, sizeof(mbi));
::VirtualProtect((void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);
// 写入原来的执行代码
::WriteProcessMemory(::GetCurrentProcess(),
(void *)pfnMsgBox,
addr_old,
sizeof(DWORD)*2,
NULL);
::VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);
ret=MessageBox(hWnd,"gxter","gxter",uType);
return ret;
}
//----------------------------------------------程序入口
int main()
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));
printf("api入口地址: %x\n",pfnMsgBox);
VirtualQuery( (void *)pfnMsgBox, &mbi, sizeof(mbi) );
//修改我们要改的地址的页属性,为可读可写
VirtualProtect( (void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);
// 保存原来的执行代码
memcpy(addr_old, (void *)pfnMsgBox, 8);
// 写入新的执行代码
WriteProcessMemory( GetCurrentProcess(),
(void *)pfnMsgBox,
addr_new,
sizeof(DWORD)*2,
NULL);
//修改为原来的属性属性
VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);
//当调用这个函数的时候就跳到我的函数上面了
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
getchar();
return 0;
}
//--------------------------------the end-----------------------------
《自定义函数和API函数的跳转》
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。
#include "stdio.h"
#include "windows.h"
void fun();
int main()
{
fun();
getchar();
return 0;
}
void fun()
{
printf("write by Gxter!");
}
//自定义函数的跳转是程序中的跳转指令,然后由跳转指令跳转到函数的执行体。
/*
1。主程序中:00401038 E8 C8 FF FF FF call @ILT+0(_fun) (00401005)
2。跳转指令:00401005 E9 B6 00 00 00 jmp fun (004010c0)
3。函数执行体:004010C0 55 push ebp
//自定义函数是根据地址直接跳转
*/
//-----------------------------------the end------------------------------------------
//
//write by Gxter
//
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。
#include "stdio.h"
#include "tchar.h"
#include "windows.h"
int main()
{
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
getchar();
return 0;
}
//API函数调用过程
/*
1。主程序中:00401038 FF 15 94 52 42 00 call dword ptr [__imp__MessageBoxA@16 (00425294)]
地址004252B4中的内容 "6544 77E1"
(是根据地址的内容里面的地址跳转)
2。API函数的执行体:77E16544 55 push ebp
*/
//--------------------------------the end------------------------------------------------
跳转的具体原理
就是用两句汇编句:
mov eax , 12345678 (自定义函数的地址,每个机器各不相同是需要手动调整)
jmp eax
汇编代码:
e8 78 56 34 12 //第2,3,4,5是需要手工调整的
ff e0
1。计算出地址“冒名顶替函数”的入口地址。
2。得要HOOK的API函数的地址。
3。保存API函数的入口内容。
4。修改API函数的入口内容。
5。再在“冒名顶替函数”里面实现完其他功能后,把原来的API函数的入口内容给回去。
代码如下:
//通过覆盖系统函数的地址来实现HOOK API
//
#include "stdio.h"
#include "windows.h"
#include "tchar.h"
BYTE addr_old[8] = {0};
BYTE addr_new[8] = { 0xB8, 0x20, 0x10, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; //第2,3,4,5是需要手工调整的(重要的步骤)
DWORD pfnMsgBox=0; //API函数地址
int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)
{
int ret = 0;
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery((void *)pfnMsgBox, &mbi, sizeof(mbi));
::VirtualProtect((void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);
// 写入原来的执行代码
::WriteProcessMemory(::GetCurrentProcess(),
(void *)pfnMsgBox,
addr_old,
sizeof(DWORD)*2,
NULL);
::VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);
ret=MessageBox(hWnd,"gxter","gxter",uType);
return ret;
}
//----------------------------------------------程序入口
int main()
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));
printf("api入口地址: %x\n",pfnMsgBox);
VirtualQuery( (void *)pfnMsgBox, &mbi, sizeof(mbi) );
//修改我们要改的地址的页属性,为可读可写
VirtualProtect( (void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);
// 保存原来的执行代码
memcpy(addr_old, (void *)pfnMsgBox, 8);
// 写入新的执行代码
WriteProcessMemory( GetCurrentProcess(),
(void *)pfnMsgBox,
addr_new,
sizeof(DWORD)*2,
NULL);
//修改为原来的属性属性
VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);
//当调用这个函数的时候就跳到我的函数上面了
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
getchar();
return 0;
}
//--------------------------------the end-----------------------------
《自定义函数和API函数的跳转》
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。
#include "stdio.h"
#include "windows.h"
void fun();
int main()
{
fun();
getchar();
return 0;
}
void fun()
{
printf("write by Gxter!");
}
//自定义函数的跳转是程序中的跳转指令,然后由跳转指令跳转到函数的执行体。
/*
1。主程序中:00401038 E8 C8 FF FF FF call @ILT+0(_fun) (00401005)
2。跳转指令:00401005 E9 B6 00 00 00 jmp fun (004010c0)
3。函数执行体:004010C0 55 push ebp
//自定义函数是根据地址直接跳转
*/
//-----------------------------------the end------------------------------------------
//
//write by Gxter
//
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。
#include "stdio.h"
#include "tchar.h"
#include "windows.h"
int main()
{
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
getchar();
return 0;
}
//API函数调用过程
/*
1。主程序中:00401038 FF 15 94 52 42 00 call dword ptr [__imp__MessageBoxA@16 (00425294)]
地址004252B4中的内容 "6544 77E1"
(是根据地址的内容里面的地址跳转)
2。API函数的执行体:77E16544 55 push ebp
*/
//--------------------------------the end------------------------------------------------
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2023-8-13 00:06
伟叔叔
为你点赞~
2023-5-9 00:05
一笑人间万事
为你点赞~
2023-4-24 01:02
心游尘世外
为你点赞~
2023-4-13 00:34
飘零丶
为你点赞~
2023-4-12 00:35
QinBeast
为你点赞~
2023-3-20 04:49
shinratensei
为你点赞~
2023-3-20 04:46
赞赏
他的文章
- [转帖]用多媒体学Visual C++ 2008 系统学习VC 2008必备教程 8022
- [下载]新壳 OSP软件平台功能说明 5836
- [讨论]微点不识英文?! 6300
- [转帖]R3隐藏硬盘分区 8012
- [推荐]内存清零KILL进程 16295
看原图
赞赏
雪币:
留言: