|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.05.2020, 17:53 | #1 |
Новичок
Джуниор
Регистрация: 17.05.2020
Сообщений: 1
|
Поиск указателя в чужом процессе
Доброго времени суток! У меня возник вопрос специфического характера. Надеюсь все знакомы с такой программой как Cheat Engine и как ею пользоваться. Так вот, подобный функционал мне нужно засунуть в свою программу. На безграничных просторах Google я с трудом смог найти кусок кода, который справляется с этой задачей. Проблема состоит в том, что этот процесс крайне долгий. Запустив его, можно пойти выпить чаю, поспать, сходить в магазин, сделать дома уборку. Я бы хотел попросить вашей помощи ускорить этот процесс в разы. Оговорюсь сразу, я в этом очень плохо шарю, поэтому помидорами и тухлыми яйцами не закидывайте в меня.
var mbi: MEMORY_BASIC_INFORMATION; Max: Cardinal; write: size_t; Address: cardinal; wer, rew: integer; a: integer; ii, i: integer; tp, ad, rm, pm: string; stp, kol:integer; hwnd: THandle; TId: cardinal; pid: DWord; hpr: THandle; name: array [0..8] of widechar; f: integer; begin ListBox1.Clear; ListBox1.Items.Add('Процесс: '+ComboBox1.Text); stp:= 0; for i:= kol-1 downto 1 do ValueListEditor1.DeleteRow(i); kol:= 1; Address:= $00010000; Max:= $BFFFFFFF; hwnd:= FindWindow(nil,PChar(ComboBox1.Text )); TId:= GetWindowThreadProcessId(hwnd,@pid) ; hpr:= OpenProcess(PROCESS_ALL_ACCESS, False, PID); if HPR= 0 then messagedlg('Error...',mtWarning,[mbOk],0); while (VirtualQueryex(hpr, ptr(Address), mbi, SizeOf(MEMORY_BASIC_INFORMATION)) > 0) and (mbi.RegionSize+integer(MBI.BaseAdd ress) < max) do begin ad:= inttostr((integer(mbi.BaseAddress)) ); rm:= inttostr(mbi.RegionSize); rm:= copy(rm, 2, 7); case mbi.Type_9 of MEM_PRIVATE: tp:= 'PRIVATE'; MEM_MAPPED: tp:= 'MAPPED'; MEM_IMAGE: tp:= 'IMAGE'; end; case mbi.State of MEM_COMMIT: pm:= 'COMMIT'; MEM_FREE: pm:= 'FREE'; MEM_RESERVE: pm:= 'RESERVE'; end; if (mbi.Protect = PAGE_READWRITE) and (mbi.State=MEM_COMMIT) then begin if stp = 1 then break; Address:= integer(mbi.BaseAddress) + (mbi.RegionSize); StatusBar1.Panels[3].Text:= inttostr(cardinal(mbi.BaseAddress)) +' X '+inttostr(address); wer:= StrToInt(inttostr(integer(mbi.BaseA ddress))); rew:= StrToInt(inttostr(address)); StatusBar1.Panels[0].Text:= inttostr(f); StatusBar1.Panels[1].Text:= inttostr(rew-wer); begin form1.ListBox1.Items.Add(StatusBar1 .Panels[0].Text+') '+StatusBar1.Panels[1].Text); for i:= wer to rew do begin if stp = 1 then break; ReadProcessMemory(HPR, ptr(strtoint(inttostr(i))), @name[0], sizeof(name), write); Application.ProcessMessages; if widechartostring(@name[0]) = Edit1.Text then begin if kol = 1 then begin ValueListEditor1.Cells[1,1]:= Edit1.Text; exit; end else ValueListEditor1.Strings.Add(Edit1. Text); ValueListEditor1.Cells[0,kol]:= inttostr(i); kol:= kol+1; StatusBar1.Panels[1].Text:= inttostr(kol-1); end; II:= I-wer; Gauge1.Progress:= round(ii*(100/(rew-wer+1))); end; end; inc(f); end; Address:= integer(mbi.BaseAddress); Inc(Address, mbi.RegionSize); end; |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Доступ к Dll, находящейся в чужом процессе | Mr_ViK | Общие вопросы C/C++ | 3 | 30.07.2013 21:14 |
Найти указатель на переменную в чужом процессе | Silentdi | Общие вопросы Delphi | 2 | 14.09.2012 16:06 |
CreateRemoteThread и выполнение моего кода в чужом процессе | Человек_Борща | Win Api | 4 | 11.05.2012 11:16 |
Библиотека и приложение в чужом процессе | Johnson | Общие вопросы Delphi | 12 | 09.02.2011 17:48 |
Как программно нажать клавишу в чужом процессе? | Sere0ga | Win Api | 2 | 27.03.2007 18:43 |