【问题标题】:execute exe in memory在内存中执行exe
【发布时间】:2012-01-03 12:27:28
【问题描述】:

我正在尝试这段代码。

execute EXE from memory

我遇到了错误“实际和正式 var 参数的类型必须相同”。非常感谢这方面的任何帮助。

......
   ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);    <-- error is here
.......

and

.....
   WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);   <---- error here
......

我使用的是 Delphi XE2 和 windows 7 64 位。有的朋友可以在D7环境下编译。任何帮助表示赞赏。

【问题讨论】:

  • 你不能自己找出来吗?上网查一下ReadProcessMemory需要什么样的params(或者使用Ctrl-Shift-Space来获取Delphi中的参数列表)并检查你的参数类型。
  • @WarrenP,我会使用这个,例如安装程序;您可以从安装文件的资源中提取可执行文件并在不写入磁盘的情况下运行它们。它会快得多;)
  • @WarrenP 我正在尝试创建一个包装模块来保护我的 exe。一旦它被包裹起来,我可以应用某种包装技术。从例如ASPack
  • @TLama,安装程序不必为了更快而做这样的事情。它是一个安装程序 - 它通常运行一次,节省几秒钟并没有什么不同。但是,将您的安装程序标记为恶意软件或病毒确实如此 - 这样的“技巧”不应该用于日常目的。我不同意提问者也想自己做这件事。商业软件为此收费是有原因的,因为它们已经完成了您应该使用它们的所有工作。如果您的应用非常重要,需要这样的保护,那么它就足够重要,值得花钱。
  • @Ken,从性能的角度来看,我很极端,但你是绝对正确的;我没有想到抗病毒软件。幸运的是,我是一个满意的 InnoSetup 用户 ;)

标签: delphi delphi-xe2


【解决方案1】:

错误告诉您作为参数传递的变量之一不具有所需的类型。错误在 var 参数中。这两个函数的最后一个参数是唯一的 var 参数,所以很明显 Bytes 不是必需的类型。

解决办法是让Bytes匹配ReadProcessMemoryWriteProcessMemory的声明中指定的类型。在 XE2 中,该类型是 SIZE_T。所以你只需要将Bytes 的定义更改为SIZE_T 类型。

这里是 XE2 声明:

function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesWritten: SIZE_T): BOOL; stdcall;

【讨论】:

  • 能否像这样更改调用:ReadProcessMemory(..., SIZE_T(Bytes));?也就是说,如果这两种类型的大小是兼容的。
  • @AndriyM 是的,但我总是希望避免强制转换
  • 谢谢大卫。它确实有帮助并成功编译。
  • @DavidHeffernan 谢谢,几周前我一直在为这个问题苦苦挣扎,最后放弃了,想着以后再做...
猜你喜欢
  • 2012-06-20
  • 2011-12-23
  • 2011-09-17
  • 1970-01-01
  • 2020-12-12
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多