大佬教程收集整理的这篇文章主要介绍了什么是空字符串的 Delphi 字节 ASM 表示?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下字节数组:
const
//Values : ArraY[0..4] of byte = ($C2,$00,$90,$90);
Values: ArraY[0..0] of Byte = (???); // '' ?
如何使用 asm
表示初始化第二个字节数组(类似于第一个字节数组),但这次是空字符串?
版本:
因为不清楚你问的目的是什么以及你打算用这个数组做什么。 ——汤姆·布伦伯格
目标是将空字符串写入目标进程的地址:
procedure WriteBytes(hProcess: THandle; Address: pointer; const Buffer: array of bytE);
var
Read: THandle;
oldprot,tmp: DWord;
begin
if (VirtualProtectEx(hProcess,Address,Length(Buffer),PAGE_EXECUTE_READWRITE,@oldprot)) then
Writeln('1 - VirtualProtectEx() successfully!');
if (WriteProcessMemory(hProcess,@Buffer,Read)) then
Writeln('2 - WriteProcessMemory() successfully!');
if (VirtualProtectEx(hProcess,oldprot,@tmp)) then
Writeln('3 - VirtualProtectEx() successfully!');
end;
在 C++ 中,以下示例工作正常:
PVOID hmod = deBUG_event.u.LoadDll.lpBaSEOfDll;
ulONG op;
SIZE_T numberOfBytesWritten;
if (VirtualProtectEx(pi.hProcess,hmod,1,PAGE_READWRITE,&op))
{
WriteProcessMemory(pi.hProcess,"",&numberOfBytesWritten);
}
这在 Delphi 中怎么可能?
WriteProcessMemory 的声明是:
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer;
lpBuffer: Pointer; nSize: SIZE_T; var lpnumberOfBytesWritten: SIZE_T): BOOL; stdcall;
您展示的 C 代码:
WriteProcessMemory(pi.hProcess,hmod,"",1,&numberOfBytesWritten);
使用在 C 中传递给函数的空字符串作为指向包含以空字符结尾的字符串字符数组的内存的指针。所以在你展示的代码中(空字符串),指针指向一个空字节。
你说:
目标是将空字符串写入目标进程的地址
您几乎有正确的声明,不同之处在于您的字节数组等效于 C 代码必须以 nul 终止,如果您对等效于 C 的 nul 字符串感兴趣,可以使用:
const
Values: ArraY[0..0] of Byte = (0);
如果您想传递一个非空字符串,请注意 Delphi 使用的 Unicode(16 位字符),除非您使用 Ansi@R_450_10495@ng(8 位字符)。如果使用强制转换获取字符串的地址,则会得到一个指向以 nul 结尾的字符串的指针。 nul 是 8 位或 16 位,具体取决于字符串类型。但如果是空字符串,则指针为零。
以上是大佬教程为你收集整理的什么是空字符串的 Delphi 字节 ASM 表示?全部内容,希望文章能够帮你解决什么是空字符串的 Delphi 字节 ASM 表示?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。