PDA

Показать полную графическую версию : Не работает функция возврата командной строки чужого процесса


qpash
26-07-2015, 15:08
Подскажите пожалуйста, как наладить функцию возврата CmdLine запущенного чужого процесса. Использую код:

procedure TForm1.Button1Click(Sender: TObject);
var pID:Cardinal;
op,hKernel32:Cardinal;
GCL,DW,StrAddr,i,L,j:Cardinal;
Str:String;
begin
try
pID:=StrToInt(Edit1.Text); //из edit берется идентификатор стороннего процесса
except
pID:=GetCurrentProcessID(); //типо если ошибка - берем идентификатор текущего процесса
end;
op:=OpenProcess(PROCESS_VM_READ,false,pID);
if op<>0 then
begin
hKernel32:=LoadLibrary('Kernel32.dll');
if hKernel32<>0 then
begin
GCL:=Cardinal(GetProcAddress(hKernel32,'GetCommandLineA'));
FreeLibrary(hKernel32);
if GCL<>0 then
if ReadProcessMemory(op,Pointer(GCL+1),@DW,4,i)and(i=4)and
ReadProcessMemory(op,Pointer(DW),@StrAddr,4,i)and(i=4) then
begin
L:=0;
repeat
j:=L;
L:=L+Max_Path;
SetLength(Str,L);
if ReadProcessMemory(op,Pointer(StrAddr+j),Pointer(PChar(Str)+j),Max_Path,i) then
begin
for i:=j+1 to i do
if Str[i]=#0 then DW:=0;
end else DW:=0;
until (DW=0);
Caption:=trim(Str); //В caption заносим ответ
end;
end;
CloseHandle(op);
end;

end;

Ругается на ReadProcessMemory - неправильные аргументы. Делаю на XE7. Система 64х

opel431
26-07-2015, 16:47
Лучше, если делать с обработкой ошибок. Убедится, что функции возвращают результат...
var
Res : Integer;
....
Res:= ReadProcessMemory('hProcess', 'lpBaseAddress', 'lpBuffer, nSize', '*lpNumberOfBytesRead');
if Res <> 0 then
RaiseLastOSError
else
begin
//
end;...
времени много, посмотрел советы у других
1. Попробовать явно сделать приведение типов
type
size_t = cardinal;
2. или последний параметр изменить - SizeOf(i)

qpash
26-07-2015, 17:39
Попробовал на delphi 2009 и ошибка пропала, но в заголовке вместо параметра командной строки выводит иероглифы. Пробовал добавить AnsiString - теперь вместо иероглифов вопросы (добавил тут Caption:=AnsiString (trim(Str));)

qpash
26-07-2015, 17:55
Часто в сети встречается вот такой код:

function GetProcessCmdLine(PID:DWORD):string;
{©Drkb v.3(2007): www.drkb.ru}
var
h:THandle;
pbi:TProcessBacicInformation;
ret:NTSTATUS;
r:Cardinal;
ws:WideString;
begin
result:='';
if pid=0 then exit;
h:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid);
if h=0 then exit;
try
ret:=NtQueryInformationProcess(h,ProcessBasicInformation,@pbi,sizeof(pbi),@r);
if ret=STATUS_SUCCESS then
if ReadProcessMemory(h,pbi.PebBaseAddress.ProcessParameters.CommandLine.Buffer,PWideChar(ws),
pbi.PebBaseAddress.ProcessParameters.CommandLine.Length,r) then
result:=string(ws);
finally
closehandle(h)
end
end;

Но тут ругается сразу же на TProcessBacicInformation - не найден. Наверное что-то прописать еще надо, библиотеку какую-то

opel431
26-07-2015, 18:31
Если уж unicode, то почему не - GetCommandLineW?
function WideCharToString(Source: PWideChar): string;

opel431
26-07-2015, 19:00
Часто в сети встречается вот такой код: »
Смотреть нужно из первого источника - http://www.delphikingdom.com/asp/answer.asp?IDAnswer=62376




© OSzone.net 2001-2012