0

我在使用 Chez Scheme 的 FFI 和 kernel32/user32.dll 的 ReadProcessMemory 函数从任意内存地址读取时遇到了一些问题。我得到了进程句柄,一切都很好,但我在读取函数本身的很多方面都在苦苦挣扎:

(define (read-process-memory handle address size)
  ((foreign-procedure "ReadProcessMemory" (iptr iptr string int iptr) iptr)
   handle address byte-array size output-ptr))

(define address (make-ftype-pointer iptr #x14a24d63660))

(read-process-memory process-handle address 4)

从这里我得到Exception in read-process-memory: invalid foreign-procedure argument #<ftype-pointer iptr 1417957226080>了,但我很确定我正在处理很多关于这个错误的事情。

提前致谢

4

1 回答 1

0

这有效:

(define (read-process-memory handle address size)
  (let ((temp-buffer (foreign-alloc size)))
    (set! success ((foreign-procedure "ReadProcessMemory" (unsigned-32 unsigned-32 uptr unsigned-32 u8*) boolean)
            handle address temp-buffer size #f))
    (set! result (foreign-ref 'unsigned-32 temp-buffer 0))
    (foreign-free temp-buffer)))

与其他实现一样,进程句柄和地址可以只是无符号 32 而不是指针,所以我切换了这些类型,大小相同,尽管这不是必需的。返回类型应该是布尔值,而不是指针,我没注意。布尔值表示内存读取成功。

尽管在某些实现中为缓冲区传递字符串是可行的,但在 Chez 中它不会改变字符串,很可能是因为它不是通过引用传递的。正确的解决方案是让它接受一个 uptr , (foreign-alloc 你需要的大小,因为它会传入它自己的地址,它会被正确地改变,然后你可以用 (foreign-ref,我将其存储在结果中,然后释放分配的内存。

另外值得一提的是,我原来的问题中的地址是 64 位地址,因此需要使用 unsigned-64 才能正确访问该地址。

于 2021-08-16T03:59:47.397 回答