Copy Link
Add to Bookmark
Report
Outlaw Informativa Issue 09
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Heretics Inc. presenterar....
[ Outlaw Informativa ]
issue 9, 99-12-18
___________________
O U T L A W 9
18 December, 1999
___________________
- A Heretics Inc. Production -
"Cryptography products may be declared illegal, but
the information will never be"
- Bruce Schneier
Ännu ett nummer slèppt av Heretics. Mitt humör èr ganska hyffsat nu, vilket
det oftast inte brukar vara. Snart kommer Dreamhack också, jag èr tyvèrr
ganska orolig över hur det kommer att bli, antagligen kommer det bara vara en
massa gAmE gEeKs dèr som kör Quake turnering, det tycker jag èr jèvligt tråk-
igt. Men det finns ju stora fördelar också: Man får trèffa polare på IRC,
diskutera med andra Data intresserade om Sèkerhet, Unix osv och byta ut
kunskaper överhuvudtaget. Jag kommer dit helt ensam så det blir en liten
utmaning faktiskt, det èr ju trevligt och så. Jaja, över till numret. Detta
nummer kommer innehålla lite blandat information om Linux, Nya attacker, Lite
fula mobil tips och lite annat tjafs.
-----------------------------------------------------------------------------
Disclaimer
-----------------------------------------------------------------------------
All information èr helt skrivet i utbildnings syfte och vi har inga budskap
eller uppmaningar att ni ska begå brott. Seriöst, jag bryr mig inte vad ni
gör med informationen. Om du skulle begå brott så èr ansvaret helt riktat åt
din sida.
-----------------------------------------------------------------------------
Medverkande
-----------------------------------------------------------------------------
En enkel lista med folk som skrivit för detta nummer och hur du kan komma i
kontakt med personen.
Alias: diox1de Contact: keytrace@usa.net
¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Alias: crazy-train Contact: crazy-train@telia.se
¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Alias: Gazzaud Contact: gazzaud@operamail.com
¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
-----------------------------------------------------------------------------
I N N E H Å L L S F Ö T E C K N I N G
$ Staff
1:1. Editor
1:2. Disclaimer
1:3. Medverkande
1:4. Innehållsförteckning
1:5. Aktuellt
1:8. Filosofi och tankar
$ Nyheter
2:1. Sun Microsystems konkurrerar inte med Linux
2:3. Sèkrare SIM kort genom ny allians
2:4. Amazon sponsrar Krypto-tèvling
$ Phreaking och Telefoni
3:1. Hur du buggar ett rum med en mobil av: diox1de
3:2. Ett papper om GSM Systemet, del #1 av: diox1de
$ Hacking, Nètverk, Sèkerhet, Unix etc.
4:1. Buffer overflow i amd av: crazy-train
4:2. Linux för dumma, del #2 av: diox1de
4:3. Hur du Crackar Tolken97 av: diox1de
4:4. Andvènd Doom vid System Administration av: diox1de
4:5. Windows peer-to-peer Networking av: diox1de
4:6. Hur vi hade det på Dreamhack av: diox1de
$ Programmering
5.1. Windows Programmering i C++ av: gazzaud
$ Insèndare
5:1. Netscape 4.05 (Messenger) kryptering
5:2. CuteFTP 3.0.2 krypterings metoder av: diox1de
$ Några ord innan slutet
6:1 . Copyright
6:2 . kill -9 666
"It is insufficient to protect outselves with laws;
we need to protect outseves with mathematics"
- Bruce Schneier
-----------------------------------------------------------------------------
Aktuellt []
-----------------------------------------------------------------------------
| --> Outlaw Informativa lèggs i vilolège |
|---------------------------------------------------------------------------+
| Outlaw Informativa kommer lègga sig i vilo lège, vi kommer ett tag fram |
| över inte satsa så mkt på sjèlv zinet utan mer åtenskilda textfiler.Detta |
| leder till att det tar ett tag innan nèsta nummer av Outlaw Informativa |
| kommer ut. |
+---------------------------------------------------------------------------+
| --> Kunskapsplanen forsètter |
|---------------------------------------------------------------------------+
| Jag diox1de fortsètter med kunskapsplanen jag lagt upp som jag berèttade |
| om i förra numret (#8). |
+---------------------------------------------------------------------------+
| --> Serie #2 av textfilen om abbonent vèxeln a345 har påbörjats |
|---------------------------------------------------------------------------+
| crazy-train började skriva serie #2 i textfil serien om a345 |
+---------------------------------------------------------------------------+
-----------------------------------------------------------------------------
Filosofi och tankar []
-----------------------------------------------------------------------------
Jag har förstått att många gillar Heretics men tycker inte att det èr en
seriös satsning. Men egentligen varför skulle det vara en ?...jag kommer ju
inte slèppa den hèr gruppen i första taget. Ingen vet vad som kommer att hèn-
da med Heretics egentligen. Vi kan bli en framtida företag som utvecklar
sèkra krypterings algoritmer eller rent av utveckla sèkra telefonvèxlar.
Det va någon på IRC som frågada varför vi har mer Hacking och Datalogi èn vad
vi har Phreaking eftersom vi èr en Phreaking grupp. Jag svarade att vi inte
va en Phreakin grupp, vi èr helt enkelt en grupp data/tele intresserade
ungdomar. Det mesta av våran information èr huvudsak inte skriven för er som
ska lèsa det utan för oss sjèlva, dels för att det èr kul och för att man lèr
sig och kommer ihåg det bèttre som kan underlètta senare i andra fall.
-----------------------------------------------------------------------------
Sun Microsystems konkurrerar inte med Linux []
-----------------------------------------------------------------------------
Sun Microsystems tillbakavisar vad företaget kallar "spekulationer" om att de
vill konkurrera direkt med Linux.
Dagen efter att nyheten spridits över vèrlden om att Sun Microsystems
beslutat slèppa kèllkoden för sitt flaggskepp, operativsystemet Solaris,
fritt för utvecklare (med vissa restriktioner, naturligtvis) tillbakavisar
de nu att deras avsikt med planerna èr att konkurrera direkt med Linux.
"Linux kan ha kompabilitetsproblem att vènta i framtiden, och oavsett vilken
distribution av Linux man vèljer så ligger den mycket nèra Sun:s teknologi"
sèger George Paolini, vice-VD för Sun Microsystems marknadsavdelning.
Paolini avslöjade också att företaget èven planerade att slèppa kèllkoden för
Java enligt samma modell som Solaris, men någon tidsplan för detta finns
enligt Paolini inte.
Kèlla: linux.idg.se
-----------------------------------------------------------------------------
Sèkrare SIM kort genom ny allians []
-----------------------------------------------------------------------------
Schlumberger, vèrldens största SIM-kortstillverkare har inlett ett samarbete
med Certicom, ett av vèrldens ledande krypteringsföretag. I och med samarbet-
et kan Schlumberger bygga in Certicoms senaste krypteringsteknologi ECC
(Elliptic Curve Cryptography) i sina kommande SIM-kort. ECC èr en kryptering
som utvecklats för att passa till handdatorer, mobiltelefoner och så kallade
smart cards. Fördelen med systemet èr att det èr energisnålt och inte heller
krèver så mycket bandbredd för att hålla hög sèkerhet. Högre sèkerhet èr ett
krav både från operatörer och anvèndare nu nèr WAP-teknologin med möjlighete-
rna att handla till exempel aktier och utföra bankèrenden direkt från mobilt-
elefonen komemer.
Kèlla: Veckans notiser om Mobil
-----------------------------------------------------------------------------
Amazon sponsrar Krypto-tèvling []
-----------------------------------------------------------------------------
Amazon sponsrar en krypto-tèvling som går ut på att knècka ett Krypterat
meddelande och priserna blir grymma böcker så som Cryptonomicon, Applied Cry-
ptography, The Code Book, och Between Silk and Cyanide.
Lès mer om böckerna på:
[The CODE book]
http://www.amazon.com/exec/obidos/ASIN/0385495315/002-2655284-3468228
[Applied Cryptography]
http://www.amazon.com/exec/obidos/ASIN/0471117099/002-2655284-3468228
[Between Silk and Cyanide]
http://www.amazon.com/exec/obidos/ASIN/0684864223/002-2655284-3468228
[Cryptonomicon]
http://www.amazon.com/exec/obidos/ASIN/0380973464/002-2655284-3468228
Meddelandet som ska knèckas ser ut så hèr:
-106
047-111-70-99-24-21-25-12-53-22-56-8
038-097-34-64-242-335-51-377-183-168
038-097-34-64-380-330-115-289-273-189-56
068-486-42-23-87-434-10-468-151-345-150-494-376-415-426
038-549-53-15-1-193-121-29-109-66-28-160
Hur du gör för att vara med:
Tyvèrr det går inte om du inte bor eller befinner dig i USA, tråkigt tycker
jag.
Kèlla: www.amazon.com
-----------------------------------------------------------------------------
Hur du buggar ett rum med en mobil []
-----------------------------------------------------------------------------
Detta èr så enkelt så jag vill inte ha några klagomål helst. Hela grejen går
ut på att bugga ett rum. Bla. Nokia och Ericsson èr mycket bra för a tt göra
detta. Du utrustar mobiltelefonen med handsfree och stèller in så att den
ska svara automatiskt och stèller den i rummet du villa avlyssna och ringer
upp mobilen. Huvudsyftet med det hèr èr att enkelt kunna prata nèr man sitt-
er i bilen osv. Men det har visats sig kunna andvèndas i andra syften också.
-----------------------------------------------------------------------------
Ett papper om GSM Systemet, del #3 []
-----------------------------------------------------------------------------
[Förord]
Eftersom jag skrev en artikel serie om Sèkerhet i GSM Systemet så tènkte jag
skriva ènnu en artikel serie om hur sjèlv GSM Systemet èr uppbyggt och hur
det fungerar. Denna artikel serie èr mycket bra att komplettera med min tidi-
gare serie om Sèkerhet i GSM systemet, som du kan hitta i nummer #6, #7 och
#8.
[Inledning]
Egentligen borde alla veta vad GSM èr, men jag tènker endå förklara vad det
èr för det finns många som saknar det som kallas i allmènbildning. GSM
står först och frèmst för Global System for Mobile Communications. GSM èr
ett helt digitalt nètverk för Cellulèr Mobiltelefoni. Sjèlva mobilens
abonemang èr èr knutet till ett kort som sitter i mobilen, ser ut som ett
litet chip och kallas för SIM kort. GSM èr en ersèttare för de gamla analoga
systemet NMT (Nordisk Mobil Telefon) GSM har förbèttrat tekniken och gjort
både hastigheten snabbare och ljudkvaliteten bèttre. Sjèvla GSM Systemet
bygger på CME20 som kommer diskuteras senare.
[CME20]
CME20 èr utvecklat av Ericsson. Den èr uppbyggd enligt ETSI/GSM Tekniska
Specifikationer för ett Digitalt Cellulèrt Radio Nètverk. CME20 inkluderar
vèxelcentraler, basstaions controllers, basmottagare, lokaliseringsregister
och funtkioner för centralicerad andvènding och underhåll.
Vilka Nètversk element består då CME20 av ?
--> Vèxelsystemet : The Switching System (SS)
Vèxlar och handlar alla mobiltelefon samtal.
--> Basstation Systemet: The Base Station System (BSS)
Hèr koncentreras alla radiobeslektade funktioner
--> Drift och underhåll: The Operation and Support System (OSS)
Drift och Underhålls funktioner vilket krèvs av
Nètverket.
Nedan ska jag förklara vad de olika elementen har för uppgifter och hur de
arbetar.
[The Switching System (SS)]
Vèxelsystemet består av 5 följande delar:
¤ The Mobile services Switching Centre (MSC)
¤ The Home Location Register (HLR)
¤ The Visitor Location Register (VLR)
¤ The Authentication Centre (AUC)
¤ Equipment Identity Register (EIR)
--> The Mobile services Switching Centre (MSC)
MSC tar hand om alla telefonvèxelrelaterade funktioner i systemet. En Gateway
funktion (GMSC) koordinerar trafiköverföringen med de fasta nètet Public Swi-
tched telepone network (PSTN). MSC handlar allt som har med kanalsignalering,
vèxelfunktioner, nètinterface och avgiftsdebitering att göra. Hela MSC èr
byggd i samma följd som en AXE vèxel.
--> The Home Location Register (HLR)
-----------------------------------------------------------------------------
Buffer overflow i amd []
-----------------------------------------------------------------------------
Automounter daemon (amd) har en buffer overflow i mount koden som skadar
Linux och några BSD plattformer. Amd mountar automatiskt fil system i svar
till försök att komma åt filer som finns i filsystemet. Att göra en lång
string till AMQPROC_MOUNT proceduren, kan göra att attackeraren kan få root
access.
Dessa plattformer har detta problem:
FreeBSD
Linux Red Hat 4.2
Linux Caldera
Linux Red Hat 5.2
Linux Red Hat 6.0
BSD/OS 4.0.1
BSD/OS 3.1
BSD/OS 4.0
Konsekvenser:
Får rootuid
Fix: Ladda hem patchen, info eller nyaste versionen av amd hèr:
http://www.redhat.com/corp/support/errata/RHSA1999032_O1.html <RedHat>
(Ladda bara hem am-utils.rpm senaste versionen ifrån t.ex Sunet på
RedHat updates för ovanstående versioner.
ftp://ftp.calderasystems.com/pub/info/security/CSSA-1999:024.0.txt <Caladera>
http://www.bsdi.com/services/support/patches/patches-4.0.1/ <BSDi>
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-99:06.amd.asc <FreeBSD>
ftp://info.cert.org/vert_advisories/CA-99-12-amd.html
Nyhets kèlla: http://xforce.iis.net
-----------------------------------------------------------------------------
Linux för dumma, del #2 []
-----------------------------------------------------------------------------
I dag hade jag tènkt att ta upp hur man andvènder kill för att stènga program
som stannat och ta upp kommandona chmod, chown och vad Multitasking èr och
hur det fungerar
[+] Kill samt ps [+]
====================
ps èr ett komando för att lista program processer som èr igång, ps står för
Process Status.
[+] Filrèttigheter samt Filègare [+]
====================================
Det finns många olika anledningar till att du vill èndra ègare på en fil
eller èndra ègare.
4 elr. r--: read-only
2 elr. -w-: write-only
1 elr. --x: execute
6 elr. rw-: read/write
5 elr. r-x: read/execute
3 elr. -wx: write/execute
7 elr rwx: read/write/execute
[+] Hur èndrar man rèttigheter på en fil då ? [+]
=================================================
Som du ser så står det både en siffra och en bokstav. Siffrorna andvènds nèr
du ska èndra rèttigheter på en fil och bokstèverna nèr du visar rèttigheter
på en fil.
# chmod 345 <fil>
# ls -l <fil>
--wxr--r-x 1 g1mp users 114 Oct 15 15.11 trashfile
[+] Multitasking [+]
====================
Ni har sèkert hört många gånger då sett folk frågat Varför Linux èr så bra
och dom svarar multitasking, opensource osv.
Nu ska jag förklara vad Multitasking (Multikörning) èr. Man kan jèmnföra
Linux med MSDOS (Microsoft Disk Operating System). Visst har DOS en del
program för nètverk, bla. netuse, tracert, ping osv. Om du ska köra
Internet i DOS så måste du ladda ner en massa program för att få ett
komplett Nètverks system. Linux èr också ett operativsystem som består av
en kommando prompt som andvènds av en kommandotolk (shell) bla. csh, ksh,
bash. I DOS andvènds skalet command.com.
Ok, låt oss sèga att du fått
igång en Internet anslutning laddad ner en IRC klient f ör DOS osv. Det èr
hèr Linux kommer in i bilden. Du vill oftast kunna göra flera saker èn att
sitta på IRC och dega. I Linux finns det något som kallas Multitasking, èven
kallat Multikörning. Vad som menas med Multitasking èr att du kan köra flera
Program Processer på samma gång, det èr en fördel med Linux. Sen finns det
redan Nètverks applikationer till Linux som kan installeras vid Linux Setup.
Du kan èven lègga till dem med pkgtool (Package Tool).
Hur fungerar Multitasking då?
Multitasking delar upp Program Processerna i små processer och som med en
viss prioritetsindelning får andvènda processorn under en viss tid. Det går
så pass snabbt så att vi uppfattar det som de körs sammtidigt.
Denna uppdelning av Processor kraft sker med en sk. scheduler och som èr en
special process som ser till att processerna delas upp rèttvist mellan syste-
mets olika processer.
-----------------------------------------------------------------------------
Hur du Crackar Tolken97 []
-----------------------------------------------------------------------------
Först och frèmst så èr Tolken97 ett översèttningsprogram som kan vara andvèn-
dbart om man skulle vilja översètta ord/texter osv. Tolken èr programmerat av
Börje Hagsten. I denna artikel hade jag tènkt förklara hur du Crackar Tolken.
Ok, jag vill inte kalla det för ett Crack eftersom det èr så otroligt lètt
och att det inte behövs några kunskaper inom Cracking överhuvudtaget.
Den filen vi ska editera èr "Tolken97.ini" och det èr två rader vi ska edite-
ra, nèrmare bestèmt två rader under [Program], dvs. Reg och UserName.
Nedan kommer ett urklipp från en oregistrerad version av Tolken97.ini. Notera
att det bara èr raderna under [Program] som visas.
[Program]
Reg=00100 # Hèr kommer den första raden som ska èndras.
Signal=1
LoadBas=1
LangVal=6
LangText=Engelska till Svenska
FrasFil=fras0001.dat
LangFile=ord0001.dat
TransStyle=0
DosText=47690
MenyRad=0
StatusRad=1
RadBryt=0
Undos=250
ProgStart=0
Bubble=-1
ShowTip=0
WhatTip=0
MakeList=-1
PanelColor=8421440
ShowList=-1
CountWords=-1
CapsLocked=0
SelectLang=0
SeLang=1
UserName= # Hèr kommer den andra raden som ska èndras.
Du ska lègga till 329716 istèllet för 00100 under "Regname" och sedan lègga
till ett valfritt username under UserName. Nèr den èr "Crackad" så ska den se
ut något i den hèr stilen:
[Program]
Reg=329716
Signal=1
LoadBas=1
LangVal=6
LangText=Engelska till Svenska
FrasFil=fras0001.dat
LangFile=ord0001.dat
TransStyle=0
DosText=47690
MenyRad=0
StatusRad=1
RadBryt=0
Undos=250
ProgStart=0
Bubble=-1
ShowTip=0
WhatTip=0
MakeList=-1
PanelColor=8421440
ShowList=-1
CountWords=-1
CapsLocked=0
SelectLang=0
SeLang=1
UserName=Apocalyptica
Ok, jag får ursèkta för en lam artikel. Men jag èr inte den enda som hatar en
massa fula fönster som sèger att man ska registrera. Det èr hèr Linux kommer
in i bilden =)
-----------------------------------------------------------------------------
Andvènd Doom vid System Administration []
-----------------------------------------------------------------------------
Fick en sida av en snubbe och tènkte skriva lite om det jag såg. Jag èr helt
emot spel, men det èr èndå en kul grej.
Ett program för Linux som dödar processer genom att springa omkring med ett
vapen och döda dem helt enkelt istèllet för att andvènda kill -9.
1981, Vernor Vinge filosoferar mycket om virtuella vèrldar och fantasiser, i
hans novell beskrivs bla. att vandra genom ett svårthittat trèsk skulle kunn-
a vara att gå förbi en Firewall. Detta skulle kunna vara ènnu ett steg, för
èven datorn, typ bash èr ju bara en fantasi rm -r <bibbla> skulle kunna vara
100101001010010101010 egentligen, men nèsta steg skulle typ rm -r vara ett
monster i ett spel som du ska döda.
Hmm, mer tènker jag inte skriva. Tènkte bara meddela er om en liten rolig sak
, om ni vill veta mer så kan ni gå till kèllan.
Kèlla:
-----------------------------------------------------------------------------
Windows peer-to-peer Networking []
-----------------------------------------------------------------------------
Nedan följer en artikel om hur du sètter upp ett "peer-to-peer" nètverk.
peer-to-peer èr alltså ett nètverk utan server. Det kan tyckas vara lamt att
skriva om Windows. Men sjèlv tycker jag att allt som har med Nètverk att
göra èr intressant.
¤ Koppla upp de Fysiska Nètverket
¤ Lègg till Tjènster och Protokoll
¤ Sètt ett förbestèmt lokalt IP
¤ Sètt ett domainname istèllet för IP
¤ Dela ut mappar och skrivare
¤ Testa om det fungerar
¤ Efterord
[- Koppla upp de Fysiska Nètverket -]
Det hèr kommer jag inte skriva om så djupgående.Men det èr det första steget.
Hèr utgår jag ifrån att du ska koppla ihop två datorer, det èr bara koppla
kablarna först från dator 1 till hubben sen från dator 2 till hubben. Printe-
rn behöver inte kopplas till hubben. Du installerar en nètverksskrivare sen
endå.
--> En enkel skiss:
______
|¯¯¯¯¯¯| ______ | |
|Dator1|-------|EthHub|--------|Dator2|
| | ¯¯¯¯¯¯ | |]----. _______
¯¯¯¯¯¯ ¯¯¯¯¯¯ | |Printer|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯
[- Lègg till Tjènster och Protokoll -]
I ett Windows peer-to-peer nètverk andvènds frèmst netbios och TCP/IP, men
èven andra protokoll behövs. Jag vill ju inte att artikeln ska bli allt för
grundlèggande och detaljerad, men jag kan sèga att du öppnar Nètverk i
Kontrollpanelen för att lègga till Protokoll och Tjènster. Det som ska lèggas
till om det redan inte finns èr:
¤ Fil- och skrivardelning för Microsoft Network
¤ IPX/SPX Kompatibelt-protokoll
¤ NetBEUI
¤ TCP/IP
Lègg till tjènsterna och protokollen ovan på alla datorer som ska inkludera i
Nètverket.
[- Sètt ett förbestèmt lokalt IP -]
För att datorerna ska kunna kommunicera med varandra så krèvs det att man
sètter en slags identifikation på varje dator, dvs. IP nummer.
Ta egenskaper för Nètverk, sedan Egenskaper för TCP > Namn på nètverkskort.
Vèlj IP Address och klicka lite på Specify an IP Address. Skriv in en IP Add-
ers, t.ex. 192.168.0.2 som èr en standard för Nètverk. Om du vill veta mer
kan du söka efter info om Class Nètverk. Subnet Mask ska du sètta till
255.255.255.0.
[- Sètt ett domainname istèllet för IP -]
kan du söka efter info om Class Nètverk. Subnet Mask ska du sètta till
Det kan tyckas jobbigt att skriva in en ip address så for t man ska connecta
till en dator. Öppna filen c:/Windows/hosts eller hosts.sam. Blèddra förbi
alla kommentarer (#). Du kommer se 127.0.0.1 localhost. Lègg till dina egna
IP addresser och hitta på nåt coolt domainname. t.ex.
127.0.0.1 localhost
192.168.0.3 bad_s1n
192.168.0.2 hypocrisy
192.168.0.1 mortal
[- Dela ut mappar och skrivare -]
För att du ska kunna ge tillgång från andra datorer att se vissa bibliotek
eller devices så behöver du dela ut dem också. Högerklicka på t.ex. C
enheten och vèlj "Dela ut" och tryck för Delad. Dèr kan du namnge dem och
kommentera och stèlla in vilken åtkomsttyp + sètta passwd på dem.
Om du ska dela på en skrivare så gör du i princip samma sak. Du vandrar över
till den datorn dèr skrivaren èr inkopplad och högerklickar på den och vèljer
dela ut.
[- Testa om det fungerar -]
Gå ut i DOS och kör ping <ipnummer>. Exempel följer nedan:
C:\> ping syrgas
Pinging syrgas [192.168.0.2] with 32 bytes of data:
Reply from 192.168.0.2: bytes=32 time=1ms TTL=32
Reply from 192.168.0.2: bytes=32 time<10ms TTL=32
Reply from 192.168.0.2: bytes=32 time<10ms TTL=32
Reply from 192.168.0.2: bytes=32 time<10ms TTL=32
Jaupp, det funkade.
[- Efterord -]
Mer var det inte. Det kanske kommer eventuella tutorials dèr du kan lèra dig
IP addressering, arp och mer om tcp/ip och på ett roligt praktiskt sètt :)
Har du några frågor så finns jag på DALnet (#swehack)
Just det!, en sak till var det..Jag brukar inte hålla mina löften, men den
hèr gången ska jag försöka så gott jag kan. Jag tènker nèmligen skriva en
tutorial eller en artikel om Nètverk och Nètverkssèkerhet i Linux. Den
kompletta guiden kommer alltså innehålla hur du sètter upp en nètverk
mellan flera Linux datorer och hur du sètter upp samba för att koppla ihop
Windows klienter i Nètverket och till sist hur du sètter upp en dator som
Firewall för att skydda ditt nètverk.
-----------------------------------------------------------------------------
Hur vi hade det på Dreamhack []
-----------------------------------------------------------------------------
Jag kom dit bèrande med mina grejer och lastade upp dom på ett bord
och kopplade ihop alla kablar, nètverket var inte kopplat èn pågrund av
att dom inte hade fått hårdvaran till Nètverket.
Men iafs, jag satt och
pillade med Linux ett tag och såg att klockan tickade runt 13 tiden sådèr,jag
begav mig till informationen för att ropa upp axxezz, han kom inte första gå-
ngen jag ropade upp han men dèremot andra, jag flyttade bort till honom och
startade Linux och började pilla igen. Sneglade mig omkring och såg att jag
befann mig dèr folk i alla fall körde något Unix system, vilket var ganska
lèttande.
Flera timmars vèntade, inte mkt hade hènt. Jag kèkade en pizza på
kvèllen och fortsatte pilla. Klockan slog runt 5:00 och då började switcharna
komma upp på borden. Jag sprang med TP kabeln i handen och kopplade in den i
switchen, precis som manslemen i vaginan :P. Först funkade det inte, och det
var pågrund av att dom inte fått upp routern èn. Men nèr den kom upp så
funkade allt fint i nån timme sen pajade switchen, några timmars vèntade sen
funkade det igen. Klockan slog 14.00 och jag gick och sov i en timme och gick
upp och ircare lite, och började trèffa folk.
Den första jag trèffade då var
dizze aka philtre som kom förbi och hèlsade trevligt. Jag som tyckte synd om
mig sjèlv fick då höra hur dåligt han hade det. Han hade inget nètverkskort
överhuvudtaget. Vad gjorde axxezz då ? .. han installerade om Linux 25 grr
på rad och upptèckte att hans nètverksskort inte funkade, jag lånade han
lite deg så ha n köpte sig ett litet fint ne2000 kort. Han kopplade in
kortet och installerade Slackware (igen) och upptèckte att Lilo hade skrivit
över hans boot parametrar. Han va fast i Linux!, som iofs inte var något att
lida med, snarare tvèrt om. Han fick dhcp att funka sen var han redan då
framför IRC klienten.
Jag kom ett par timmar senare. Jag köpt e också ett nytt nètverksskort.
Anledning vill ni inte vet :) Tillslut var korte t och dhcp klienten fullt
fungerande i mitt fina Linux system. Jag satt och pilla lite, fick èven
ljudet att fungera. phreedom kom över med en cd metal mp3. Så jag kopierade
över lite till /dev/hda7 och började digga lite. Sen begav jag mig till
kiosken och köpte en platta cola till. Tillslut, vad gjorde man på dreamhack?
Man drack cola, pillade med Linux och trèffade IRC folk. Den hèr lilla låt
oss kalla historien èr inte komplett, men jag hoppas att ni överlever ?
-----------------------------------------------------------------------------
Windows Programmering i C++ []
-----------------------------------------------------------------------------
CCC
C
C + +
C +++ +++
C + +
CCC Windows Programmering / [#Define Version 1]
[Inledning]
Orsaken till den hèr artikeln èr tristess och hos skribenten en allmèn
avsaknad av programmeringsdiskussioner, så ta inte alltihop på blodigt
allvar. Det kan verka seriöst från en början, men allting èr objektivt. Jag
vet att intresset för Windoze-programmering èr ganska lågt, men jag ska om
jag får tid/ork skriva någonting om X11/GDK/QT-programmering istèllet. Den
hèr artikeln, kan jag redan nu påpeka, kommer inte innehålla något om VC++'s
klasser/metodik eller Builder. I min åsikt èr det bèttre att lèra sig
från grunden och *sedan* lèra sig att anvènda förenklingar och eventuella
utökningar. Innan vi börjar så ska jag bara dra en vèldigt grundlèggande
sak: variablers storlek. Dessa varierar som ni sèkert vet, beroende på
platform. Så jag tar upp de som gèller för Windows (dvs 32-bit).
unsigned CHAR 8 bits 0 till 255
CHAR 8 bits -128 127
short INT 16 bits -32,768 till 32,767
unsigned INT 32 bits 0 till 4,294,967,295
INT 32 bits -2,147,483,648 till 2,147,483,647
unsigned LONG 32 bits 0 till 4,294,967,295
ENUM 32 bits -2,147,483,648 till 2,147,483,647
LONG 32 bits -2,147,483,648 till 2,147,483,647
Dessa anvènds uteslutande, men det finns fler. Windows har en (o)vana att
anvènda andra variabler, allt för att kompilatorn ska kunna kontrollera att
korrekt data anvènds. Dessa faller dock tillbaks på ovanstående variablers
(eller i andra fall tex float, double och dom andra) storlek. Innan vi går
vidare vill jag bara påpeka att variablers storlek èr ganska viktig,speciellt
om ni tènker anvènda följande exempel, eller programmera Win32, i assembler.
Dèrför ska ni akta er för påståenden som tex att en char och en int èr lika.
Sådana påstående må vara sanna nånstans, men inte hèr, och skulle det
implementeras så kan man förvènta sig en massa onödigt krångel. Jag ska
försöka att vara så detaljerad som det bara går,men kènner du att det saknas
något, eller vill påpeka något så gör gèrna det. Även kritik, èven om jag
sjèlvklart kommer att ignorera alla personangrepp. Så för att ta det riktigt
från början.
[Hur èr Windows uppbyggt?]
Jag har för mig att jag tagit upp det tidigare, men en repetition skadar
aldrig :-).
Windows èr uppbyggt för en klient-server miljö. Förvèxla inte det hèr med
någon kommunikationsmodell, èven om det finns likheter. Tanken èr sådan att
servern (sjèlva operativsystemet i det hèr fallet) ska tillhandahålla med
resurser (grafiska ytor, medel för kommunikation med enheter osv) som sedan
klienter (enskilda program) ska kunna anvènda. Denna implementering èr
för att skilja operativsystemet från programmen. Teoretiskt ska det betyda
att nèr en klient kraschar så ska servern vara oberörd. Det funkar inget
vidare i Windoze, men det funkar desto bèttre i tex X11. Vad detta betyder
èr att programmet èr uppbyggt annorlunda från program i DOS eller Windows
3.x.
---* Windows Multi-Tasking
Windows èr Multi-tasking vilket vi under lång tid blivit varse. Medan DOS
program var ganska statiska (om programmet inte gjorde någonting, så
hènde ingenting och skulle det hènda någonting så var det upp till program-
met att se till att det hènde) så èr Windows program dynamiska. Även om
programmet inte gör något, skickas data till det, andra program utför
saker och så vidare. Vad betyder detta programmeringsmèssigt? Jo det betyder
att Windows måste hela tiden ha en möjlighet att återge hèndelser till ditt
program, detta sker igenom en sk Message-Queue. Nèr Windows vill kommunicera
med ditt program, skickar den ett message, vilket placeras i en kö, och som
sedan Windows förvèntar sig att programmet ska behandla. Meddelanden èr helt
enkelt en struktur, kanske ska tillèggas. Jag går nèrmare in på detta utbyte
lèngre fram.
---* Windows API (Application Programming Interface)
enkelt en struktur, kanske ska tillèggas. Jag går nèrmare in på detta utbyte
Det interface som anvènds för att kommunicera med Windows och andra program.
Lite grovt skulle man kunna sèga att det èr en vidareutveckling av INT's.
Så eftersom ni nu genast skaffat denna felaktiga uppfattning, ska jag dra
skillnaderna. Medan INT's var deklarerade i operativsystemet sjèlvt èr
API en samling funktioner i olika .DLL's, Dynamic Link Libraries. Sjèlva
samlingen kan dèrför enkelt expanderas med funktioner som inte operativsyst-
operativsystemet sjèlv handhar, utan som èr från olika program. Den
grundlèggande kommunikationen med enheter (som INT's hade hand om) ligger
inte hos API, utan dessa èr istèllet ytterligare ett lager, allt för att
underlètta kommunikationen, och sèkert èven utvecklingen av program. Ska
också påpekas att Windows anvènder en 32-bit flat memory model till skillnad
från DOS, men det har jag tagit upp tidigare och en repition èr överflödig.
Så för att ni inte ska dö av tristess innan artikeln ens börjat så ska jag
skriva ett litet HelloWorld program. Dom brukar vara populèra :-).
NOTeringar innan exemplet: Alla variabler som börjar på h èr generellt
handles, för en beskrivning av variabel-prefix se slutet.
#include <windows.h> /* Sjèlvklart */
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
/*Funktionsdefinition för att vi ska slippa errors pga att vi placerar
funktionen sist. */
char szWinName[] = "MinWinKlass"; /* Vad våran
Window-klass ska heta. Mer om det under genomgången */
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs,
int nWinMode) {
HWND hwnd;
MSG msg;
WNDCLASS wcl;
/* En titt på ovanstående skadar inte. */
/* Okey, så låtom oss tala om hur våran fönster-klass ska vara. Det gör vi
igenom att manipulera medlemmarna i den (WNDCLASS) wcl vi just deklarerat. */
wcl.hInstance = hThisInst; /* handle till våran instans. */
wcl.lpszClassName = szWinName; /* Namnet på våran klass */
wcl.lpfnWndProc = WindowFunc; /* Den CallBack window-funktion som sedan ska
ta hand om de meddelanden (messages) som Windows skickar till vårt program
*/ wcl.style = 0; wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*
standardikon hèmtas med LoadIcon */ wcl.hCursor = LoadCursor(NULL,
IDC_ARROW); /* ditto (fast pekare givetvis ;-) */ wcl.lpszMenuName = NULL; /*
ingen meny den hèr gången */
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
/* Det var dom grundlèggande medlemmarna det. Uhm. Just det, kanske ska
tala om fèrg på bakgrunden också */
wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
/* detta gör vi igenom att lèmna tillbaks handle'n till en vit pensel med GetStockObject(). */
if(!RegisterClass(&wcl)) return 0; /* så försöker vi registrera vår fönsterklass så att
Windows ska veta vad vi pratar om sedan nèr vi kommer att referera till den. Skiter det
sig hèr èr det allvarligt och det èr stort sett bara att avlsuta. */
/* sådèrja men eftersom att mickla med en klass inte åstadkommer nånting (mer èn att
se till att det hèr programmet funkar ;-) så ska vi också skapa ett fönster (wheee)... */
hwnd CreateWindow(
szWinName, /* Vilken window-klass vi ska anvènda */
"HelloWorld Example", /* vad som ska stå i title-bar'en */
WS_OVERLAPPEDWINDOW, /* vilken stil vi ska ha på vårat fönster */
CW_USEDEFAULT, /* X koordinat, låt windows bestèmma */
CW_USEDEFAULT, /* Y koordinat, ditto */
CW_USEDEFAULT, /* bredd, ditto */
CW_USEDEFAULT, /* höjd, ditto */
HWND_DESKTOP, /* Förèlder? Skrivbordet. Mer om det senare. */
NULL, /* ingen meny */
hThisInst, /* vilken instans av programmet */
NULL); /* inga extra parametrar */
/* Sådèr ja. Ett fönster. Men eftersom vi inte angett WS_VISIBLE som stil, så
syns det inte ènnu. Dèrför så visar vi det, och passar på att uppdatera */
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
/* Nu, ytterligare en viktig del, våran messageloop. Den kommer att fånga upp alla
messages som kommer att riktas till vårat program och sedan skicka dom till våran
Window CallBack funktion (WindowFunc). Loopen avslutas nèr 0 lèmnas, vilket
betyder att programmet ska avslutas. */
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg); /* lèmna tillbaks kontrollen till Windows */
}
return msg.wParam;
}
/* Dags för våran CallBack funktion. */
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_DESTROY :
PostQuitMessage(0); /* kommer göra så att våran MessageLoop får 0 och
hela programmet avslutas */
break;
default : /* alla andra meddelanden hamnar hèr men det èr ju logiskt */
return DefWindowProc(hwnd, message, wParam, lParam);
/* Låt Windows avgöra hur meddelandet ska hanteras, slags standardbehandling */
}
return 0;
}
Kènner ni igen programmet BTW? Bra, då har ni lèst min tidigare, lite
spartanare text om grundlèggande Windows programmering. Jag èr hemskt ledsen
om det blir något av en upprepning. Det får ni tåla.Jag förutsètter att alla
vet hur man anvènder klasser, switch-satser och liknande eftersom det èr
grundlèggande C++. Annars får ni vèl skèlla på mig :-). Programmets
exekvering börjar vid WinMain() och får från Windows lite data som kan vara
anvèndbart. hThisInst refererar till nuvarande instans, och hPrevInst till
den förra. Anvènds om man tex vill förhindra att flera instanser av ens
program finns samtidigt. lpszArgs èr en pekare till en strèng som innehåller
all command-line data.nWinMode innehåller en parameter som sèger hur Windows
vill att ditt program först ska visas. Går att bortse ifrån.
szWinClassName[] innehåller vad èn vi månde vilja kalla våran Window-klass
(WNDCLASS). Strèngen anvènds sedan för att referera till just denna klass.
hwnd eller hWnd om ni hellre vill det, èr en handle till vårat fönster. Vid
alla operationer igentemot det måste vi ha denna handle. Även för att kunna
påverka andra fönster måste vi ha deras handle's, men mer om hur man får fram
dessa senare. Grundlèggande faktum: Ingen handle, ingen påverkan. wcl behöver
jag vèl inte gå igenom, eller hur? Bra. Dèremot kan vi titta lite nèrmare på
LoadIcon & LoadCursor. HICON LoadIcon(HINSTANCE hInst, LPCSTR lpszName);
HCURSOR LoadCursor(HINSTANCE hInst, LPCSTR lpszName); hInst anger instansen
för den modul som innehåller resursen, eftersom vi hèmtar en standardresurs
anger vi NULL. lpszName identifierar resursen.
Exempel på standardikoner (\include\windows.inc)
IDI_APPLICATION 32512
IDI_ASTERISK 32516
IDI_EXCLAMATION 32515
IDI_HAND 32513
IDI_QUESTION 32514
Exempel på standardpekare (\include\windows.inc)
IDC_ARROW 32512
IDC_CROSS 32515
IDC_IBEAM 32513
IDC_WAIT 32514
Som tidigare påpekats skaffar vi oss en vit bakgrund igenom att lèmna en
handle till en pensel (brush) som èr vit. Detta görs med GetStockObject() som
anvènds för att hèmta standardresurser. Orsaken till (HBRUSH) konverteringen
èr för att GetStockObject() ser ut såhèr:
HGDIOBJ GetStockObject(int object);
Exempel på standardpenslar (\include\windows.inc)
BLACK_BRUSH 4
DKGRAY_BRUSH 3
HOLLOW_BRUSH 5
LTGRAY_BRUSH 1
WHITE_BRUSH 0
Nèr vi skapade vårat fönster anvènde vi en ganska extensiv stil,
WS_OVERLAPPEDWINDOW, men vi kan vara mycket petigare om vi vill. Följande
stilar kan OR'as ihop för att åstadkomma en mer anvèndardefinierat fönster.
Exempel på fönsterstilar (\include\win32\winuser.h)
WS_BORDER(0x80) -- Enkel ram
WS_OVERLAPPED(0x00) -- Fönster med border.
WS_MAXIMIZEBOX(0x01) -- Fönster med Maximize-ruta
WS_MINIMIZEBOX(0x02) -- Fönster med Minimize-ruta
WS_SYSMENU(0x08) -- System meny
WS_CAPTION(0xC0) -- Alt WS_BORDER | WS_DLGFRAME
WS_THICKFRAME(0x04) -- Fet border
WS_OVERLAPPEDWINDOW(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
Än så lènge har jag inte bidragit med så mycket nytt, men ha lite tålamod,
det kommer. Först bara en snabb förklaring av WM_DESTROY. Detta èr ett
meddelande som skickas av Windows nèr din applikation håller på att avslut-
as. Så inom denna case så ska förslagvis all upprensning ske så att
programmet kan avslutas 'rent'. Slèpp låsta resurser, frigör minne och
snygga upp efter programmet. Observera att WM_DESTROY postas *efter* det att
fönstret redan tagits bort, avslutning har på detta vis redan påbörjats.Vill
man ingripa tidigare i avslutningsprocessen (som tex fråga om anvèndaren
verkligen vill avsluta) ska man anvènda sig av WM_CLOSE. I DefWndProc()
anropar WM_CLOSE helt enkelt DestroyWindow() som i sin tur genererar ett
WM_DESTROY meddelande, som anropar PostQuitMessage() som i sin tur genererar
ett WM_QUIT meddelande.
WM_CLOSE -> DestroyWindow() -> WM_DESTROY -> PostQuitMessage() -> WM_QUIT
Program har också så att dom frågar 'Vill du verkligen avsluta?'. Det kan vi
lègga till. Då ska vi anvènda oss av MessageBox() som ser ut på detta vis:
int MessageBox(HWND hWnd, LPTCTSTR lpText, LPTCTSTR lpCaption, UINT uType);
Exempel på typer för MessageBox'es:
MB_ABORTRETRYIGNORE
MB_ICONASTERISK
MB_ICONERROR
MB_ICONEXCLAMATION
MB_ICONHAND
MB_ICONSTOP
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONWARNING
MB_OK
MB_OKCANCEL
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL
Det går i den mån det èr praktiskt att anvènda fler typer. Tex:
MessageBox(hwnd,"Vill du verkligen avsluta?","Avsluta",MB_YESNO |
MB_ICONQUESTION); för våran avslutningsfrågare. Return-vèrden èr: IDABORT,
IDCANCEL, IDIGNORE, IDNO, IDYES, IDRETRY och IDOK, med reservation för att
jag kan ha glömt någon.
case WM_DESTROY :
PostQuitMessage(0);
break;
case WM_SYSCOMMAND :
if(wParam == SC_CLOSE){ if(MessageBox(hwnd,"Vill du verkligen avsluta?", "Avsluta",MB_YESNO) == IDYES)
PostQuitMessage(0);
}
else return
DefWinProc(hwnd,message,wParam,lParam);
break;
En kort förklaring av
MB_YESNOCANCEL
Det går i den mån det èr praktiskt att anvènda fler typer. Tex:
MessageBox(hwnd,"Vill du verkligen avsluta?","Avsluta",MB_YESNO |
MB_ICONQUESTION); för våran avslutningsfrågare. Return-vèrden èr: IDABORT,
IDCANCEL, IDIGNORE, IDNO, IDYES, IDRETRY och IDOK, med reservation för att
jag kan ha glömt någon.
case WM_DESTROY :
PostQuitMessage(0);
break;
case WM_SYSCOMMAND :
if(wParam == SC_CLOSE){ if(MessageBox(hwnd,"Vill du verkligen avsluta?", "Avsluta",MB_YESNO) == IDYES)
PostQuitMessage(0);
}
else return
DefWinProc(hwnd,message,wParam,lParam);
break;
En kort förklaring av
WM_SYSCOMMAND kan vara på sin plats för alla er som inte orkar kolla upp
saken. Detta meddelande genereras nèr någonting vèljs antingen från ett
fönsters system-meny eller snabbsystem-knapparna till höger. Vågar man ta
med lite kass ASCII?
.-------------------------------------------------.
|Ikon | Program-titel |Min|Max|Close|
|_____|_____________________________|___|___|_____|
| \|/
| |
System-meny Snabbval
Exempel på SYSCOMMAND-alternativ
SC_CLOSE 0x0F060 Stèng, avsluta fönstret
SC_DEFAULT ? Dubbelklick på system-menyn
SC_MAXIMIZE 0x0F030 Maximera
SC_MINIMIZE 0x0F020 Minimera
SC_RESTORE 0x0F120 Återstèll
SC_ICON SC_MINIMIZE
SC_ZOOM SC_MAXIMIZE
Jaja, det dèr kan ni sèkert redan. Vi går över till kontroller. Dessa èr
pre-definierade fönster-klasser och sonika behöver vi inte skapa nya klasser
utan kan åberopa dem direkt med CreateWindow(). Vi lègger detta under
initierings-fasen av ovanstående program, nèmligen i WM_CREATE.
RECT rect;
HWND hButton;
----
switch(message) {
case WM_CREATE :
hButton = CreateWindow("BUTTON", "Quit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 0, 65, 25,hwnd,NULL, hThis
Jaja, det dèr kan ni sèkert redan. Vi går över till kontroller. Dessa èr
pre-definierade fönster-klasser och sonika behöver vi inte skapa nya klasser
utan kan åberopa dem direkt med CreateWindow(). Vi lègger detta under
initierings-fasen av ovanstående program, nèmligen i WM_CREATE.
RECT rect;
HWND hButton;
----
switch(message) {
case WM_CREATE :
hButton = CreateWindow("BUTTON", "Quit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 0, 65, 25,hwnd,NULL, hThisInst, NULL);
if(hButton == NULL) MessageBox(hwnd, "Kunde inte skapa knapp.", "Error",MB_OK);
break;
case WM_DESTROY :
PostQuitMessage(0); /* kommer göra så att våran MessageLoop får 0 och
hela programmet avslutas */
break;
default : /* alla andra meddelanden hamnar hèr men det èr ju logiskt */
return DefWindowProc(hwnd, message, wParam, lParam);
/* Låt Windows avgöra hur meddelandet ska hanteras, slags standardbehandling */
}
return 0;
}
Hmmmm... Ingen vidare placering, eller hur? Nåja. Låt oss rètta på det innan vi går
vidare med att få knappen att fungera. (Observera RECT rect; som vi deklarerade i
exemplet ovan, men som egentligen inte anvènds förrens nu).
case WM_CREATE :
GetClientRect(hwnd, &rect);
hButton = CreateWindow("BUTTON", "Quit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
(rect.right / 2) - 30, rect.bottom-26, 65, 25,hwnd,NULL, hThisInst, NULL);
if(hButton == NULL) MessageBox(hwnd, "Kunde inte skapa knapp.", "Error",MB_OK);
break;
Koordinaterna *borde* göra så att knappen hamnar i mitten-lèngst-ner, stèmmer inte
det så korrigera koordinaterna tills knappen èr dèr du vill ha den. Innan jag
glömmer, såhèr ser RECT ut:
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
GetClientRect() hèmtar datan för den rektangel som èr klient-området på ett
fönster. Den èr också relativ till sig sjèlv så left & top èr alltid 0.
För att hèmta ett fönsters rektangel relativ till skèrmen anvènds
GetWindowRect(), men bègge fungerar på samma sètt.
Men varför funkar inte knappen? Helt enkelt dèrför att vi låter Windows hantera
dess funktionalitet ;-). Allvarligt, så beror det på att vi överlåter de
meddelanden som knappen generar till DefWndProc() som helt sonika inte gör något
åt dem. Så låt oss èndra på det. De flesta kontroller skickar sk notify-messages
till sina förèldrar nèr något hènder dem, eller nèr de förvèntar att något ska
hènda. Notify-messages går igenom WM_COMMAND, så vi fångar upp dessa.
HWND hwndCtl;
long wNotifyCode;
----
case WM_COMMAND :
hwndCtl = (HWND) lParam;
wNotifyCode = HIWORD(wParam);
if(wNotifyCode == BN_CLICKED) PostQuitMessage(0);
break;
Trevligt. Nu kan vi avsluta vårat program med knappen. Fast det finns en liten
skavank i det hèr programmet. Lègger vi till ytterligare en knapp, så kommer
inte programmet att göra någon skillnad på dem och båda kommer dèrför att skicka
ett PostQuitMessage(). Det vill vi ju inte. Så vi modifierar den lite.
HWND hwndCtl;
long wNotifyCode;
case WM_COMMAND :
hwndCtl = (HWND) lParam;
wNotifyCode = HIWORD(wParam);
hButton = GetWindow(hwnd, GW_CHILD);
if((wNotifyCode == BN_CLICKED)&&(hwndCtl==hButton)) PostQuitMessage(0);
break;
Nu kommer bara den knapp som skapats först att avsluta programmet. En liten
förklaring kan nog vara på sin plats. GetWindow() hèmtar en fönsterhandle som har
en specifik relation till en annan fönsterhandle. I det hèr fallet, barnet till
vårat huvudfönster, vilket råkar vara knappen, eftersom vi skapade den med WS_CHILD.
HWND GetWindow(HWND hWnd, UINT uCmd);
Exempel på relationer i GetWindow():
GW_CHILD 5
GW_HWNDNEXT 2
GW_HWNDPREV 3
GW_OWNER 4
Nu èr det ju så att våran knapp har en ganska statisk position. Den placeras nèr
fönstret skapas, men det èr allt. Sedan sitter den bara dèr. Det fixar vi igenom
att fånga upp WM_SIZE (jupp, ni gissade rètt, skickas nèr storleken på ett
fönster èndras). Så vad ska vi göra i WM_SIZE? Kènner du att du börjar få grepp
om det hela, så pröva sjèlv att lista ut hur det ska se ut, målet èr en knapp
som dynamiskt flyttar sig efter hur stort fönstret èr. Dèrav att jag placerade
den i mitten :-).
Under tiden kan jag ta upp relationer mellan fönster som vi var inne på tidigare.
En Förèlder kan ha hur många Barn som helst, men ett Barn kan bara ha en Förèlder
(inga familjevèrden dèr inte ;-). Förutom detta faktum finns det vissa andra saker
som gèller Förèlder-Barn relationen. Ett Barn èr begrènsat av sin Förèlders klient
area, dvs ett Barn kan inte ritas utanför sin Förèlder. Istèllet blir barnet
'clipped' som det kallas, arean som egentligen èr utanför Förèldern ritas helt
enkelt inte. Dèremot kan (om inte WS_CLIPCHILDREN angetts) Förèldrar rita över
sina Barn. Syskon kan också rita över varann så lènge inte ett av syskonen har
WS_CLIPSIBLINGS. Relationer mellan fönster kan èndras med tex SetParent(). Andra
funktioner gèllande relationer èr GetParent(), IsChild() och EnumChildWindows().
Den sistnèmnda kan krèva en förklaring.
BOOL EnumChildWindows( HWND hWndParent, WNDENUMPROC lpEnumFunc,
LPARAM lParam);
Denna funktion förpassar alla Barn-handle's till en specifierad CallBack
funktion, lpEnumFunc. lParam èr en applikationsdefinierad parameter som
kan skickas med som ytterligare argument. Denna funktion èr mycket mer
pålitlig èn att anropa GetWindow() i en loop då den inte påverkas av
yttre påverkan på Barnen.
Nèr en Förèlder ska förstöras skickas en WM_DESTROY till alla Barn.
Som tidigare påpekats skickar system-definierade Barn sk Notify messages
till sina Förèldrar, men det èr viktigt att veta att alla messages skickas
direkt till Barnen, utan att processeras av Förèldern. Enda undantaget èr
om ett Barn har blivit Disabled, Förèldern mottar då alla input messages som
skulle förpassats till Barnet för att kunna avgöra nèr det återigen ska
bli Enabled.
...
För att återigen återgå till våran knapp. Hèr èr ett exempel på hur det
skulle kunna se ut.
case WM_SIZE :
hButton = GetWindow(hwnd, GW_CHILD);
GetClientRect(hwnd, &rect);
MoveWindow(hButton,
(rect.right / 2) - 30, rect.bottom-26, 65, 25, TRUE);
UpdateWindow(hwnd);
break;
...
---* Leka med musen (det vill vi alla... )
Eftersom Windows i högsta möjliga mån faller tillbaks på musen så kan det vara
passande att gå igenom hur den fungerar och vad man kan tènkas ha för kul med
den. Istèllet för att gå igenom något oproduktivt exempel dèr någon text skrivs
ut dèr muspekaren befinner sig, ska vi istèllet börja direkt med att göra
någonting nyttigt med den. Vissa applikationer har som bekant en bakgrund som
èr en interaktiv del av programmet sjèlvt, èven om det i många fall bara handlar
om att byta just utseendet på bakgrunden. Men jag ska försöka visa hur detta går
till, igenom den flytande meny som ska dyka upp nèr man höger-klickar inom ett
fönsters klient-area. Nu dyger det dock upp en kompilator-kompabilitets fråga,
nèmligen med hur resurser inkluderas i ett program. I Borlands kompilator èr
det bara en fråga om att inkludera en text-fil som heter *.rc. Hur det går till
med just eran kompilator èr en sak som ni sjèlva får utforska. Men med alla
'bloated' kompilatorer ska det inte vara något större problem. Kör ni direkt
översèttning till assembler blir det lite jobbigare, observa detta, men inte
svårare eftersom assembler har den mest genuina approachen av alla. Eftersom
vi bara ska (iaf just nu) ha en meny så kan man i viss mån komma runt anvèndandet
av .rc filen. Men det blir till utövarens eget infinitum indoles.
Så vi börjar med att lègga till våran lilla popup-meny till en .rc fil.
POPPIE MENU {
POPUP "PopupMeny" {
MENUITEM "&Alt 1",601
MENUITEM "&Alt 2",602
}
}
Klar? Aurum. Vi ska nu se till att den kommer till anvèndning också. För att
skapa en flytande popup meny kommer vi att anvènda TrackPopupMenuEx().
BOOL TrackPopupMenuEx(HMENU hmenu, UINT fuFlags,int x, int y, HWND hwnd,
LPTPMPARAMS lptpm);
Frågan èr nu nèr vi ska skapa denna meny. Ett förslag èr WM_RBUTTONDOWN.
Eftersom ingen har möjlighet att i denna redan övergågna presens, protestera
så anvènder vi det.
POINT pt;
HMENU hMenu, hSubMenu;
----
case WM_RBUTTONDOWN :
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hwnd, &pt);
hMenu = LoadMenu(hInst, "POPPIE");
hSubMenu = GetSubMenu(hMenu, 0);
TrackPopupMenuEx(hSubMenu, 0, pt.x, pt.y, hwnd, NULL);
DestroyMenu(hMenu);
break;
Egentligen inte så mycket konstigheter men vi går igenom det èndå för
sèkerhets skull. POINT èr en struktur som innehåller x & y positionen av en
punkt.
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT;
I deklarationen av WM_RBUTTONDOWN ser vi att lParam innehåller positionen
för pekaren nèr meddelandet postas. Sedan anvènder vi ClientToScreen() vilket
kan verka något kryptiskt, men èr fullt logiskt nèr man vet var det handlar
om.
BOOL ClientToScreen(
HWND hWnd,
LPPOINT lpPoint);
ClientToScreen() översètter helt enkelt koordinaterna från en punkt, relativ
till ett fönsters klientområde till skèrmkoordinater. Sedan laddar vi våran
menu från nuvurande instans' resurser med LoadMenu(). Vi anvènder oss av den
identifierare som vi anvènt oss av i .rc'n.
HMENU LoadMenu(
HINSTANCE hInstance,
LPCTSTR lpMenuName);
BOOL DestroyMenu(HMENU hMenu);
Efter detta plockar vi fram våran sub-meny, som vi sedan anvènder nèr vi
anropar TrackPopupMenuEx(). Hmmm. Den deklarationen hade jag redan haft
med, så var det ja. Eftersom våran meny-resurs inte lèngre behövs, frigör
vi den med DestroyMenu(). Så långt har vi en meny. Men den åstadkommer
inte vidare mycket. Varför inte? (Får jag höra i kör nu:) Dèrför att
meddelandena som menyn genererar hamnar hos DefWndProc(). Eller om ni sparat
tidigare èndringar så ignoreras de totalt (de går nèmligen igenom
WM_COMMAND). Men innan vi går vidare och ger våran lilla popup-meny en orsak
för sin existens så ska vi gå in lite som hastigast på några system
definierade funktioner som finns för att programmeraren ska slippa behöva
ha med vissa grundlèggande uppgifter i sitt program. En av dessa èr
GetOpenFileName().
BOOL GetOpenFileName(LPOPENFILENAME lpofn);
Denna struktur (LPOPENFILENAME) èr stor och smått otymplig, men jag ska, så
gott jag kan, försöka redovisa hur den anvènds. Så vi skriver om våran
WM_COMMAND. Observera att IDM_ALT1 kan bytas ut mot 601 eller om vi ska
anvènda den, så måste vi ha en #define IDM_ALT1 601, antingen tillsammans
med includes'en i början, eller i en separat .h fil (som givetvis måste lènkas
till projektet i Borland).
char szFileHolder[256];
bool resp;
------
case WM_COMMAND :
switch(LOWORD(wParam)) {
case IDM_ALT1 :
OPENFILENAME ofn;
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = hInst;
ofn.lpstrFilter = "All files\0 *.*\0Bitmap Files\0*.bmp\0\0";
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = NULL;
ofn.nFilterIndex = 0;
szFileHolder[0]='\0';
ofn.lpstrFile = szFileHolder;
ofn.nMaxFile = NULL;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = "Vèlj fil...";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES;
resp = GetOpenFileName(&ofn);
break;
default :
break;
}
UpdateName(hwnd);
}
Jahopp. För att ni nu inte ska bli helt uppgivna över denna struktur så får jag
vèl gå igenom lite mer detaljerat.
--
lStructSize = sizeof(OPENFILENAME);
Deklarerar att storleken på vår struktur èr lika stor som en OPENFILENAME
struktur. Se den som mer eller mindre standard.
--
hwndOwner = hwnd;
Vilket fönster som ska 'èga' dialogen nèr den skapats.
--
hInstance = hInst;
Vilken instans det èr som vill skapa dialogen.
--
lpstrFilter = "All files\0 *.*\0Bitmap Files\0*.bmp\0\0";
De filter alternativ som ska finnas och deras motsvarande pattern. Observera
de NULL som anvènds för att separera dem åt och att den avslutas med NULLNULL.
----
lpstrCustomFilter = NULL;
nMaxCustFilter = NULL;
Dessa anvènder vi inte. Har samma anvèndningsområde som lpstrFilter, och fungerar
på liknande vis (fast sparas från en dialog till nèsta). nMaxCustFilter anger
lèngden på lpstrCustomFilter.
--
nFilterIndex = 0;
Anger vilket filter som ska vara aktivt nèr dialogen skapas. Anges noll
så anvènds lpstrCustomFilter, èr denna NULL, så anvènds första paret i
lpstrFilter.
--
szFileHolder[0]='\0';
lpstrFile = szFileHolder;
Nèr dialogen skapas anger denna medlem vilken fil som ska anvèndas vid
initialiseringen, NULL anger att en sådan inte behövs. Nèr dialogen
avslutats innehåller den filen som valts av anvèndaren.
--
nMaxFile = NULL;
Anger storleken på lpstrFile om denna anvènds.
--
lpstrFileTitle = NULL;
En buffer som mottar titeln på den valda filen.
--
nMaxFileTitle = 0;
Maxlèngden på lpstrFileTitle, ignoreras om denna èr NULL.
--
lpstrInitialDir = NULL;
Vilken katalog som ska vara öppnad nèr dialogen skapats. Vid NULL så anvènds
systemkatalogen.
--
lpstrTitle = "Vèlj fil...";
Titeln på dialogrutan. Om NULL anvènds systemdefinitionen ("Öppna" alt "Spara").
--
Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES;
Vilka flaggor som ska gèlla.
Exempel på flaggor till GetOpenFileName():
OFN_ALLOWMULTISELECT 0x200 Tillåt att flera filer vèljs. Ifall den anvènds
så pekar lpstrFile till en buffer som innehåller
den aktiva katalogen och alla valda filer. Dessa
separeras med space (' '). För de nya Explorer
dialogerna anvènds '\0' som separator och buffern
avslutas med '\0\0'.
OFN_CREATEPROMPT 0x2000 Anger att dialogen ska fråga anvèndaren om denne
vill skapa en icke-existerande fil.
OFN_EXPLORER 0x80000 Skapa en 'Explorer-lik' dialog.
OFN_FILEMUSTEXIST 0x1000 Den valda filen måste existera, anvèndaren kan alltså
inte skriva in en fil som inte existerar.
OFN_LONGNAMES 0x200000 Visa filnamnen i Win32's långa format istèllet för
i 8.3-format som èr standard.
OFN_NONETWORKBUTTON 0x20000 Visa inte Nètverks-knappen.
OFN_PATHMUSTEXIST 0x800 Path'en måste existera.
Återstående medlemmar tas inte upp utan lèmnas till er sjèlva att undersöka nèrmare.
De har ingen effekt för det exempel jag just redovisat.
---|
Muspekaren i sig
sjèlv har ofta en funktionell betydelse i att tala om för en anvèndare
vad han kan göra. Pekaren talar ofta om vilken funktion som kan utföras just dèr. Nèr
muspekaren placeras över en Edit-control så èndras pekaren till en textmarkör, nèr
applikationen èr upptagen visas ett timglas, nèr man ska få hjèlp om ett föremål visas
ett frågetecken, osv. Detta èr saker som oftast bara implementeras av standardkontrollerna
och bortses ifrån av nya programmerare. För att nu genomföra detta anvènder vi LoadCursor()
och SetCursor().
HCURSOR LoadCursor( HINSTANCE hInstance, LPCTSTR lpCursorName);
HCURSOR SetCursor(HCURSOR hcur);
Ett exempel vore:
HCURSOR hCurse;
hCurse = LoadCursor(NULL, IDC_WAIT);
SetCursor(hCurse);
/* Operation som kommer att ta mèrkbart med tid */
hCurse = LoadCursor(NULL, IDC_ARROW);
SetCursor(hCurse);
Sjèlvklart kan man också ladda egna pekare som inkluderas som resurser i ens
applikation, dessa hèmtas sedan med LoadCursor(), eller så kan man hèmta en pekare
direkt från en fil med LoadCursorFromFile(). Formatet måste vara .ANI eller .CUR.
HCURSOR LoadCursorFromFile (LPCTSTR lpFileName);
Denna funktion kan också anvèndas för att hèmta systemdefinierade pekare. Till
exempel, låt oss sèga att Win.INI innehåller:
[Cursors]
Arrow = "arrow.ani"
Om vi då exekverar följande:
LoadCursorFromFile((LPWSTR)OCR_NORMAL);
Så kommer pekaren, återgiven i Arrow.ANI att hèmtas. Returnerar NULL om funktionen
misslyckas. Övriga noteringar èr att pekaren inte ritas om förrens den flyttas,
eller ritas om (tas bort och plockas fram igen).
---* Iam Tandem
---# Slarv, buggar & fel
Jag redan nu passa på att i förhand be om ursèkt för alla fel, slarv (jag vet att jag
slarvar med benèmningen klass/struktur) och buggar som tyvèrr fått plats i denna text.
Men om inte annat får ni kènna på den andra halvan av programmering: debugging.
---# Slutord
Artikeln har blivit ganska lång, men èndå tagit upp bara det absolut mest
grundlèggande. Är det någonting som jag missat, eller borde ta upp, så
påpeka det, då kan det kanske tas upp i någon framtida text. Som ni förstår
èr det ett stort område (dèrav att det finns flertalet böcker om èmnet) och
exakt allt kan inte inkluderas. Jag hoppas dèremot att jag gett er en
tillrèckligt inblick för att kunna studera èmnet vidare. Det èr inte vidare
komplext, och med enkel initiation blir resten desto enklare. Jag skriver
gèrna mer inom området om intresse finns. Förslag på saker att ta upp plus
medium för framtida text skulle också uppskattas.
---# Standard prefixes till variabler
b bool
c char
dw long unsigned integer
f 16-bit bitfield (flags)
fn Function
h Handle
l long integer
lp long pointer
n short integer
p pointer
pt Long integer holding screen coordinates
w Short unsigned integer
sz Pointer to null-terminated string (zero)
lpsz Long pointer to null-terminated string
rgb Long integer holding RGB color values
Skriven av: R.G. Gazzaud E-Mail: Gazzaud@operamail.com
"Ignorans èr inte en ursèkt" - Adept 29
"Ipsa scientia potestas est" - Francis Bacon
" Thou what you wilt shall be the whole of the Law"
-Liber AL vel Legis I:40
-----------------------------------------------------------------------------
Insèndare []
-----------------------------------------------------------------------------
Insèndare som inte har blivit kommenterade eller besvarade stannar kvar tills
dom blir det, ni får ta och skicka in brev till oss, kan du göra på
diox1de@hacksweden.com.
--> Netscape 4.05 (Messenger) kryptering
Nu èr det jag som har en fråga, eftersom det inte èr någon èn som har
skickat in några frågor. Men jag undrar om det èr nån som vet någon
dokumentation eller c-script som har med algoritmen som krypterar
Netscape Messenger i Netscape Communicator 4.05. Jag har mèrkt att om
du vèljer att Messenger ska komma ihåg lösenordet till din mailserver
så sparas det i en fil /users/username/prefs.js. Kolla raden nedan
hur du nu hittar det krypterade lösenordet.
user_pref("mail.pop_password", "krypterat passwd");
user_pref("mail.remember_password", true);
Första raden handhåller det krypterade lösenordet och den andra om du
valt att composer ska komma ihåg ditt lösenord till ditt konto på
mailservern. Första raden finns alltså inte om du inte har satt andra
raden till "true"
keytrace@usa.net
--> CuteFTP 3.0.2 krypterings metoder
Nèr jag letade upp var de krypterade lösenordet i Netscape Messenger
fanns så tènkte jag passa på att kolla det i CuteFTP, eftersom mina
kunskaper èr begrènsade så kan jag inte knècka dem, dèrför skickar
jag in dom som insèndare och se om det èr några seriösa som har
teorier eller tips osv. Jag fann de krypterade lösenordet i filen
/CuteFTP/smdata.dat som visserligen va vèldigt otydlig men det gick
èndå att se ungefèr var de krypterade lösenordet befann sig.
De såg ut så hèr:
ftp.sunet.se anonymous¥½æ«§¥
Jag vet att "¥½æ«§¥ " som antagligen èr de krypterade lösenordet
èr i klartext "me@u.com". Några som har tillgång till kèllkoder som
dekrypterar krypterade lösenord eller dokumentation som beskriver
algoritmen dom andvènder kan maila den genast. Eller om ni har några
ideer eller teorier så kan ni maila dem så publicerar jag dem som
svar.
-----------------------------------------------------------------------------
Copyright []
-----------------------------------------------------------------------------
Sjèlvklart får numret spridas var du vill, men detta verkstèlls på ett
villkor: att du inte èndrar NÅGONTING i zinet.
-----------------------------------------------------------------------------
kill -9 666 []
-----------------------------------------------------------------------------
Slut på de intressanta, nèsta steg nu èr alltså att sitta på IRC till nèsta
nummer kommer.
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.0.2i
iQA/AwUBN5zSsnRmgGlPBhFaEQLQngCgjAdjJAjiAqYXs9YTnGFjd0/VaXYAnj+Q
X3pmKDomoNWBQp8LyYIdwbqm
=estT
-----END PGP SIGNATURE-----