Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.03;
Скачать: CL | DM;

Вниз

Как получить список всех переменных чужой програмы?   Найти похожие ветки 

 
Miralex ©   (2003-08-29 15:15) [40]

Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((


 
Miralex ©   (2003-08-29 15:15) [41]

Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((


 
Miralex ©   (2003-08-29 15:16) [42]

Про ВАП мне как раз все понятно!
Но как програмно реализовать ету мысль!..
Вот над етим я ломаю голову! (((


 
Miralex ©   (2003-08-29 15:18) [43]

извините за 3 поста подряд!
Ето форум или у меня инет заглючил (((


 
Miralex ©   (2003-08-29 15:28) [44]


> > напишите мне пожалуйста код
>
>
> и что ты с ним делать будешь, с кодом ?


Смотря что за код будет!

Если код будет делать следующее:

- Считывать по блокам (1,2 или более байт) и искать в нем ячейки в который значение будет соответствовать мною заданому!

- Сканировать всю область и находить и выводить в результат все найденые адресса етих ячеек!

То вопросов думаю много небудет!

Также прозьба сделать пример как мне прочитать значение найденной ячейки!...зная хендл проги и адресс етой ячейки!


 
Digitman ©   (2003-08-29 15:29) [45]


> Miralex


о боже) ...

ну раз понятно, то в чем же дело ?!

вот тебе ф-ция VirtualQueryEx, которая возвращает тебе инф-цию об интересующем регионе

вот тебе ф-ция ReadProcessMemory, которая читает содержимое чужой памяти в области интересующих регионов в память твоего собственного ВАП

ну что же еще непонятно ?)


 
Digitman ©   (2003-08-29 15:33) [46]


> Смотря что за код будет!


да никакого не будет !

с какой стати кто-то за тебя будет пыхтеть в ущерб своиму времени, реализуя за тебя в коде алгоритм ? чтобы ты потом еще морем вопросов завалил , типа "а это что ? а это зачем ? а как ? а для чего ? а почему не компилируется ?"


 
Digitman ©   (2003-08-29 15:39) [47]

ок.

не поленюсь потратить сколько будет нужно времени , если ты реализуешь и покажешь в коде решение простейшей задачи

Дано :
- указатель на блок памяти
- размер блока памяти

Найти :
смещения и количество вхождений в этом блоке памяти искомого значения, например, const SearchModel: Double = 1.0

разумеется, все это - в твоем ВАП


 
Miralex ©   (2003-08-29 19:01) [48]


> Дано :
> - указатель на блок памяти
> - размер блока памяти
>
> Найти :
> смещения и количество вхождений в этом блоке памяти искомого
> значения, например, 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;
Потом загонял туда и находил!


 
Verg ©   (2003-08-30 10:35) [49]

Слушай. Вот пара ф-ий
Возьми, разбирайся. Может чего полезного найдешь.

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;



 
имя   (2003-08-30 14:23) [50]

Удалено модератором


 
Digitman ©   (2003-09-01 08:56) [51]


> 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).

Трудись !

Как только алгоритм ф-ции сканирования примет законченный и оптимизированный вид, двинем дальше



Страницы: 1 2 вся ветка

Текущий архив: 2003.11.03;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.017 c
3-8310
Юрий_48
2003-10-13 13:58
2003.11.03
DataSet без связи с БД


3-8284
Кабан
2003-10-13 13:56
2003.11.03
где можно взять mysqllib.dll c функцией mysql_field_seek


3-8270
@le
2003-10-14 12:14
2003.11.03
BDE


3-8279
Art
2003-10-13 23:55
2003.11.03
Ошибка при переносе проги на другой ПК (InterBase)


14-8620
Zoloto
2003-10-14 17:03
2003.11.03
Интересно было бы узнать