Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.048 c
2-1142582433
MixAnOL
2006-03-17 11:00
2006.04.02
Глобальный {$DEFINE DEBUG}


2-1142841790
RomanH
2006-03-20 11:03
2006.04.02
Ввод в MaskEdit


15-1141730029
Pazitron_Brain
2006-03-07 14:13
2006.04.02
Skype


2-1142835729
pkm
2006-03-20 09:22
2006.04.02
Помогите с массивом


2-1142416375
Russ
2006-03-15 12:52
2006.04.02
Сервис после запуска сразу останавливается