这样一个dll注入到a.exe中是不是就可以完成拦截a.exe运行时调用readprocessmemory()这个函数的功能呢
假设a.exe加载了一个他自己的一个b.dll,b.dll里面也调用了readprocessmemory(),那我这个dll能拦截到这个b.dll的这个调用么???????
部分DLL代码。// hookread.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "hookread.h"
#include <windows.h>
#include <stdio.h>
int run();
unsigned long baseaddress=0XAAAAAA;///这里是kernel32.dll被加载的基址。。假设我已经找到了。。这个是已知的量
BOOL WINAPI myfun(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) ;//我的函数的申明
typedef BOOL (WINAPI *p)(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead );//表示这是一个指向返回值为BOOL的函数指针,p为指针变量表示函数地址PROC()
char oldadd[5] = {0};
char myadd[5] = {(char)0xe9};//e9为机器码,后面就为相对跳转偏移,Jump指令占用5个字节
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
run();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int run()
{
DWORD myjmp = 0;
myjmp = (DWORD)myfun - (DWORD)(baseaddress+0x3B43C) - 5; //函数名就是函数地址,0x3B43C是readprocessmemory在 DLL中的地址.
memcpy(myadd+1,&myjmp, 4); //一个字两个字节,双字就是四个字节
ReadProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), oldadd, 5, NULL);//读出原来的前5个字节
WriteProcessMemory((void*)-1,(LPVOID)(baseaddress+0x3B43C), myadd, 5, NULL);//写入我的函数地址。
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//我的函数
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL WINAPI myfun(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
WriteProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), oldadd, 5, NULL);
//写入旧的代码能顺利完成本需要的工作。
MessageBox(NULL,"hook read","",0);//类似于对这个过程操作
ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
//完成那个本来的调用这个函数任务
WriteProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), myadd, 5, NULL);
//又回来写入自己的地址
return TRUE;
}
假设a.exe加载了一个他自己的一个b.dll,b.dll里面也调用了readprocessmemory(),那我这个dll能拦截到这个b.dll的这个调用么???????
部分DLL代码。// hookread.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "hookread.h"
#include <windows.h>
#include <stdio.h>
int run();
unsigned long baseaddress=0XAAAAAA;///这里是kernel32.dll被加载的基址。。假设我已经找到了。。这个是已知的量
BOOL WINAPI myfun(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) ;//我的函数的申明
typedef BOOL (WINAPI *p)(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead );//表示这是一个指向返回值为BOOL的函数指针,p为指针变量表示函数地址PROC()
char oldadd[5] = {0};
char myadd[5] = {(char)0xe9};//e9为机器码,后面就为相对跳转偏移,Jump指令占用5个字节
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
run();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int run()
{
DWORD myjmp = 0;
myjmp = (DWORD)myfun - (DWORD)(baseaddress+0x3B43C) - 5; //函数名就是函数地址,0x3B43C是readprocessmemory在 DLL中的地址.
memcpy(myadd+1,&myjmp, 4); //一个字两个字节,双字就是四个字节
ReadProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), oldadd, 5, NULL);//读出原来的前5个字节
WriteProcessMemory((void*)-1,(LPVOID)(baseaddress+0x3B43C), myadd, 5, NULL);//写入我的函数地址。
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//我的函数
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL WINAPI myfun(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
WriteProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), oldadd, 5, NULL);
//写入旧的代码能顺利完成本需要的工作。
MessageBox(NULL,"hook read","",0);//类似于对这个过程操作
ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
//完成那个本来的调用这个函数任务
WriteProcessMemory((void*)-1, (LPVOID)(baseaddress+0x3B43C), myadd, 5, NULL);
//又回来写入自己的地址
return TRUE;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货