Alternatywny sposob zdobycia wiedzy dot. programowania (c i asm)

Gynvael Coldwind

Zazwyczaj gdy czegos nie wiemy siegamy po google/helpa, ale co zrobic gdy nie wiemy czego szukac? Ponizsza historia z zycia wzieta moze podsunac jakis pomysl =^^=. Zycze milego czytania. (z gory przepraszam za bledy w pisowni jesli jakies mi sie trafily oraz brak polskich znakow diakrytycznych)

Pewnego nudnego wieczoru stwierdzilem ze zrobie sobie taki sprytny prog do obslugi tacki na piw... tzn. tacki cd-romu, czyli do zmuszania jej zeby wyjechala i sie schowala. Oczywiscie nie mialem zielonego pojecia jak cos takiego napisac, czego w ogole szukac etc, ale to mi nigdy nie przeszkadzalo, wiec dlaczego teraz mialo by zaczac.
Zaczalem od przypomnienia sobie ktore z aplikacji ktore mam pod reka umieja wysuwac tacke... Hmm.. Umie explorer (RMB na ikonie CD-ka i wysun).. I umie CDplayer... To drugie bylo mniejsze, wiec bardziej przyjazne =^^=. Przerzucilem cdplayer.exe z %windir% do %temp% i zdeasmowalem (dumppe dolaczonym do MASM32). Powoli zaczalem przegladac listing w poszukiwaniu podejrzanych polecen. Znalazlem jakies RtlMoveMemory ktorego w zyciu nie uzywalem, ale stwierdzilem ze to to raczej nie bedzie odpowiedzialne za cdka, wiec szukalem dalej. Wkoncu natknalem sie na jakies "mciSendCommandA".

-- cdplayer.asm --
00401D44 6A00                   push    0
00401D46 6A00                   push    0
00401D48 6804080000             push    804h
00401D4D 50                     push    eax
00401D4E FF15B8064100           call    dword ptr [mciSendCommandA]
-- cut --

Brzmialo ciekawie wiec odpalilem MSDNa i troche o tym poczytalem.

-- msdn --
The mciSendCommand function sends a command message to the specified MCI device.
MCIERROR mciSendCommand(
  MCIDEVICEID IDDevice,  
  UINT uMsg,             
  DWORD fdwCommand,      
  DWORD dwParam          
);
-- cut --

Czulem ze trafilem w dziesiatke. Zaczalem wiec przegladac wszystkie parametry z jakimi wywolywano ta komende (szczegolnie mi chodzilo o uMsg i fdwCommand).

-- co znalazlem --
803h, 3602h
804h, 0
814h, 100h
814h, 110h
808h, 0
809h, 0
855h, 8
806h, 0Ch
807h, 8
80dh, 200h
80dh, 100h
80ah, 800h
-- cut --

Poszukalem w MSDNie jakies przykladowej wartosci i zaczalem przeszukiwac %vch% (katalog includow VC++) w poszukiwaniu *.h z zapisanymi wartosciami. Dlugo szukac nie musialem. Mmsystem.h, tak sie zwal ten header. Rozpoczalem porownywac parametry wywolan do tego co tam pisalo (glownie uzywajac polecen:
type mmsystem.h | find "814"
type mmsystem.h | find "100" | find "STATUS"
etc... wiem, jestem hardcorowiec ;p )

-- po porownaniu --
803h, 3602h	// MCI_OPEN, MCI_WAIT | MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS | MCI_OPEN_TYPE_ID | MCI_OPEN_TYPE 
804h, 0		// MCI_CLOSE
814h, 100h	// MCI_STATUS, MCI_STATUS_ITEM
814h, 110h	// MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK
808h, 0		// MCI_STOP
809h, 0		// MCI_PAUSE
855h, 8		// MCI_RESUME, MCI_TO
806h, 0Ch	// MCI_PLAY, MCI_FROM | MCI_TO
807h, 8		// MCI_SEEK, MCI_TO
80dh, 200h	// MCI_SET, MCI_SET_DOOR_CLOSED
80dh, 100h	// MCI_SET, MCI_SET_DOOR_OPEN
80ah, 800h	// MCI_INFO, MCI_INFO_MEDIA_IDENTITY
-- cut --

Przeczucia mnie nie mylily...

80dh, 200h	// MCI_SET, MCI_SET_DOOR_CLOSED
80dh, 100h	// MCI_SET, MCI_SET_DOOR_OPEN

Strzal w dziesiatke.. Odpalilem wiec VC++, zalozylem projekt, otwarlem jakis przyklad otwierania urzadzenia MCI i zaczalem pisac.. szybkie [type %vch%\windows.h | find "mmsystem.h" /i] wykazalo ze header mci jest zaincludowany w headerze windowsa... po chwili linker oznajmil ze chce jakas biblioteke do tego, wiec w programie pojawila sie linijka #pragma comment(lib,"winmm.lib")...

-- moj kod wygladal tak --
#pragma comment(lib,"winmm.lib")

#include<windows.h>
#include<stdio.h>

int main(void)
{
	UINT wDeviceID;
	DWORD dwReturn;
	MCI_OPEN_PARMS mciOpenParms;
	MCI_STATUS_PARMS mciStatusParms;

	mciOpenParms.lpstrDeviceType = (const char*) MCI_DEVTYPE_CD_AUDIO;
	if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
	    MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (unsigned long) &mciOpenParms)) 
	{
		printf("error!\n");
	}

	wDeviceID = mciOpenParms.wDeviceID;
	return 0;
}
-- cut --

