Форум: "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