这样一个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;
}