Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.011 c
1-8430
alex_***
2003-10-17 14:46
2003.11.03
Отчеты в Excel


9-8249
MeF88
2003-04-03 11:19
2003.11.03
GLScene+OpenGL


7-8683
IntLex
2003-08-16 04:19
2003.11.03
Вызов свойств


14-8628
Igor_thief
2003-10-14 13:25
2003.11.03
Интерфейсы


3-8322
Марат
2003-10-13 09:05
2003.11.03
SQL запросы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский