Jump to content

Нужен код EXEC на Delphi (в ASM коде)


Recommended Posts

Знаете, есть такая функция WinExec под Delphi. Так вот, надо запустить прогу, но ограничение софта (драйвер VXD) не позволяет использовать модули Delphi (юзаю только консоль без никаких наворотов :-(

Посему откликнитесь кто-нить у кого есть кусок кода (Pascal/Delphi), но именно в ASM или Inline обработке....

Link to comment
Share on other sites

В том-то и проблема - не могу использовать ни один модуль Delphi - у меня модуль компилится в .OBJ файл и линкуется с ASM-модулем для получения VXD драйвера. При попытке использовать функции модулей выдает ошибку "unresolved symbol WinExec" и линковки не происходит :-(

Посему и надо сделать подпрограмму на ASM и врезать ее в юнит Delphi...

вот что у меня есть (это на ASM), и как бы теперь все это врезать в Delphi...

mov stkseg,ss ; save stack pointer

mov stkptr,sp

mov dx,offset pname ; DS:DX = program name

mov bx,offset pars ; ES:BX = param block

mov ax,4b00h ; function 4bh, subfunction 00h

int 21h ; transfer to MS-DOS

mov ax,_DATA ; make our data segment

mov ds,ax ; addressable again

mov es,ax

cli ; (for bug in some 8088s)

mov ss,stkseg ; restore stack pointer

mov sp,stkptr

sti ; (for bug in some 8088s)

jc error ; jump if EXEC failed

.

.

.

stkseg dw 0 ; original SS contents

stkptr dw 0 ; original SP contents

pname db '\CHKDSK.COM',0 ; pathname of child program

pars dw envir ; environment segment

dd cmdline ; command line for child

dd fcb1 ; file control block #1

dd fcb2 ; file control block #2

cmdline db 4,' *.*',cr ; command line for child

fcb1 db 0 ; file control block #1

db 11 dup ('?')

db 25 dup (0)

fcb2 db 0 ; file control block #2

db 11 dup (' ')

db 25 dup (0)

envir segment para 'ENVIR' ; environment segment

db 'PATH=',0 ; empty search path

; location of COMMAND.COM

db 'COMSPEC=A:\COMMAND.COM',0

db 0 ; end of environment

envir ends

Link to comment
Share on other sites

БЛИН! Я же объясняю - используй ф-ю CreateProcess!

Она НЕ Delphi-вская, она Windows-овская (причём есть как 32, так и 16 битные её версии!)

Эта функция - самая что ни на есть системная. Системней НЕ бывает!!!

И что ты думаешь, что ASM не использует Windows-овских ф-й?

Если так, то ты жестоко ошибаешся. В ASM коде ПОЛНО системных Windows-овских ф-й.

Например:

push eax; // HANDLE открытого файла.

call CloseHandle;

Тем же способом реализуется запуск программ в ASM коде.

Link to comment
Share on other sites

  • 20 years later...

procedure AsmWinExecCMD(uAddr:Cardinal);
asm
  push ebp
  mov ebp, esp  
  Sub esp, 80h 
  mov byte PTR [ebp-08h], 63h // c
  mov byte PTR [ebp-07h], 6dh // m
  mov byte PTR [ebp-06h], 64h // d
  mov byte PTR [ebp-05h], 2eh // .
  mov byte PTR [ebp-04h], 65h // e
  mov byte PTR [ebp-03h], 78h // x
  mov byte PTR [ebp-02h], 65h // e
  mov byte PTR [ebp-01h], 0h // 0x00
  Lea esi, [ebp-08h] 
  push 1 // 0=SW_HIDE 1=SW_SHOWNORMAL
  push esi // cmd.exe
  mov EAX, uAddr 
  call EAX  
  leave
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  uAddrStr:string;
  uAddrCard:Cardinal;
begin
  uAddrStr :=  '$' + IntToHex(DWORD(GetProcAddress(GetModuleHandle('Kernel32.dll'), 'WinExec')), 8);
  uAddrCard := StrToInt(uAddrStr);
  AsmWinExecCMD(uAddrCard);
end;

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...