Tworzenie i uruchamianie wstawek w asemblerze do programów w języku C z wykorzystaniem Microsoft Visual Studio
Spis treści:
Pozyskać i zainstalować Microsoft Visual Studio: w zasadzie może być dowolna wersja wspierająca C/C++ (w niektórych wersjach C/C++ nie jest domyślnie wybrane), wystarczy Express, ale warto rozważyć nowsze, bardziej rozbudowane wersje, np. darmową Community
Dokumentacje obu narzędzi można znaleźć pod poniższymi adresami::
Przygotowanie projektu:Przygotowanie programu w asemblerze, asemblacja i łączenie:
section .text global _start ; poczatek programu _start: ; etykieta _start jest wymagana przez ld i gdb nop ; konieczny do zastawienia pulapki mov ax,3 ; A = 3 mov bx,5 ; B = 5 while: cmp ax,bx ; tu bedziemy (ewentualnie) zakladac pulapke i zadawac z debuggera parametry je end jg AgtB AltB: sub bx,ax jmp while AgtB: sub ax,bx jmp while end: int 3 |
main.asm
nasm -f elf main.asmjeśli wszystko pójdzie poprawnie uzyskamy plik:
main.o
ld -m elf_i386 -o main.x main.o(tutaj moga wystąpić problemy w przypadku braku wsparcia dla 32bitowych narzędzi - ewentualnie trzeba będzie wybrać inny niż elf_i386 np. w Cygwinie i386pe)
main.x
Uruchamianie programu w debuggerze:
gdb main.x
gdba potem badany program poleceniem file:
file main.x
disassemble _start,+20
Dump of assembler code from 0x8048060 to 0x8048074: 0x08048060 <_start+0>: nop 0x08048061 <_start+1>: mov $0x3,%ax 0x08048065 <_start+5>: mov $0x5,%bx 0x08048069 <while+0>: cmp %bx,%ax 0x0804806c <while+3>: je 0x804807a |
set disassembly-flavor intelwyświetlmy teraz jeszcze raz np. 25 bajtow program (disassemble _start,+25):
Dump of assembler code from 0x8048060 to 0x8048079: 0x08048060 <_start+0>: nop 0x08048061 <_start+1>: mov ax,0x3 0x08048065 <_start+5>: mov bx,0x5 0x08048069 <while+0>: cmp ax,bx 0x0804806c <while+3>: je 0x804807a |
break *_startnie zadziała w obecnych wersjach narzędzi ponieważ:
break *_start+1i uruchamiamy program poleceniem:
runprogram zatrzyma się na zastawionej pułapce
disassemble _start,+28
Dump of assembler code from 0x8048060 to 0x804807c: 0x08048060 <_start+0>: nop => 0x08048061 <_start+1>: mov ax,0x3 0x08048065 <_start+5>: mov bx,0x5 0x08048069 <while+0>: cmp ax,bx 0x0804806c <while+3>: je 0x804807a |
break *_start+9albo od etykiety while:
break *while
info breakpoint
Num Type Disp Enb Address What 1 breakpoint keep y 0x08048061 <_start+1> 2 breakpoint keep y 0x08048069 <while> |
delete 2
info registeralbo konkretnego rejestru np. akumulatora (ax)
print $ax(polecenie print ma użyteczne przełączniki /d = wyświetlanie dziesiętne i /x = wyświetlanie szesnastkowe)
set $ax = 3 set $bx = 5program możemy teraz wznowić poleceniem continue (polecenie run rozpocznie program od początku)
quit
steplub
nexti(dopóki nie będziemy wywoływać funkcji oba działają tak samo)
display /3i $pc