武装的蔷薇
如何重写呢 能不能给一个范例 没有找到这个函数的实现源码
可以给你一个源码,我贴上我已经重写过的函数的调用代码,运行这个例子前请先运行任务管理器,源代码正在打包和调整结构,稍后会上传!
这是例子代码
#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <Shlwapi.h>
#define NOSYSTEMBASE_EXPORTS //取消导入BPHookFunction动态链接库,只使用SystemBase.dll动态链接库
#include "../../SystemBase/BPHookFunction/BPHookFunction.h"
/*
重写的代码需要的结构定义在压缩包根目录的winternl.h文件中,如果这个文件没有,请自行查找WRK,WDK(都是Windows源码中直接搬过来的)
代码中使用的自定义函数和重写的函数在本代码的压缩包中附带,如果需要请自行查看。
相关的DLL库请到../../SystemBase目录中复制你程序对应的版本的DLL到你的程序所在目录
64位程序:
DEBUG版本在../../SystemBase/x64/debug目录下
Release版本在../../SystemBase/x64/Release目录下
32位程序:
DEBUG版本在../../SystemBase/debug目录下
Release版本在../../SystemBase/Release目录下
../../SystemBase/X86目录下的程序为备份,请不要删除(其实我自己也搞糊涂了,我都不知道我为什么要保留这个目录了,但既然保留了酒保留下来吧!
作者 狂VS篮
QQ:332096943
如果有疑问请联系QQ
联系QQ请说明来意
*/
/*
被替代的系统函数,这些函数都是我重写的系统函数,它和系统函数的调用参数以及方式是完全一致的
重写的函数 系统函数
OpenProcessByProcessId OpenProcess
CloseObjectHandle CloseHandle
MmAllocateVirtualMemoryEx VirtualAllocEx
MmVirtualQueryEx VirtualQueryEx
MmFreeVirtualMemoryEx VirtualFreeEx
*/
//以下函数是自定义函数
/*
//////////////////////////////////////////////
函数:GetLastErrorMessageW
功能:返回错误代码的格式化字符
参数LastError 为Windows错误代码
返回值:一个指向格式化字符串的指针
/////////////////////////////////////////////
函数:FreeMemory
功能:释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
参数Data 为需要释放的内存地址
返回值:FALSE或者TRUE
/////////////////////////////////////////////
函数:IsAdmin
功能:检查进程释放有管理员权限
返回值:当函数返回TRUE时,进程有管理员权限,否则就返回FALSE
/////////////////////////////////////////////
函数:ShellExecuteExAs
功能:创建具有管理员权限的进程
参数 appName //进程名(实际上需要填写进程文件的地址,编程时没有注意)
appPath//需要填写进程文件的地址,编程时没有注意
lpParameter //指向进程创建参数的字符串
lpDirector//进程的默认目录
hwnd//填写NULL
hProcess//这个参数是一个指向HANDLE的一个指针,它返回一个已经创建成功的进程的句柄
Show//进程创建选项,默认为SW_SHOWNORMA
IsRunAs//FALSE 或者 TRUE,是否创建一个管理员进程,如果选择TRUE,将创建一个管理员进程,创建管理员进程将有可能弹出UAC
返回值:与系统函数ShellExecut的返回值相同
/////////////////////////////////////////////
*/
int _tmain(int argc, _TCHAR* argv[])
{
BOOL IsError=0;//定义一个错误标识
DWORD LastError = 0;//定义一个错误代码
MEMORY_BASIC_INFORMATION lpBuffer={0};//定义一个VirtualQueryEx的参数的结构
SIZE_T RegionSize = 0;
PVOID Address = 0;
HANDLE hProcess=NULL;
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hSnapShot,&pe))
{
return 0;
}
while (Process32Next(hSnapShot,&pe))
{
if(::StringCompareW(pe.szExeFile,TEXT("Taskmgr.exe"),FALSE))
{
hProcess=::OpenProcessByProcessId(PROCESS_ALL_ACCESS,0,pe.th32ProcessID);
if(hProcess==NULL)
{
LastError=GetLastError();
if(LastError==5)
{
if(!::IsAdmin())
{
if(MessageBox(NULL,TEXT("权限不足!请提升权限!\r\n是否提升权限?"),TEXT("权限不足!"),48+MB_YESNO))
{
CloseHandle(hSnapShot);
::ShellExecuteExAs(argv[0],argv[0],::GetCommandLine());
return 0;
}
}
}
IsError=TRUE;
goto Error;
}else
{
goto Next;
}
}
}
MessageBox(NULL,TEXT("找不到任务管理器,请运行任务管理器!"),TEXT("错误"),48);
CloseHandle(hSnapShot);
return 0;
Next:
RegionSize=sizeof(PVOID);
if( ::MmAllocateVirtualMemoryEx(hProcess,&Address,0,&RegionSize,MEM_COMMIT,PAGE_READWRITE))//向任务管理器进程申请内存
{
if(::MmVirtualQueryEx(hProcess,Address,&lpBuffer,RegionSize)!=0)//查询申请的内存属性
{
MessageBox(NULL,TEXT("程序运行成功!"),TEXT("错误"),0);
}
::MmFreeVirtualMemoryEx(hProcess,&Address,&RegionSize,MEM_RELEASE);//释放申请的内存属性
}else
{
LastError=GetLastError();
IsError=TRUE;
}
// ::MmVirtualQueryEx(
::CloseObjectHandle(hProcess);
Error:
CloseHandle(hSnapShot);
if(IsError)
{
LPCTSTR ErrorStr=::GetLastErrorMessageW(LastError);//返回错误代码的格式化字符
MessageBox(NULL,ErrorStr,TEXT("错误"),16);
::FreeMemory(ErrorStr);//释放内存,只能释放由我的程序重写的代码申请的内存,不能用作释放别的代码申请的内存
ErrorStr=NULL;
}
return 0;
}