gpt4 book ai didi

delphi - 将整数转换为字符串会导致注入(inject)的父进程崩溃 [Delphi]

转载 作者:行者123 更新时间:2023-12-02 07:30:54 29 4
gpt4 key购买 nike

我的应用程序是一个 x64 Windows 控制台应用程序,需要将自身注入(inject)到另一个正在运行的进程中。从命令行执行时,您输入要注入(inject)的进程的 PID 作为命令行参数。

在父进程下运行的线程上下文中,我可以使用字符串变量,但我很难弄清楚如何在 Delphi 中将整数转换为字符串。我尝试从整数转换为字符串的所有内容都会导致父进程崩溃。我知道标准的 Delphi RTL 命令不起作用,我需要使用 WINAPI 函数。

以下是我尝试过的一些命令的列表:

a. IntToStr(int) 使父进程崩溃;

b. itoa(src, dst, radix) 使父进程崩溃;

c. strcpy(dst, src) 使父进程崩溃;

我已经包含了在 Delphi RAD Studio RIO 10.3.2 中编译的工作代码片段。确保将目标平台设置为 Windows-64 位。按原样,程序只是简单地注入(inject)到进程中并显示一个 MessageBox。我已经包含并注释掉了导致父进程崩溃的命令。

在此示例程序中,我尝试显示正在运行的进程的 PID,该 PID 使用 GetCurrentProcessId() 确定,该函数以整数形式返回 PID。挑战在于尝试将变量“x”转换为字符串变量“s”。我还尝试使用 itoa() 将“x”转换为 PAnsiChar 变量,但失败了。

我预计我的问题可能是我没有加载正确的 Windows 库,或者我没有定义我尝试使用的 WINAPI 函数。

任何帮助将不胜感激,因为我陷入困境,在克服这个障碍之前无法前进。

program Inject;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
System.Variants,
System.Classes,
Winapi.Windows,
Winapi.Messages,
ShellAPI,
System.Win.crtl,
shlobj;

var
ClassName: string;
ProcessHandle: Thandle;
Active : Integer;
PID : integer;
Module, NewModule: Pointer;
Size: SIZE_T;
BytesWritten: SIZE_T;
TID: DWORD;

procedure Main;
var
x : Integer;
s : string;
p : PAnsiChar;
begin
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
LoadLibrary('msvcrt.dll');
LoadLibrary('win32.dll');

x := GetCurrentProcessId;

{ This command crashes the parent process }
// s := IntToStr(x);

{ This command crashes the parent process }
// itoa(x, p, 10);

{ This command crashes the parent process }
strcpy(P, PAnsiChar(IntToStr(x)));

{ A standard Message Box works }
MessageBox(0, 'This Message Box produced by Thread running under Parent Process', 'Process ID', 0);

{ This Message Box crashes the parent process }
// MessageBox(0, PWideChar(IntToStr(x)), 'Process ID', 0);

ExitThread(0);
end;

begin
try
if (ParamCount() > 0) then
begin
PID := StrToInt(ParamStr(1));
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader64(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, @Main, Module, 0, TID);
WaitForSingleObject(ProcessHandle, 1000);
end
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

最佳答案

在您的 Main() 过程中,当调用 itoa()strcpy() 时,您的 p变量是一个未初始化的指针,它不指向任何有效的内存。您需要分配内存来写入,例如:

procedure Main;
var
x : Integer;
str : array[0..12] of AnsiChar;
begin
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
LoadLibrary('msvcrt.dll');
LoadLibrary('win32.dll');

x := GetCurrentProcessId;
itoa(x, str, 10);

MessageBoxA(0, str, 'Process ID', 0);
ExitThread(0);
end;

strcpy() 而言,您还有一个额外的问题,即 Delphi 2009+ 中的 IntToStr() 返回一个 UnicodeString,而不是一个 AnsiString,因此您对 PAnsiChar 的类型转换无论如何都是错误的。

或者,查看 Win32 wsprintfA() user32.dll 中的函数:

procedure Main;
var
x : Integer;
str : array[0..12] of AnsiChar;
begin
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
LoadLibrary('msvcrt.dll');
LoadLibrary('win32.dll');

x := GetCurrentProcessId;
wsprintfA(str, '%d', x);

MessageBoxA(0, str, 'Process ID', 0);
ExitThread(0);
end;

关于delphi - 将整数转换为字符串会导致注入(inject)的父进程崩溃 [Delphi],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59438440/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com