Odpalilem i... Po paru minutach resetowalem kompa.. Eh tak to jest jak sie nie przemysli tego co sie pisze =^^=... moj blad polegal na tym ze otwieralem urzadzenie MCI "cdaudio", ale go nie zamykalem, czyli po jednym odpaleniu progsa unieruchamialem sobie dostep do tego urzadzenia... Po resecie dopisalem procke zamykajaca i ql... wsio dziala jak nalezy... sprawdzilem procki wysuwajace i chowajace tacke, dzialaly bez zarzutu, dorzucilem tez sprawdzanie stanu urzadzenia zeby prog wiedzial czy trzeba schowac tacke czy ja wystawic =^^=... Efekt moich dzialan mozna podziwiac w pliku eject.c...
Ofc 27kb exeka wysuwajacego tacke strasznie drazni wiec przepisalem prog na asma i odrazu poczulem sie lepiej (1,5kb exek =^^=)... (eject.asm)

Moraly z tej historii....
a) nie trzeba czegos umiec zeby to zrobic, wystarczy po drodze sie tego nauczyc =^^=
b) wszystko jest opensource po przejechaniu deasmem =^^=

...C0d3 ur dreams...
. Gynvael Coldwind .
........2003........
x

11 komentarzy

type %vch%\windows.h | find "mmsystem.h" /i Ale find ma opcję przeszukiwania pliku dyskowego... - zdeasembluj to zobaczysz.

Ad. 2) Doskonale o tym wiem :>
Ad. 4) "W ogóle" - polecam [url]http://slowniki.onet.pl[/url] ^_-

Marooned

  1. a, ok =^^=
  2. hehe RE to nie tylko crack =^^=
  3. =^^=
  4. k... jak sie wkoncu pisze.. "w ogole" czy "wogole" ? /me zwatpil

Dryobates eh ... jak mowilem.. to jest INNE SPOJRZENIE na te sprawy.. jak mowilem.. na google/helpach/docach/forach/ircach swiat sie nie konczy...

No to jedziemy.... :>
1) nie tłumacz się brakiem polskich liter - w artykułach tego przestrzegamy!
2) art wygląda jak zaczątek tutoriala "jak złamać program xxx" autorstwa jakiegoś crackera :-)
3) taki tok postępowania mnie nie dziwi - dlaczego? sam się domyśl :>
4) i popraw to "w_ogóle"!! :-P

Chyba ty nie zrozumiałeś mnie :)
Chodzi mi o to, że ja najpierw szukałbym w dokumentacji, bo prawie zawsze jest tam informacja, jak coś takiego zrobić. Sam z niej korzystałeś, tyle tylko, że nazwę funkcji znalazłeś przeglądając kod, a nie dokumentację. IMHO przeszukiwanie dokumentacji jest zazwyczaj bardziej efektywne a poza tym znacznie bardziej rozwija. Mnóstwo ciekawych rzeczy dowiadujesz się przez przypadek. Przeglądanie kodu źródłowego zostawiłbym na koniec, kiedy już nigdzie nie można nic znaleźć na ten temat, bo wtedy konieczne jest domyślać się co to jest, a w dokumentacji masz dokładny opis.
A co do 256b to wcale nie uważam, by były nieefektywne. Wręcz przeciwnie. Nie dość, że te cuda ukazują, jak można zrobić coś pisząc program minimalnych rozmiarów, to dodatkowo rozwijają tego, który pisze, ucząc m. in. metod optymalizacji oraz dają możliwość troszkę innego spojrzenia na problem.

lofix aaa fakt... zawsze o tym "w ogole" zapomne... thx =^^=

Podoba mi się. Należy zrozumieć intencje autora. Niecierpię ludzi działających według pewnego schematu, twierdzących że ten a nie inny sposób jest dobry.
Rozwiązanie które podał Gynvael Coldwind może i nie jest efektywne, ale przecież nie o to chodziło.
Pozdrawiam.

popraw te wogole bo Maciek z krzesła spadnie :)

hehe, metoda dziala, wiec jest efektywna =^^=.. niektorzy wola ludzi meczyc jak cos zrobic, a inni wola meczyc komputer, ja naleze do tych drugich =^^=
zreszta chodzilo tutaj mi bardziej o pokazanie ze swiat sie na google/ircu/forum nie konczy, ze sa inne sposoby by cos odkryc...
niektorych rzeczy nie znajdziesz w necie a ludzie tez moga nie wiedziec.. (np, do plyty glownej dolaczony masz soft pobierajacy temp. procka z termometru na plycie, ale chcesz zrobic swoj prog / sprzezyc z shellem or sth, ale producent plyty jest jakis kosmiczny i nigdzie nic nie ma jak to zrobic... ta medota nadaje sie tutaj jak ulal =^^=)
a odkrycie kola od nowa daje niewatpliwa satyswakcje odkrywcy... nie kazdy wie od A do Z czym jest kolo
inna sprawa ze nawet jesli ta metoda na prawde jest nieefektywna i ja po prostu tego nie widze.. so what, who cares... it's fun anyway =^^=.. (tak samo intro 256b mozna powiedziec ze jest nieefektywnym sposobem na pokazanie jakiegos efektu graficznego skoro mozna to zrobic lepiej piszac prog ktory zajmuje 1mb... ale nie o to w tym chodzi)

podsumowujac...
Dryobates, albo sie lubisz czepiac, albo nie do konca zrozumiales (moze ja zle wyjasnilem) o co w tym arcie chodzilo, albo ja jestem dziwny ze lubie takie hardcore'owe metody =^^=

A to mi zawsze mówili, że koło od nowa wynajduję... Bijesz mnie o głowę. Aż tak nieefektywnych metod nie używam ;)