飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4166|回复: 3

[C/C++] 应用层实现驱动级别内存读写

[复制链接]
  • TA的每日心情
    慵懒
    2022-2-20 22:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-7-13 13:39:29 | 显示全部楼层 |阅读模式



    [C] 纯文本查看 复制代码
    #include<Windows.h>
    #include<Tlhelp32.h>
    #include<shlwapi.h>
    
    
    //获取进程句柄
    HANDLE GetThePidOfTargetProcess(DWORD pid)
    {
    	//DWORD pid;
    	//GetWindowThreadProcessId(hwnd, &pid);
    	HANDLE hProcee = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD, 0, pid);//打开
    	return hProcee;
    }
    DWORD GetPidByProcessName(TCHAR* pProcess)
    {
    	HANDLE hSnapshot;
    	PROCESSENTRY32 lppe;
    	//创建系统快照 
    	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //#include<Tlhelp32.h>
    	if (hSnapshot == NULL)
    		return 0;
    	//初始化 lppe 的大小 
    	lppe.dwSize = sizeof(lppe);
    	//查找第一个进程 
    	if (!Process32First(hSnapshot, &lppe))
    		return 1;
    	do
    	{
    		if (StrCmp(lppe.szExeFile, pProcess) == 0)//#include<shlwapi.h>
    		{
    			return lppe.th32ProcessID;
    		}
    	} while (Process32Next(hSnapshot, &lppe)); //查找下一个进程  
    
    	return 0;
    }
    
    
    typedef NTSTATUS(NTAPI* Ptr_NtReadVirtualMemory)( //读取
    
    	IN HANDLE               ProcessHandle,
    	IN PVOID                BaseAddress,
    	OUT PVOID               Buffer,
    	IN ULONG                NumberOfBytesToRead,
    	OUT PULONG              NumberOfBytesReaded OPTIONAL);
    
    
    DWORD _Wow64Transition = NULL;
    void __declspec(naked) WINAPI My_NtReadVirtualMemory(//读取实现
    	IN HANDLE ProcessHandle,
    	IN PVOID                BaseAddress,
    	OUT PVOID               Buffer,
    	IN ULONG                NumberOfBytesToRead,
    	OUT PULONG              NumberOfBytesReaded OPTIONAL){
    	_asm {
    
    		mov eax, 0x3F //win10_函数序号
    		mov edx, _Wow64Transition
    		call edx
    		ret 0x14
    	}
    	
    }
    DWORD fn_Wow64Transition() {
    
    	HMODULE LibHandle = LoadLibrary(TEXT("ntdll"));
    	DWORD Getnt =(DWORD)GetProcAddress(LibHandle, "/*Wow64Transition*/");
    	DWORD GetAddr = (DWORD)Getnt; //取地址
    	_Wow64Transition = *(DWORD*)GetAddr;//获得指针 取值
    	return 0;
    }
    
    int main() {
    	DWORD GameProcessID = NULL;
    	HWND  Handle = NULL;
    	HANDLE  hP = NULL;
    	DWORD bass = 0x037FAC30;
    	DWORD container[23] ;
    	
    	do
    	{
    		Sleep(100);
    		Handle = FindWindow("Qt5QWindowIcon", NULL);//取窗口(类名,标题)
    	} while (!Handle);
    	do
    	{
    		Sleep(10);
    		GameProcessID = GetPidByProcessName("x32dbg.exe");//返回pid=取进程名(进程.exe)
    	} while (!GameProcessID);
    
    	if (hP = GetThePidOfTargetProcess(GameProcessID))//返回PID=取进程句柄(句柄)
    	{
    		
    		fn_Wow64Transition();//动态得到函数地址
    
    		My_NtReadVirtualMemory(hP, (PVOID)bass, &container, 23, NULL);
    
    	}
    	return 0;
    }

    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 12:17
  • 签到天数: 509 天

    [LV.9]以坛为家II

    发表于 2020-7-13 20:05:49 | 显示全部楼层
    虽然看不懂,也来凑凑热闹!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-3-22 00:49
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2020-7-16 08:09:01 | 显示全部楼层
    学习一下谢谢了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表