我的目的是在98下面挂钩createfile和writefile,一开始用的WriteProcessMemory()失败了,在网上搜索了一下说:Win9X下,kernel32.dll,user32.dll,gdi32.dll这些代码是处于系统保护中的,用户无法在ring3下对他们进行改写。同时找了一段代码:
//在Ring0状态下修改系统共享的代码
Ring0WriteMemory(void * dst,void *src,int copySize);
这个函数具体的代码大家可以在网上搜,到处都有。
……
好了到此为止出现问题了,我在test.exe中注入了挂钩createfile和writefile的dll,成功了。但是现在出现了一个问题,在test.exe启动的情况下,如果打开电脑上其他任何的文件都出现非法操作。
我是这么理解的,因为kernel32.dll,user32.dll,gdi32.dll中的代码是共享地址中的,我在test.exe启动的时候挂钩了createfile和writefile两个api,此时我打开电脑的任何文件,这个操作貌似也要调用createfile,而此时createfile已经被挂钩了,所以出现非法操作。
不知道我这样理解对不对,如果对的,想问问怎么解决
//在Ring0状态下修改系统共享的代码
Ring0WriteMemory(void * dst,void *src,int copySize);
这个函数具体的代码大家可以在网上搜,到处都有。
……
好了到此为止出现问题了,我在test.exe中注入了挂钩createfile和writefile的dll,成功了。但是现在出现了一个问题,在test.exe启动的情况下,如果打开电脑上其他任何的文件都出现非法操作。
我是这么理解的,因为kernel32.dll,user32.dll,gdi32.dll中的代码是共享地址中的,我在test.exe启动的时候挂钩了createfile和writefile两个api,此时我打开电脑的任何文件,这个操作貌似也要调用createfile,而此时createfile已经被挂钩了,所以出现非法操作。
不知道我这样理解对不对,如果对的,想问问怎么解决
1)、MyCreateFile:
HANDLE WINAPI MyCreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
HANDLE nReturn = NULL;
myHookCreateFile.SetHookOff();
myHookWriteFile.SetHookOff();
nReturn = CreateFileA(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
//如果发现打开的文件,就是要监控的文件,此处sControlPrintPort中保存了指定的文件名,则将此文件的句柄保存在hookFileHandle变量中。
if(strcmpi((const char *)sControlPrintPort,lpFileName) == 0 ){
hookFileHandle = nReturn;
}
myHookCreateFile.SetHookOn();
myHookWriteFile.SetHookOn();
return (nReturn);
}2)、MyWriteFile:
int WINAPI MyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped){
int nReturn = 0;
int result;
DWORD dwCount;
myHookCreateFile.SetHookOff();
myHookWriteFile.SetHookOff();
//如果写文件的句柄为要监控的句柄,则将写入内容发给串口通讯模块,并将串口模块返回的数据
//写入到监控的句柄内,完成写入内容的截取和替换
if(hookFileHandle == hFile){
此处进行一些自己的操作
nReturn = WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
}
else{
nReturn = WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
}
myHookCreateFile.SetHookOn();
myHookWriteFile.SetHookOn();
return (nReturn);
} 以上是我自己的MyCreateFile和MyWriteFile,内部其实只对指定的文件进行了操作。
3)、我的挂钩方式:JMP+MyFuncAddress的方式。
在Nt下面可以调用WriteProcessMemory替换掉Createfile的前五个字节;可是由于9x下Kernel32.dll,user32.dll,gdi32.dll这些代码是处于系统保护中的,用户无法在ring3下对他们进行改写。网上给了一个方法在Ring0状态下修改系统共享。
具体代码见http://topic.csdn.net/t/20030316/20/1537968.html的5楼。总结:在这种情况下,出现了我在顶楼描述的问题。
诚心求教 非常非常的诚心,知道的还请指点一下,因为很急,催的很紧,我也很郁闷 哭啊 呜啊呜啊。
这个帖子也讲了怎么解决问题,我没看懂他那个代码,有没有好心人给我讲解讲解呀???