Académique Documents
Professionnel Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Asembler. Podrcznik
programisty
Autor: Vlad Pirogow
Tumaczenie: Wojciech Moch
ISBN: 83-7361-797-3
Tytu oryginau: The Assembly Programming Master Book
Format: B5, stron: 640
Tajniki tworzenia programw dla systemu Windows w asemblerze
Poznaj narzdzia programistyczne
Napisz programy wykorzystujce Windows API
Wykryj i usu bdy z programw asemblerowych
Pisanie programw w asemblerze przez dugi czas kojarzyo si z systemem MS-DOS.
Teraz asembler powoli odzyskuje stracon pozycj jzyka programowania dla systemu
Windows. Wrd wielu zalet asemblera mona wymieni: bezporedni dostp do
procesora, zwarty i niewielki kod wynikowy oraz moliwoci trudne do uzyskania
za pomoc jzykw wysokiego poziomu. Asembler jest niezbdny przy tworzeniu
sterownikw dla urzdze zewntrznych, a korzystanie z niego uczy mylenia
algorytmicznego, od ktrego jzyki obiektowe stopniowo odzwyczajaj programistw.
Ksika Asembler. Podrcznik programisty to kompendium wiedzy dotyczcej pisania
programw dla systemu Windows w jzyku asemblera. Znajdziesz w niej opisy narzdzi
programistycznych i sposoby korzystania z procedur Windows API. Nauczysz si
tworzy programy dla Windows od najprostszych, wykorzystujcych konsol,
a do skomplikowanych aplikacji z interfejsem graficznym. Dowiesz si, jak korzysta
z narzdzi do wykrywania i usuwania bdw, a take poznasz zasady stosowania
asemblera w poczeniu z jzykami wysokiego poziomu.
Narzdzia programistyczne dla systemu Windows
Wywoywanie funkcji Windows API
Programy dziaajce w trybie tekstowym
Tworzenie i wykorzystywanie zasobw
Praca z systemem plikw
Tworzenie bibliotek DLL
Programowanie sieciowe
Wykorzystywanie asemblera w jzykach wysokiego poziomu
Turbo Debugger
Tworzenie sterownikw
Odkryj nieznane obszary programowania -- poznaj jzyk asemblera
Spis treci
Wstp .............................................................................................. 9
Cz I
Cz II
Spis treci
5
Punkty doczania .................................................................................................. 224
Wyszukiwanie plikw ............................................................................................ 225
Asemblacja programu za pomoc asemblera TASM ............................................. 240
Techniki pracy z plikami binarnymi ............................................................................. 240
Jak pobra atrybuty pliku? ..................................................................................... 251
Spis treci
Dodatki ......................................................................................615
Bibliografia ................................................................................... 617
Skorowidz ..................................................................................... 619
Rozdzia 1.
Narzdzia
programistyczne
dla systemu Windows
W niniejszym rozdziale przedstawi krtkie wprowadzenie do kwestii zwizanych
z narzdziami wykorzystywanymi w czasie programowania w asemblerze. Rozdzia
ten przeznaczony jest dla pocztkujcych, dlatego dowiadczeni programici mog go
z czystym sumieniem pomin.
Na pocztek trzeba zauway, e tytu tego rozdziau jest nieco zwodniczy, poniewa
techniki asemblacji w systemie MS-DOS i Windows s do siebie bardzo podobne. Mimo to programowanie w systemie MS-DOS jest ju waciwie odleg przeszoci.
16
Rysunek 1.1.
Schemat
przeksztace
moduu
asemblerowego
w szczegy mona powiedzie, e pierwszy etap przeksztace, ktry nazywa bdziemy asemblacj lub po prostu tumaczeniem, wykonywany jest poniszym poleceniem:
programowania.
Jednak gwn zalet jest moliwo stosowania standardu moduw obiektowych dla
innych systemw operacyjnych. Oznacza to, e bdziemy mogli wykorzysta te moduy przygotowane w innych systemach operacyjnych2.
W celu zobrazowania procesu asemblacji i konsolidacji kodu rdowego zaprezentuj teraz kilka programw, ktre tak naprawd nie robi nic uytecznego.
Na listingu 1.1 przedstawiony zosta program Nie rb nic. Zapiszemy go w pliku
prog1.asm. Zaznaczam teraz, e we wszystkich przykadowych programach instrukcje mikroprocesora i dyrektywy asemblera pisane bd .
2
Tego rodzaju przenono ma jednak pewne ograniczenia, poniewa spore trudnoci moe sprawia
koordynacja wywoa systemowych w poszczeglnych systemach operacyjnych.
17
Jeeli nazwy asemblowanych i konsolidowanych moduw zawieraj w sobie spacje, to musz by one
zamknite pomidzy znakami cudzysowu:
:;
<
:
18
19
Podobnie jak wszystkie przykadowe programy z tego rozdziau program przedstawiony na listingu 1.2 nie ma wikszego sensu. Doskonale demonstruje jednak moliwoci, jakie udostpnia nam dyrektywa . Ponownie prosz o nieskupianie si
na wszystkich instrukcjach mikroprocesora przedstawianych w przykadach. Na razie
interesowa nas bdzie tylko instrukcja .
W naszym programie instrukcja wykonuje operacje dzielenia parametru umieszczonego w parze rejestrw . Wpisujc do rejestru zero, powodujemy, e
dzielona bdzie tylko liczba zapisana w rejestrze .
Asemblacja i konsolidacja programu wykonywane jest programami MASM lub TASM
zgodnie z podanymi wczeniej wskazwkami.
Typy danych
W niniejszej ksice najczciej bdziemy korzysta z trzech gwnych typw danych: bajtu (byte), sowa (word) i podwjnego sowa (double word). Powszechnie
stosowana jest nastpujca metoda zapisu tych typw: bajt !" lub !, sowo
# lub , podwjne sowo # lub . Wybr jednej z metod zapisu
(w jednym miejscu pisz !, a w innym !") dyktowany by chci uwypuklenia
pewnych funkcji jzyka i zrnicowania zapisu.
20
Moduy obiektowe
Wyjani teraz, dlaczego w etapie konsolidacji konieczne jest doczanie innych moduw obiektowych i bibliotek. Po pierwsze, trzeba wspomnie, e niezalenie od
liczby czonych ze sob moduw, tylko jeden z nich moe by moduem gwnym.
Wynika to z bardzo prostej zasady mwicej, e moduem gwnym jest ten, od ktrego rozpoczyna si wykonywanie programu. Jest to jedyna rnica pomidzy moduem gwnym a pozostaymi. Trzeba te pamita o tym, e modu gwny w punkcie
startowym segmentu musi mie zdefiniowan etykiet $. Naley wypisa j rwnie po dyrektywie , poniewa w ten sposb informujemy asembler, eby wpisa
dane punktu wejcia programu do nagwka adowanego moduu.
Z reguy wszystkie procedury wywoywane w danym module umieszczane s w moduach doczanych dyrektyw . Przyjrzyjmy si takiemu moduowi przedstawionemu na listingu 1.3.
Listing 1.3. Modu prog2.asm przechowujcy procedur proc1 wywoywan z moduu gwnego
!
Modu prog2
!
Paski model pamici
"#$%&
'&()*
5A&>3
0#31
+)%/)
,%-"%.)
0#31
0#3
"#?
%(/*
1666
0%)
0#31
%.$
+)%/)
%.$,
%.$
Przede wszystkim prosz zauway, e po dyrektywie nie ma adnej etykiety. Jak
wida, z pewnoci nie jest to modu gwny, ale zawarte w nim procedury bd wywoywane z innych moduw.
Innym wanym elementem, na ktry chciabym zwrci uwag, jest to, e procedura
w tym module musi zosta zadeklarowana ze sowem kluczowym %!. Nazwa tej
procedury zostanie zapisana w module obiektowym, dziki czemu bdzie mona j
czy z wywoaniami z innych moduw.
Moemy wic uruchomi nastpujce polecenie:
21
pocztku znak podkrelenia (') oznacza, e stosowany jest standard ANSI, ktry wymaga, aby wszystkie nazwy publiczne (w tym i nazwy udostpniane innym moduom)
byy automatycznie uzupeniane o znak podkrelenia. W tym przypadku, zaj si tym
za nas program asemblera.
Przyrostek () jest ju nieco bardziej zoony. Przede wszystkim musimy wiedzie, co
oznacza ta kombinacja znakw. Liczba podana za znakiem ( oznacza liczb bajtw,
jakie naley odoy na stos przed wywoaniem procedury. W tym przypadku asembler stwierdzi, e procedura nie wymaga podawania adnych parametrw. Taki zapis
wprowadzony zosta w ramach opisywanej dalej dyrektywy # stosowanej do wygodnego wywoywania procedur. Teraz sprbujemy przygotowa gwny modu programu o nazwie prog1.asm listing 1.4.
Listing 1.4. Modu prog1.asm wywoujcy procedur z moduu prog2.asm
!
Paski model pamici
"#$%&
'&()*
!-------------------------------!
Prototyp procedury zewntrznej
%/)%0.
0#31B6.%(0
!
Segment danych
+$()(
,%-"%.)
+$()(
%.$,
!
Segment kodu
+)%/)
,%-"%.)
,)(0)
3(&&
0#31B6
0%)
!
Wyjcie
+)%/)
%.$,
%.$
,)(0)
W wyniku otrzymamy modu obiektowy prog1.obj. Poczmy wic dwa przygotowane moduy, tworzc kocowy program wykonywalny o nazwie prog1.exe:
1
W czasie czenia moduw jako pierwsza musi by podana nazwa moduu gwnego,
a nazwy pozostaych moduw mona podawa za ni w dowolnej kolejnoci.
22
Dyrektywa INVOKE
Przyjrzyjmy si teraz dyrektywie #. Jest to bardzo wygodne polecenie, jednak
z powodw, o ktrych powiem pniej, osobicie korzystam z niego niezwykle rzadko.
Gwna zaleta dyrektywy # polega na tym, e pozwala ona pomin z nazw procedur przyrostek (. Po drugie, dyrektywa sama zajmuje si zaadowaniem odpowiednich parametrw na stos przed wywoaniem procedury. Dziki temu nie trzeba stosowa poniszej sekwencji polece:
5,@
1
5,@
5,@
5,@
7
3(&&
.(C=(+ 0#3%$50DB.
!
N liczba bajtw do zapisania na stos
Jako parametry mona w niej podawa rejestry, wartoci bezporednie lub adresy. Podajc adres, mona zastosowa zarwno operator #**$, jak i .
Zmodyfikujmy teraz modu prog1.asm (moduu prog2.asm nie trzeba modyfikowa)
tak, jak pokazano na listingu 1.5.
Listing 1.5. Stosowanie dyrektywy INVOKE
!
Paski model pamici
"#$%&
'&()*
!-------------------------------!
Prototyp procedury zewntrznej
0#31
0#)#
!
Segment danych
+$()(
,%-"%.)
+$()(
%.$,
!
Segment kodu
+)%/)
,%-"%.)
,)(0)
>.?#E%
0#31
0%)
!
Wyjcie
+)%/)
%.$,
%.$
,)(0)
23
w bibliotece.
,.
/
,-0,&-, usuwa z biblioteki lib1.lib modu
modul.obj.
Wrmy teraz do naszego przykadu. Tym razem zamiast moduu obiektowego uyjemy w programie przygotowanej przed chwil biblioteki. Na listingu 1.6 pokazano
zmodyfikowan tre programu prog1.asm.
Listing 1.6. Wykorzystanie biblioteki
!
Paski model pamici
"#$%&
'&()*
!-------------------------------!
Prototyp procedury zewntrznej
%/)%0.
0#31B6.%(0
!------------------------------->.3&5$%&>A
&>A1&>A
24
25
W efekcie wywoania tego polecenia na dysku pojawi si plik biblioteki o nazwie lib1.
lib. Teraz moemy poczy modu prog1.obj z utworzon bibliotek:
2
1*
1*
1*
1
26
Pakiet TASM nie pozwala na stosowanie dyrektywy #, dlatego w kolejnych przykadach bd stara si jej unika6.
We wstpie do tej ksiki zadeklarowaem, e bd prbowa jednakowo opisywa oba
asemblery. Rnice pomidzy nimi skupiaj si przede wszystkim na dyrektywach
i makroinstrukcjach (co zobaczymy w rozdziale 5.), dlatego najprostszym pomysem
na uzyskanie zgodnoci programw z obydwoma asemblerami jest unikanie stosowania dyrektyw i makroinstrukcji. Podstaw programowania w systemie Windows tworz wywoania funkcji API (bdzie o nich mowa w rozdziale 2.). Jednak wiemy ju,
e asemblery rni si sposobem wywoywania zewntrznych procedur; MASM wymaga stosowania przyrostka (, a TASM obywa si bez niego. W tym zakresie nie uda
si nam, niestety, unikn stosowania definicji makroinstrukcji. O tym jednak powiemy we waciwym czasie.
27
dobne rozwizanie zostao swego czasu wprowadzone rwnie w jzyku C++. Wedug
mnie powoduje to jednak znaczce trudnoci w czasie czytania kodu takiego programu. Poza tym nie chciabym uchodzi za przesadnego estet, ale nie podoba mi si
program, w ktrym dane i kod s dowolnie przemieszane ze sob.
Na listingu 1.9 przedstawiono sposb uycia trybu uproszczonej segmentacji.
Listing 1.9. Program korzystajcy z segmentacji uproszczonej
!
Paski model pamici
"#$%&
'&()*
!-------------------------------!
Segment danych
$()(
,5"
$=#0$
6
!
Segment kodu
3#$%
,)(0)
!
Segment danych
$()(
(
$=#0$
166
!
Segment kodu
3#$%
"#?
%(/*
(
!
Segment danych
$()(
A
$=#0$
66
!
Segment kodu
3#$%
($$
%(/*
A
"#?
,5"*
%(/
0%)
!
Wyjcie
%.$
,)(0)
Inne narzdzia
uywane do pracy z asemblerem
Na zakoczenie tego rozdziau przedstawiam krtki opis innych programw czsto uywanych w czasie programowania w jzyku asemblera. Pniej cz z tych programw
bdzie opisywana dokadniej, a o pozostaych w ogle nie bdziemy ju wspomina.
28
Edytory
Osobicie w czasie pisania programw asemblerowych nie uywam adnego specjalizowanego edytora, ale chc, aby opisy w tej ksice byy pene, dlatego wspomn tutaj
o dwch takich narzdziach. Na pocztek zajmiemy si edytorem qeditor.exe dostarczanym w pakiecie asemblera MASM. Sam edytor, a take towarzyszce mu narzdzia, zosta napisany w asemblerze. Ju pobiena analiza moliwoci edytora i jego
rozmiaru moe budzi uznanie. Jako przykad podam, e sam edytor ma tylko 27 kB,
a narzdzie do przegldania raportw i wynikw przeksztace programw 6 kB.
Edytor ten doskonale nadaje si do pracy z niewielkimi aplikacjami mieszczcymi si
w pojedynczych moduach. Nie pozwala jednak na wygodn prac z kilkoma moduami. Dziaanie edytora opiera si na interakcji kilku narzdzi poczonych ze sob plikami wsadowymi. Na przykad przeksztacenia programw przeprowadzane s przez
plik wsadowy assmbl.bat, ktry odpowiednio wywouje asembler ml.exe, a wyniki jego dziaania zapisuje do pliku asmbl.txt. Do przejrzenia zawartoci tego pliku konieczne jest uycie programu thegun.exe. Konsolidacja moduw programu wykonywana
jest w podobny sposb.
Narzdzie dumppe.exe stosowane jest do deasemblowania moduw wykonywalnych,
a wyniki tej operacji zapisywane s do pliku disasm.txt. Pozostae operacje wykonywane s w podobny sposb. Wprowadzajc zmiany do poszczeglnych plikw wsadowych,
mona modyfikowa zachowania poszczeglnych narzdzi, a w razie koniecznoci
mona nawet zamieni niektre z uywanych narzdzi (na przykad zamiast programu
ml.exe zastosowa program tasm32.exe).
Drugim edytorem, na ktry chciabym wskaza, jest program eas.exe (Easy Assembler
Shell prosta powoka asemblera). Edytor ten, lub, jak wskazuje jego nazwa, powoka, pozwala na tworzenie, asemblowanie i konsolidowanie zoonych projektw
skadajcych si z plikw .asm, .obj, .rc, .res i .def. Program ten moe wsppracowa
z asemblerem TASM i MASM, a take z innymi narzdziami, takimi jak programy
uruchomieniowe, edytory zasobw itd. Wsppraca z asemblerami i konsolidatorami
moe by przygotowana dziki opcjom tej powoki pozwalajcym na wprowadzenie
opcji wiersza polece dla stosowanego narzdzia.
Programy uruchomieniowe
Programy uruchomieniowe zwane czsto take debugerami (ang. debuggers) pozwalaj na wykonywanie programw w trybie krok-po-kroku. W czwartej czci ksiki
opisywa bd dokadniej programy uruchomieniowe i deasemblery. Do najpopularniejszych programw uruchomieniowych8 na rynku nale CodeView firmy Microsoft,
Turbo Debugger firmy Borland oraz program Ice9.
8
Razem z systemem Windows dostarczany jest nadal debuger debug.exe, jednak program ten nie
obsuguje najnowszego formatu plikw wykonywalnych.
Obecnie firma Microsoft udostpnia na swoich stronach internetowych bardzo dobry program
uruchomieniowy WinDbg, ktry przeznaczony jest do pracy pod systemem operacyjnym Windows.
Bardzo przyjazny jest z kolei OllyDbg dostpny na stronie autora tego bardzo dobrego programu
uruchomieniowego przyp. red.
29
Deasemblery
Deasemblery konwertuj moduy wykonywalne na kod asemblerowy. Przykadem najprostszego deasemblera moe by program dumppe.exe uruchamiany z poziomu wiersza polece. Na listingu 1.10 przedstawiono przykad wydruku przygotowanego przez
program dumppe.exe. Wydruk ten jest wynikiem deasemblowania programu przedstawionego na listingu 1.4. Raczej trudno byoby go rozpozna
Listing 1.10. Wynik deasemblowania programu wykonanego przez program dumppe.exe
1G
HIGJ
HJ
%/%
<
H J
796
11
"
<
H J
76
1167
#K
6
6
>
3,>
66666666
>
,,,
666666A
17
"
HJ
6
6
"G
HJ
''''
@
<
HJ
7
7
0
76
7
0
6
6
G
,
666676
H %J
"I
673
H>J
,
6661
)
(%$1A1
=
(
1919
661
,
66666666
.
66666666
#
I
<
66%6
3I
616'
0
%G
&
&
2
I
"
616A
&
K
1
,
<
3
6666666
,
<
<
66666666
,
<
<
66666666
(
66661666
A
66661666
A
6666666
>
66766666
,
66661666
'
6666666
#
K
766
>
K
666
,
K
766
0K
66666666
>
<
6666666
@
<
6666666
3I
66666666
,
666
H=
J
30
31
Edytory szesnastkowe
Edytory szesnastkowe pozwalaj na przegldanie i edytowanie moduw wykonywalnych w formacie szesnastkowym. Tego rodzaju edytory wbudowane s w wikszo
popularnych programw uruchomieniowych i deasemblerw. Wspomn tutaj tylko
o programie hiew.exe, bardzo popularnym w rodowiskach hakerw. Program ten
pozwala na przegldanie zawartoci moduw wykonywalnych zarwno w formacie
szesnastkowym, jak i w kodzie asemblerowym. Dodatkowo, oprcz moliwoci przegldania plikw wykonywalnych, program ten pozwala rwnie na ich edycj.
Kompilatory zasobw
Oba pakiety, MASM i TASM, dostarczane s z kompilatorami zasobw, ktre bd
opisywa w rozdziale 9. Programy te nazywaj si odpowiednio rc.exe i brc32.exe.
Edytory zasobw
Najczciej korzystam z edytora zasobw doczanego do pakietu Borland C++ 5.0
albo pochodzcego z pakietu Visual Studio.NET, jednak proste zasoby mona tworzy
przy pomocy waciwie dowolnego edytora tekstowego. Jzyk zasobw omawia bd w rozdziaach 9. i 10.