Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизASM в Delphi Найти похожие ветки
← →
Новичоккк (2006-03-07 19:46) [0]Пытаюсь реализовать один и тот же код на Pascal"e и ASM вставкой:
program Project1;
uses
windows,messages,sysutils;
label
lbl;
var
a,b:array [0..19] of byte;
i:integer;
{$R *.res}
begin
for i:=0 to 19 do
begin
a[i]:=111;
b[i]:=111;
end;
for i:=0 to 19 do a[i]:=a[i] xor 100;
asm
push esi;
push eax;
push ecx;
mov si,0;
mov cx,20;
lbl:
mov al,b[si];
xor al,100;
mov b[si],al;
inc si;
loop lbl;
pop ecx;
pop eax;
pop esi;
end;
messagebox(0,PChar(IntToStr(b[0])+":"+IntToStr(a[0])),"A:B",0);
end.
ASM код написан правильно? Почему компилятор ругается на строки, выделенные жирным (Operand size mismatch)?
← →
Новичоккк (2006-03-07 19:46) [1]С тегами напутал =)
program Project1;
uses
windows,messages,sysutils;
label
lbl;
var
a,b:array [0..19] of byte;
i:integer;
{$R *.res}
begin
for i:=0 to 19 do
begin
a[i]:=111;
b[i]:=111;
end;
for i:=0 to 19 do a[i]:=a[i] xor 100;
asm
push esi;
push eax;
push ecx;
mov si,0;
mov cx,20;
lbl:
mov al,b[si];
xor al,100;
mov b[si],al;
inc si;
loop lbl;
pop ecx;
pop eax;
pop esi;
end;
messagebox(0,PChar(IntToStr(b[0])+":"+IntToStr(a[0])),"A:B",0);
end.
← →
xayam © (2006-03-07 19:57) [2]а так:
program Project1;
uses
windows,messages,sysutils;
label
lbl;
var
a,b:array [0..19] of byte;
i:integer;
{$R *.res}
begin
for i:=0 to 19 do
begin
a[i]:=111;
b[i]:=111;
end;
for i:=0 to 19 do a[i]:=a[i] xor 100;
asm
push esi;
push eax;
push ecx;
mov si,0;
mov cx,20;
lbl:
mov al,byte(b[si]);
xor al,100;
mov byte(b[si]),al;
inc si;
loop lbl;
pop ecx;
pop eax;
pop esi;
end;
messagebox(0,PChar(IntToStr(b[0])+":"+IntToStr(a[0])),"A:B",0);
end.
← →
begin...end © (2006-03-07 20:09) [3]asm
PUSH ESI
MOV ECX, 20
LEA ESI, A
@@1:
XOR BYTE PTR [ESI], 100
INC ESI
LOOP @@1
POP ESI
end
← →
Новичоккк (2006-03-07 20:48) [4]Спасибо.
А можно делать jmp на адрес? Не относительный...
← →
begin...end © (2006-03-07 21:00) [5]> Новичоккк (07.03.06 20:48) [4]
Переформулируйте вопрос.
← →
Новичоккк (2006-03-07 21:07) [6]Я не помню. Возможен ли jmp по абсолютному адресу (сегмент/смещение)?
Не уверен, что точно опять точно сформулировал...
Ну, к примеру, если написать просто jmp lbl, то метка lbl должна находиться +-127 байт. Возможен ли вариант с указанием точного адреса, а не смещения относительно EIP
← →
begin...end © (2006-03-07 21:19) [7]> Новичоккк (07.03.06 21:07) [6]
> Возможен ли вариант с указанием точного адреса, а не смещения
> относительно EIP
Да, конечно. Например:
MOV EAX, $12345678
JMP EAX
или
JMP [адрес_адреса_перехода]
← →
Новичоккк (2006-03-08 10:25) [8]Почему-то вариант:
JMP [адрес_адреса_перехода]
не проходит
Смотрел дебаггером, на этом месте всего два байта, на которых происходит Access Violation.
И вот еще, пытался с помощью mov занести NOP в последующую команду - получаю опять же Access Violation (Write ...). Windows как-то блокирует запись? Или это я где-то ошибся?
← →
begin...end © (2006-03-08 11:09) [9]> Новичоккк (08.03.06 10:25) [8]
> Почему-то вариант:
> JMP [адрес_адреса_перехода]
> не проходит
Код можно увидеть?
1. JMP EAX -- переход на команду, адрес которой содержится в EAX
2. JMP [$XXXXXXXX] -- переход на команду, адрес которой содержится в памяти по адресу $XXXXXXXX
3. JMP [EAX] -- переход на команду, адрес которой содержится в памяти по адресу, указанному в EAX
> на этом месте всего два байта
На каком месте?
> происходит Access Violation
Вероятно, связано с отсутствием нужных атрибутов доступа к памяти.
Вообще, какая задача решается, если не секрет?
← →
Новичоккк (2006-03-08 16:21) [10]Задача такова:
Есть DLL. В ней:...
.text:103F2D18 push offset token
.text:103F2D19 call ds:InitializeBlowfish
.text:103F2D1F mov esi, ds:WideCharToMultiByte
...
Необходимо перед вызовом InitializeBlowfish декодировать строку token (20 байт), а потом после вызова опять закодировать (тем же XOR"ом).
Как я хочу сделать... Заменить в файле команду "push offset token" на jmp к моему коду, в котором:
1. Декодируется token
2. Заноситься в стек его смещение (выполняем затертую джампом команду)
3. Выполняется jmp на 103F2D19 (call ds:InitializeBlowfish)
НО. Как я узнал, переход на адрес занимает 7 байт, а "push offset token" 5 байт. Т.е. затирается часть команды "call ds:InitializeBlowfish".MOV EAX, $XXXXXXXX
JMP EAX
=B8 XX XX XX XX FF E0
Поэтому получается код должен реализовать следующую последовательность:
1. Декодируется token
2. Заноситься в стек его смещение (выполняем затертую джампом команду)
3. Восстанавливаем команду "call ds:InitializeBlowfish"
3. Выполняется jmp на 103F2D19 (call ds:InitializeBlowfish)
Возможно ли это?
Вознакаем множество вопросов:
1. Можно ли разместить свой код в любом "свободном" месте (в файле есть дыры в десятки килобайт, заполненные $00)
2. IDA показывает все команды со смещением $10300000. А адрес загрузки уже WinHEX"ом смотрю совсем другие (начиная с $00350000). И что мне непонятно, смещения в АП к примеру для команды "push offset token" идут $103CE284, при этом копирование происходит из 91E284.
В принципе весь код я уже написал (который реализует 4 пункта), только у меня ничего не работает =) Программа вылетает
← →
Новичоккк (2006-03-09 14:26) [11]АП. Код можно записывать в любое место АП процесса, а потом делать на него jmp?
Страницы: 1 вся ветка
Текущий архив: 2006.04.02;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.043 c