zoukankan      html  css  js  c++  java
  • 32位程序读写64位程序内存

      32位程序可以通过NtWow64ReadVirtualMemory64,NtWow64WriteVirtualMemory64读写64程序内存。

      步骤:

      1.自定义函数参数结构,获取模块中的函数指针:

    typedef NTSTATUS(NTAPI *LPFN_NTWOW64READVIRTUALMEMORY64)(
    	IN  HANDLE   ProcessHandle,
    	IN  ULONG64  BaseAddress,
    	OUT PVOID    BufferData,
    	IN  ULONG64  BufferLength,
    	OUT PULONG64 ReturnLength OPTIONAL);
    
    
    typedef NTSTATUS(NTAPI *LPFN_NTWOW64WRITEVIRTUALMEMORY64)(
    	IN  HANDLE   ProcessHandle,
    	IN  ULONG64  BaseAddress,
    	OUT PVOID    BufferData,
    	IN  ULONG64  BufferLength,
    	OUT PULONG64 ReturnLength OPTIONAL);
    
    
    NtdllModuleBase = GetModuleHandle(L"Ntdll.dll");
    	if (NtdllModuleBase == NULL)
    	{
    		return FALSE;
    	}
    	
    	__NtWow64ReadVirtualMemory64 = (LPFN_NTWOW64READVIRTUALMEMORY64)GetProcAddress(NtdllModuleBase,
    		"NtWow64ReadVirtualMemory64");
    
    	__NtWow64WriteVirtualMemory64 = (LPFN_NTWOW64WRITEVIRTUALMEMORY64)GetProcAddress(NtdllModuleBase,
    		"NtWow64WriteVirtualMemory64");
    

      2.获取进程ID和64进程中想要读写处的地址,调用函数读写目标进程内存

    			NTSTATUS Status = __NtWow64ReadVirtualMemory64(ProcessHandle,
    				BaseAddress, BufferData, BufferLength, &ReturnLength);
    			if (NT_SUCCESS(Status))
    			{
    				printf("%s
    ", BufferData);
    				ZeroMemory(BufferData, BufferLength);
    				memcpy(BufferData, "LIUDADA", strlen("LIUDADA"));
    				__NtWow64WriteVirtualMemory64(ProcessHandle,
    					BaseAddress, BufferData,  strlen("LIUDADA")+1, (PULONG64)&ReturnLength);
    				
    			}
    

      

  • 相关阅读:
    Qt程序使用Win32 API发送ZPL指令与斑马打印机通信
    Eclipse构建Maven项目
    编码风格 缩进和空白
    Linux下Tomcat重新启动
    linux下tomcat服务的相关命令
    第一天
    Day1NLP_机器翻译
    Day4_attention is all you need 论文阅读下篇
    Day_7tensorflow 实战
    Day5_python学习
  • 原文地址:https://www.cnblogs.com/lsh123/p/7445296.html
Copyright © 2011-2022 走看看