Сейчас на форуме: r0lka, yashechka (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Указатели для асма в дельфи
Посл.ответ Сообщение

Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 10 января 2006 22:50 · Поправил: Smon
· Личное сообщение · #1

Подскажите плс, как в дельфи переориентировать указатель на блок данных (к примеру выделенную память или промэппированный файл) ?
Суть в том, что если использовать асмовые вставки (понятные и удобные) то данные берутся прямо из исполняемого файла...
Например замена всех $CC на $00:
asm
mov eax, Size - размер блока
mov ecx, 1 //-начало блока - если делать так, то ecx будет указывать на MZ в скомпилированном файле
@poisk: // а как тогда переориентировать ecx на блок данных ?
сmp ecx,eax
je @end
cmp [ecx], $CC
je @naydeno
mov [ecx],$00
inc ecx
jmp @poisk
@end:
end;

ЗЫ: есть конечно вариант с массивами, но это слишком геморно при большом кол-ве действий =(
типа
For I:=1 to MasLength do begin
If Mas[I]:=$CC then Mas[I]:=$00
end;

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 10 января 2006 22:57
· Личное сообщение · #2

а почему собственно начало блока - это 1? По идее MZ должно быть по адресу $400000. Аналогично туда же заносится адрес начала выделенной памяти - MOV ECX,_Addr



Ранг: 50.3 (постоянный), 2thx
Активность: 0.020
Статус: Участник

Создано: 10 января 2006 22:59
· Личное сообщение · #3

Мож я чот не понял но как-то так:

for ecx:=1 to blablabla
if Byte(Pointer(ecx)^)=$CC then
Byte(Pointer(ecx)^)=$00

Не пробовал, а просто написал от балды




Ранг: 536.4 (!), 171thx
Активность: 0.660.13
Статус: Администратор
Создатель CRACKL@B

Создано: 10 января 2006 23:03
· Личное сообщение · #4

Smon
Если у тебя данные, например в массиве Buf, то тогда вместо строки
mov ecx, 1
пишешь
lea ecx, Buf

-----
Всем не угодишь




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 10 января 2006 23:19 · Поправил: Smon
· Личное сообщение · #5

Всем спасибо, разобрался... =)
Скажем через GetMem(Buf,Size)
Надо было:
mov eax,Buf
mov ecx,Size и т.п.
С lea что то не вышло =) не туда указывает чтоль, надо в отладчике поглядеть... =)

Только вот вопрос один остался, что делать, когда работаем с виртуальными адресами другого исп. файла?
открытого скажем через
hFile:=CreateFileA(pchar(form1.fileedit.Text), GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ведь они совпадают c самим исполняющимся файлом... =(
Придется обязательно копировать в буфер через getmem ?
GetMem(Buffer,SizeOfSection);
SetFilePointer(hFile,FirstSectionAddr,NIL,FILE_BEGIN);
ReadFile(hFile,Buf,SizeOfSection,bread,NIL);
asm
......
end;

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 174.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 10 января 2006 23:40
· Личное сообщение · #6

Smon пишет:
Придется обязательно копировать в буфер через getmem ?

Ну в память же надо как-то данные с диска прочитать. Ну или тот же MapViewOfFile можно использовать.



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 10 января 2006 23:55
· Личное сообщение · #7

deNULL пишет:
Ну в память же надо как-то данные с диска прочитать.

А мне казалось, что SetFilePointer(hFile,FirstSectionAddr,NIL,FILE_BEGIN); - не на диске указатель ставит, а в памяти... или всё же на диске ?

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 11 января 2006 00:11
· Личное сообщение · #8

Есс-но на диск, указатель на память ставится вышеприведенным способом, для этого не надо юзать API.



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 11 января 2006 00:13
· Личное сообщение · #9

Вопросов больше нет, всем пасиб за помощь

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels



 eXeL@B —› Крэки, обсуждения —› Указатели для асма в дельфи
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати