从32位进程获得64位进程内存的入口点

时间:2016-10-24 02:17:22

标签: c++ windows memory process readprocessmemory

我希望从32位进程写入64位进程的入口点,就像使用EnumProcessModule并使用主模块的内存地址一样。 我的最终目标是从我的64位进程中读取一个字节,从偏移到它(entry + Offset)。

但是我的NtWow64ReadVirtualMemory64函数仍然失败。 我认为这与我的入门记忆添加器有关。

while (strtotime($startDate) <= strtotime($newEnddate)) { 
            $newStartDate = date ("Y-m-d", strtotime("+1 day", strtotime($startDate)));
            $dates = array(
                'startdate' => $newStartDate,
                'enddate' => $newStartDate
            );
            //$this->ddc_get_res($dates);
            $startDate = $newStartDate;
        }

我想知道我做错了什么。

编辑: 经过进一步检查,我注意到NtWow64ReadVirtualMemory没有在变量&#34; ret&#34;中存储值。用作缓冲区。

1 个答案:

答案 0 :(得分:1)

我运行了一个简单的测试,并发现我的缓冲区的价值 - &#34; ret&#34;插入函数&#34; NtWow64ReadVirtualMemory64&#34; 时未更改。
代码确实编译并运行没有错误(编译和运行时),除了NtReadMemory64返回一个奇怪的数字(没有可用于ntdll NtWow64函数的文档,所以goolgling它没有产生任何有用的东西)。
所以我想我要么提供一个错误的缓冲区,要么就是没有从有效的内存地址读取。

因为我确实在函数之外显式初始化了缓冲区,我想 我的问题是后者(没有提供有效的内存地址)。

我在调用NtReadVirtualMemory时使用了以下内容

NTSTATUS result = NtReadVirtualMemory64(PROC_HANDLE, (void*)address64, &ret, 8, NULL);

显然,在调用NtWow64ReadVirtualMemory64时,我将addr转换为32位无效指针(void*)address64,并且由于address64是UINT64类型,所以转换截断了地址,我试图读取内存细分我无法阅读 我通过将演员表更改为(PVOID64)address64来解决此问题 它将它转换为原生的64位指针。

比我想象的要简单,但经过几天的谷歌搜索和审查代码后发现它是地狱。

修改 因为我的地址错了,所以没有削减它。  我需要得到&#34; .exe&#34; s&#39;进入点通过过程的位置&#39;内存中的主模块。
看着现在怎么样。
任何帮助表示赞赏!