Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2020, 17:53   #1
Yukino_Nani
Новичок
Джуниор
 
Регистрация: 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;
Yukino_Nani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к 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