Operacje na argumentach

0

Mam pytanie odnośnie asemblera (nasm).
Jak wywołuje program z konsoli "cos.com 123".
Jak dostać się do tej liczby 123 by móc na niej operować ?

0

O ile mnie pamiec nie myli to bedzie to esp+8(zaczyna sie lista argumentow funkcji) dla 32 bit.

  • pewne rozwiazanie:
    napisz mini programik w c, a potem uzyj ndisasm czy innego disassemblera.
0

Bezpośrednio nie możesz się tak odwołać. EntryPoint x86, x64 nie dostaje argumentów - bo niby po co mu to, trzeba sobie samemu sparsować, albo użyć jednej z funkcji bibliotecznych (nazwy z Windowsa): __GetMainArgs, __getmainargs, __wgetmainargs, CommandLineToArgvW.
Pierwsza z nich jest w zabytkowej bibliotece crtdll.dll.
Dwie kolejne są we wszystkich msvcr*.dll.
Ostatnia jest w kernel32.dll.

Druga z nich, __wgetmainargs z msvcrt.dll, pod windowsem 7 wow64 ma jakiś okropnie mocny limit na ilość znaków w pojedynczym argumencie z linii poleceń - o ile pamiętam, to przy 128 znakowym argumencie już obcinało.

;dla x86, trzeba zlinkować z msvcrt.dll; użyty linker: rozbudowany alink
segment .bss
_iwbargc:resd 3
global _entrypoint

segment .text
_entrypoint: ; tu ustawiasz punkt wejścia programu
	extern __imp___getmainargs
	push _iwbargc+8 ; &newmode
	push 0 ; expand=false
	push _iwbargc+8 ; &environment
	push _iwbargc+4 ; &argv
	push _iwbargc ; &argc
	call [__imp___getmainargs]
	push dword[_iwbargc+8]
	push dword[_iwbargc+4]
	push dword[_iwbargc]
	call main

	extern __imp_ExitProcess
	push eax
	call [__imp_ExitProcess]

; a tutaj masz "main" w znanym stylu z języka C - int __cdecl main(int argc,char* argv[])
main:
	mov eax,[esp+4] ; argc - ilość argumentów
	mov edx,[esp+8] ; argv - tablica wskaźników
	push dword[edx+(0*4)] ; argv[0]
	extern __imp_puts
	call [__imp_puts] ; puts(argv[0]);
	pop eax ; zamiast add esp,4

	sub eax,eax ; return 0
	ret ; bez parametru, bo main jest cdecl

Oczywiście, nazwy funkcji i sposób ich wywołania zależą od linkera. Prefiksu _imp używamy z dllkami pod Windowsem by uniknąć generowania "jmp" przez linker.

1 użytkowników online, w tym zalogowanych: 0, gości: 1