![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список всех переменных чужой програмы?
Miralex © (2003-08-27 14:00:00)
У меня такая проблема:
хендл програмы я нашел а как найти область памяти, где ета программа хранит свои переменные?
Как получить список етих переменных и их значения?
И как работать с ними?
Digitman (2003-09-01 08:56:00) [1]
> Miralex
Вот даже такой простой алгоритм ты не в состоянии реализовать правильно) ... как же ты собрался решать значительно более сложную задачу ?)
Вопросы к тебе :
1. Зачем в цикл внечена строчкаptemp:=@TempModel?
2. Если массив будет размером 8 байт, алгорим не работает.
Если массив будет размером > 8 байт, сканируются не все возможные вхождения. Почему ?
3.
"Найдена константа со смешением в "+inttostr(i)+" байт");
при первой итерации цикла, если модель поиска обнаружена, окажется, что смещение модели - 1 байт, хотя смещение - нулевое. Почему ?
4. Оформи алгоритм в виде ф-ции. Она все равно понадобится тебе для решения твоей задачи.
Ф-ция должна иметь, к примеру, такой прототип :
type
POffsetArray = ^TOffsetArray;
TOffsetArray = array[0..0] of DWord;
function ScanArray
(
const SrcArray: PByteArray; // [in] указатель на сканируемый буфер
const SrcArraySize: Integer; //[in] размер сканируемого буфера, байт
const SearchModel; //[in] произвольная модель поиска
const SearchModelSize: Integer;// [in] размер модели поиска, байт
out Offsets: POffsetArray; //[out] результирующий массив со смещениями вхождения модели в сканируемом буфере (= nil, если нет вхождений)
): DWord; // результат - число вхождений (= 0, если нет вхождений)
При ненулевом результате ф-ция должна вернуть через вых.параметр-указатель Offsets аллокированный (с пом. GetMem) и заполненный в своем теле массив со смещениями найденных вхождений.
Вызывающая ф-ция будет освобождать (с пом. FreeMem) этот массив, если результат вызываемой ф-ции > 0 (или - что тоже самое -Offsets <> nil).
Трудись !
Как только алгоритм ф-ции сканирования примет законченный и оптимизированный вид, двинем дальше
имя (2003-08-30 14:23:00) [2]
Удалено модератором
Verg (2003-08-30 10:35:00) [3]
Слушай. Вот пара ф-ий
Возьми, разбирайся. Может чего полезного найдешь.
unit VQ;
interface
uses Windows;
type
PVMQuery = ^TVMQuery;
TVMQuery = record
RgnBaseAddress : pchar;
RgnProtection : DWORD;
RgnSize : DWORD;
RgnStorage : DWORD;
RgnBlocks : DWORD;
RgnGuardBlks : DWORD;
RgnIsAStack : boolean;
BlkBaseAddress : pchar;
BlkProtection : DWORD;
BlkSize : DWORD;
BlkStorage : DWORD;
end;
TVmQueryHelp = record
RgnSize : DWORD;
RgnStorage : DWORD;
RgnBlocks : DWORD;
RgnGuardBlks : DWORD;
RgnIsAStack : boolean;
end;
function VmQueryHelp(HProc:THandle; Address : pchar; var VmQHelp : TVmQueryHelp):boolean;
var
MBI : TMemoryBasicInformation;
RgnBaseAddress, AddressBlk: pchar;
fOk : boolean;
ProtectBlock : array[0..3] of DWORD;
begin
FillChar(ProtectBlock, sizeof(ProtectBlock), 0);
FillChar(VmQHelp, sizeof(VmQHelp), 0);
fOk:=VirtualQueryEx(HProc, Address, Mbi, sizeof(mbi))=sizeof(Mbi);
if not fOk then begin Result:=fOk; exit end;
RgnBaseAddress:=Mbi.AllocationBase;
AddressBlk:=RgnBaseAddress;
VmQHelp.RgnStorage:=Mbi.Type_9;
while true do
begin
fOk:=VirtualQueryEx(HProc,AddressBlk, Mbi, sizeof(Mbi))<>0;
if not fOk then break;
if Mbi.AllocationBase<>RgnBaseAddress then break;
if (VmQHelp.RgnBlocks<4) then
begin
if (Mbi.State=MEM_RESERVE) then ProtectBlock[VmqHelp.RgnBlocks]:=0 else
ProtectBlock[VmqHelp.RgnBlocks]:=Mbi.Protect;
end else
begin
Move(ProtectBlock[1], ProtectBlock[0], sizeof(ProtectBlock)-sizeof(DWORD));
if (Mbi.State=MEM_RESERVE) then ProtectBlock[3]:=0 else
ProtectBlock[3]:=Mbi.Protect;
end;
Inc(VmqHelp.RgnBlocks);
inc(VmqHelp.RgnSize, Mbi.RegionSize);
if Mbi.Protect and PAGE_GUARD<>0 then inc(VmqHelp.RgnGuardBlks);
if VmqHelp.RgnStorage = MEM_PRIVATE then VmqHelp.RgnStorage :=Mbi.Type_9;
inc(AddressBlk, Mbi.RegionSize);
end;
VMqHelp.RgnIsAStack:=
(VmqHelp.RgnGuardBlks >0) or (
(VmqHelp.RgnBlocks >=4) and
(ProtectBlock[0]=0) and
(ProtectBlock[1]=PAGE_NOACCESS) and
(ProtectBlock[2]=PAGE_READWRITE) and
(ProtectBlock[3]=0));
result:=true;
end;
function VMQuery(HProc: THandle; Address:PChar; Vmq : PVMQuery):boolean;
var
MBI : TMemoryBasicInformation;
VMQHelp : TVMqueryHelp;
fOk : boolean;
SI : TSystemInfo;
begin
if gs_AllocGran =0 then
begin
GetSystemInfo(SI);
gs_AllocGran := SI.dwAllocationGranularity;
end;
FillChar(VMQ^, sizeof(VMQ^),0);
fOk:=VirtualQueryEx(HProc, Address, Mbi, sizeof(mbi))=sizeof(Mbi);
if not fOk then begin Result:=fOk; exit end;
case MBI.State of
MEM_FREE : with VMQ^ do begin
BlkBaseAddress := nil;
BlkSize := 0;
BlkProtection := 0;
blkStorage := MEM_FREE;
end;
MEM_RESERVE : with VMQ^ do begin
BlkBaseAddress := MBI.BaseAddress;
BlkSize := MBI.RegionSize;
BlkProtection := MBI.AllocationProtect;
blkStorage := MEM_RESERVE;
end;
MEM_COMMIT: with VMQ^ do begin
BlkBaseAddress := MBI.BaseAddress;
BlkSize := MBI.RegionSize;
BlkProtection := MBI.Protect;
blkStorage := MBI.Type_9;
end;
end;
Case MBI.STATE of
MEM_FREE : with VMQ^ do begin
RgnBaseAddress := MBI.BaseAddress;
RgnProtection:=MBI.AllocationProtect;
RgnSize:=MBI.RegionSize;
RgnStorage:=MEM_FREE;
RgnBlocks :=0;
RgnGuardBlks:=0;
RgnIsAStack := false;
end;
MEM_RESERVE : with VMQ^ do begin
RgnBaseAddress := MBI.AllocationBase;
RgnProtection:=MBI.AllocationProtect;
VmQueryHelp(HProc, Address, VmqHelp);
RgnSize:=VMqHelp.RgnSize;
RgnStorage:=VmqHelp.RgnStorage;
RgnBlocks :=VmqHelp.RgnBlocks;
RgnGuardBlks:=VmqHelp.RgnGuardBlks;
RgnIsAStack := VmqHelp.RgnIsAStack;
end;
MEM_COMMIT : with VMQ^ do begin
RgnBaseAddress := MBI.AllocationBase;
RgnProtection:=MBI.AllocationProtect;
VmQueryHelp(HProc, Address, VmqHelp);
RgnSize:=VMqHelp.RgnSize;
RgnStorage:=VmqHelp.RgnStorage;
RgnBlocks :=VmqHelp.RgnBlocks;
RgnGuardBlks:=VmqHelp.RgnGuardBlks;
RgnIsAStack := VmqHelp.RgnIsAStack;
end;
end;
result:=fOk;
end;
function GetMemStorageText(Storage : DWORD) : string;
begin
result:="Unknown";
Case Storage of
MEM_FREE : result:="Free ";
MEM_RESERVE : result:="Reserve";
MEM_IMAGE : result:="Image ";
MEM_MAPPED : result:="Mapped ";
MEM_PRIVATE : result:="Private";
end;
end;
function GetProtectText( Protect : DWORD; fShowFlag : boolean):string;
begin
result:="Unknown";
case Protect and not (PAGE_GUARD or PAGE_NOCACHE) of
PAGE_READONLY : Result:="-R--";
PAGE_READWRITE : result:="-RW-";
PAGE_WRITECOPY : result:="-RWC";
PAGE_EXECUTE : result:="E---";
PAGE_EXECUTE_READ : result:="ER--";
PAGE_EXECUTE_READWRITE : result:="ERW-";
PAGE_EXECUTE_WRITECOPY : result:="ERWC";
PAGE_NOACCESS : result:="----";
end;
if fShowFlag then
begin
Result:=Result+" ";
Result:=Result+stIfb(Protect And PAGE_GUARD<>0, "G","-");
Result:=Result+stIFb(Protect and PAGE_NOCACHE<>0,"N","-");
end;
end;
Miralex (2003-08-29 19:01:00) [4]
> Дано :
> - указатель на блок памяти
> - размер блока памяти
>
> Найти :
> смещения и количество вхождений в этом блоке памяти искомого
> значения, например, const SearchModel: Double = 1.0
>
> разумеется, все это - в твоем ВАП
Значит пишем:
var ptemp,pb: Pointer;
i,Size : integer;
const SearchModel: Double = 1.0;
TempModel: Double = 0.0;
begin
// Значит pb - указатель на блок допустим размером в Size байт
for i := 1 to Size-8 do
begin
ptemp:=@TempModel;
CopyMemory(ptemp,pb,8);
if TempModel=SearchModel then ListBox1.Items.Add("Найдена константа со смешением в "+inttostr(i)+" байт");
inc(pb);
end;
Проверял!
Работает!,..Создавал buff : array [1.100] of byte;
Потом загонял туда и находил!
Digitman (2003-08-29 15:39:00) [5]
ок.
не поленюсь потратить сколько будет нужно времени , если ты реализуешь и покажешь в коде решение простейшей задачи
Дано :
- указатель на блок памяти
- размер блока памяти
Найти :
смещения и количество вхождений в этом блоке памяти искомого значения, например, const SearchModel: Double = 1.0
разумеется, все это - в твоем ВАП
Digitman (2003-08-29 15:33:00) [6]
> Смотря что за код будет!
да никакого не будет !
с какой стати кто-то за тебя будет пыхтеть в ущерб своиму времени, реализуя за тебя в коде алгоритм ? чтобы ты потом еще морем вопросов завалил , типа "а это что ? а это зачем ? а как ? а для чего ? а почему не компилируется ?"
Digitman (2003-08-29 15:29:00) [7]
> Miralex
о боже) ...
ну раз понятно, то в чем же дело ?!
вот тебе ф-ция VirtualQueryEx, которая возвращает тебе инф-цию об интересующем регионе
вот тебе ф-ция ReadProcessMemory, которая читает содержимое чужой памяти в области интересующих регионов в память твоего собственного ВАП
ну что же еще непонятно ?)
Miralex (2003-08-29 15:28:00) [8]
> > напишите мне пожалуйста код
>
>
> и что ты с ним делать будешь, с кодом ?
Смотря что за код будет!
Если код будет делать следующее:
- Считывать по блокам (1,2 или более байт) и искать в нем ячейки в который значение будет соответствовать мною заданому!
- Сканировать всю область и находить и выводить в результат все найденые адресса етих ячеек!
То вопросов думаю много небудет!
Также прозьба сделать пример как мне прочитать значение найденной ячейки!...зная хендл проги и адресс етой ячейки!
Miralex (2003-08-29 15:18:00) [9]
извините за 3 поста подряд!
Ето форум или у меня инет заглючил (((
Miralex (2003-08-29 15:16:00) [10]
Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((
Miralex (2003-08-29 15:15:00) [11]
Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((
Miralex (2003-08-29 15:15:00) [12]
Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((
Digitman (2003-08-29 15:09:00) [13]
в таком случае ты должен четко представлять себе , что есть "виртуальное адресное пространство процесса" (ВАП)
ты должен понимать, что ВАП любого процесса делится на страницы
ты должен понимать, что регион - это группа смежных страниц, имеющих один и тот же статус
ты должен понимать, что непосредственный доступ к "чужому" ВАП из своего ВАП на 3-м уровне привелегий не возможен, и для осуществления этого (в определенных ограниченных пределах) ядро Win32 предоставляет некий механизм в виде набора только что упомянутых ф-ций
что ж тогда вопросы-то задаешь, коль понимаешь все это ?
Miralex (2003-08-29 15:00:00) [14]
> какой памяти ? конкретно ?
памяти программ!
Точнее сказать как винда выделяет память для программ!
Digitman (2003-08-29 14:46:00) [15]
> Организацию памяти я знаю
какой памяти ? конкретно ?
Miralex (2003-08-29 14:43:00) [16]
> Polevi © (29.08.03 14:07) [33]
> вот и объясняй после этого.. разжевали все.. и в итоге ДАЙТЕ
> КОД !
> >Miralex
> не готов ты еще программировать на таком уровне, возьмись
> за задачу попроще
С задачами попроще вроде тяжелых проблем не возникало!
А вот с памятью никогда не работал! (програмно),..
Организацию памяти я знаю!,..
А насчет неготов: если ничего не пробовать то ничего и не будешь уметь!
Digitman (2003-08-29 14:43:00) [17]
> Люди хватит мучать меня!
бедняжка !) прямо таки и замучили тебя !)
> напишите мне пожалуйста код
и что ты с ним делать будешь, с кодом ? встретишь там тот же VirtualQueryEx() и будешь лупиться на него как баран на новые ворота, что там за параметры/результаты да зачем да почему ?) И снова засыпать вопросами ? Так на те же самые вопросы ты и сейчас ответ уже получаешь !!
Digitman (2003-08-29 14:37:00) [18]
> Miralex
> куда мне она ето вернет?
>
> что кроме хендла ей задавать надо и что она после выполнения
> (и куда) возвращает?
ты читать умеешь вообще-то ?)
черным же по белому написано в хэлпе :
Parameters
hProcess
Identifies the process whose memory information is queried. The handle must have PROCESS_QUERY_INFORMATION access.
lpAddress
Points to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.
lpBuffer
Points to a MEMORY_BASIC_INFORMATION structure in which information about the specified page range is returned.
dwLength
Specifies the size, in bytes, of the buffer pointed to by the lpBuffer parameter.
Polevi (2003-08-29 14:07:00) [19]
вот и объясняй после этого.. разжевали все.. и в итоге ДАЙТЕ КОД !
>Miralex
не готов ты еще программировать на таком уровне, возьмись за задачу попроще
Miralex (2003-08-29 13:29:00) [20]
> базовый адрес региона, размер региона, число страниц в регионе,
> статус региона и пр
куда мне она ето вернет?
что кроме хендла ей задавать надо и что она после выполнения (и куда) возвращает?
Люди хватит мучать меня!
Кто может - напишите мне пожалуйста код, который будет читать все с памяти и разбирать например по 2 байта!..