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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
15-1141874085
antonn
2006-03-09 06:14
2006.04.02
Горячие клавиши


1-1141049935
VIB
2006-02-27 17:18
2006.04.02
Почему у ActionToolBar-a справа нет кнопочки???


6-1134724621
Puk
2005-12-16 12:17
2006.04.02
Передать данные POST-методом в окно IE


15-1141777694
Ы
2006-03-08 03:28
2006.04.02
Мониторы


2-1142856157
olevacho_
2006-03-20 15:02
2006.04.02
FreeReport v2.33.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский