Я уже, как-то пользовался подобной фичей, а тут умница Indy (я ведь не ошибаюсь, Danilova на васме - это он?), напомнил. В результате получился вот такой кодик:
BITS 32
global main
extern printf, exit
main: push 0x003eafcc
push 0x100
push L1
push 0
mov eax, 123
mov ebx, 1
mov ecx, esp
mov edx, 16
int 0x80
add esp, edx
xor eax, eax
cdq
jmp 7:0
L1: mov edx, 0xc88cffff
db 0x66, 0xea
dd L2
jae L2
L2: push edx
push eax
push format
call printf
add esp, 8
push 0
call exit
format db "EAX=%08x EDX=%08x", 10, 0
EAX=7 EDX=FFFF
Для тех, кто в танке, можно и подробнее:
main: push 0x003eafcc ; 32:0 T:2 R-X:1 G:0 NP:0 U:1
push 0x00000100 ; limit
push L1 ; base
push 0 ; entry
..................
L1:
BITS 16
mov dx, 0xffff
mov ax, cs
jmp dword 115:L2
L2: BITS 32
Ага?
P.S. Привет дизассемблерам и кривоэмуляторам. Indy - respect.
UPD. Чтобы жизнь медом не казалась, переходим на x64:
L1: BITS 16
mov ax, 20
int 0x80
mov dx, 0xffff
mov ax, cs
jmp dword 0x23:L2
.............................
add esp, 8
jmp 0x33:L3
L3: mov al, 60
mov di, 13
syscall
$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 26 vars */]) = 0
[ Process PID=19183 runs in 32 bit mode. ]
....
modify_ldt(0x1, 0xffe28ddc, 0x10) = 0
Unknown value CS=0x07 while detecting personality of process PID=19183
getpid() = 19183
....
[ Process PID=19183 runs in 64 bit mode. ]
|