Jos jollekin sanoo jotain ohjelma Indie Volume (www.indievolume.com) niin vastaavanlainen sovellus pitäisi saada tehtyä, tuon ko. softan kehittäjä kun tuntuu painuneen maan alle ja jättäneen kehityksen kesken.
Eli kysymys: onko kellään hajuakaan mitä kautta toisen ohjelman äänentuottoa kannattaisi lähteä metsästämään? Riittäisi siis kun pystyttäisiin havaitsemaan kun tiedossa oleva prosessi puskee ääntä ulos.
Jos oikeudet riittävät, niin järjestelmän äänifunktioiden koukuttamista voi tietysti yrittää. Hankalaksi menee kokemattomalle. ^^
jos kehittajaa yrittaisi kaivella ja pyytaa vaikka sorsien julkaisemista? ;)
Kehittäjää kiinnostaa vastata yhteydenottoihin yhtä paljo ku kamelia jalkapallo. Omassa sovelluksessa ulkoisten ohjelmien äänilähtöjä ei siis tarvi pystyä ohjaamaan, ainoastaan kuulemaan (liekö siinä sitten edes eroa loppupeleissä jos esim directsound rajapinnalla pelataan).
Indievolumen PITÄISI pystyä seuraamaan ja ohjaamaan directsound ja waveout rajapintoja, mutta todellisuudessa se yleensä kaataa ohjelmat.
Sen verran asiaa selvittelin, että ilmeisesti jos Winmm API:n toimintoja tiedetystä prosessista pystyisin seuraamaan, olisi homma kaiketi pulkassa. Nyt kun joku vielä osaisi neuvoa miten tämä tapahtuu.
Asiaa helpottanee sekin, että seurattava ohjelma pyörii oman softani "sisällä" pictureboxiin kaapattuna.
Eikö kukaan ole tosiaan api kutsujen koukuttamista harrastanut?
btw. tekeekö WM_COPYDATA käskyllä tässä yhteydessä mitään?
sniiki kirjoitti:
Eikö kukaan ole tosiaan api kutsujen koukuttamista harrastanut?
Kyllä on harrastettu. Tuntuu erittäin vastenmieliseltä koko homma ja tulet sen itsekin huomaamaan. Aloitteleppa vaikka IDA Pron, OllyDBG ja Visual Studion kaltaisista ohjelmista. Kirjastoksi aloitukseen suosittelen MS Detoursia ( 1.5 versio ). Tämän jälkeen sitten ASM on hyvä ystäväsi...
Aloittele vaikka muistion funktioiden uudelleen ohjaamisesta. Dr Death on jollakin sivustolla julkaissut jopa esimerkin aiheeseen liittyen.
Mm. muistinkin sivuston. GameDeception.com
Itse lähtisin ehkä ennemmin liikkeelle siitä, että huijaisin ohjelman käyttämään omatekoista DLL:ää, joka käsittelisi soittofunktioiden dataa ensin itse. Menetelmä on tietenkin riippuvainen kyseisten soittofunktioiden toiminnasta, johon en ole henkilökohtaisesti tutustunut. Jos funktioiden rakenne mahdollistaa datan kaappauksen tuossa välissä, tämä tie on paljon helpompi kuin oikea koukuttaminen. VB voi olla puuhaan aika työläs ohjelmointikieli.
Vastenmieliseltä tuntuu aihe joo mitä nyt oon useilta sivustoilta siitä lukenu. Molempien teidän ehdottamia tapoja on tullu vastaan, mutta missään ei sen konkreettisempia esimerkkejä ole vaan teksti on vähemmän kokeneelle melko ympäripyöreää jaarittelua periaatteista.
Metabolix, selvennykseksi viä eli ohjelma jonka ääntelyä pitäisi seurata on navigaattorisofta jonka sielunelämästä ei ole sen enempää tietoa.
No tässä konkreettinen esimerkki.
Ohjelma X käyttää kirjastoa Y.dll, joka sisältää funktion Z. Tehdään oma W.dll, joka sisältää myös funktion nimeltä Z. Tämä W.dll:n Z käsittelee saamiaan parametreja halutulla tavalla ja kutsuu sitten edelleen Y.dll:n Z-funktiota. Muokataan ohjelmaa X heksaeditorilla niin, että se lataa Y.dll:n sijaan W.dll:n, tai vaihtoehtoisesti nimetään W.dll uudestaan Y.dll:ksi (otetaan toki vanha ensin talteen). Nyt ohjelman X kutsuessa Z-funktiota kutsu meneekin omatekoiselle funktiolle, joka nappaa datan välistä.
Koodeja en rupea tähän kirjoittelemaan, kun en Basicilla osaa tähän hätään kuitenkaan. Mitään kovin kummoista tietämystä kohdeohjelman sielunelämästä ei tarvitse olla, jotta homma onnistuisi.
W.dll --> LoadLibrary( "Y.dll ), jotta saadaan ne muutkin funkkarit mukaan kesäkeittoon.
http://www.ddj.com/windows/184416897
Ainakaan tuon mukaan ei onnistu ihan noin yksinkertaisesti, vaan kaikkille dll:n sisältämille funkkareille (tai vähintäänkin niille, joita sorkittava ohjelma käyttää) pitäisi kirjoittaa omaan dll:ään täsmälleen samanlaiset vastineet. Nämä wrappaisivat (LoadLibrary
llä ladatun) alkuperäisen dll:n funktioita kutsumalla oikeaa funktioita GetProcAddress
illa saadusta osoitteesta.
Itse en ole tällaisia harrastanut, mutta olisi hauska tietää, jos tuon voisi tehdä jotenkin helpommin.
Kiitos vastauksista. Ihan helppo tuo homma ei tosiaan ilmeisesti ole kun ei kerran noita IndieVolumen kaltaisia sovelluksia ole muita vastaan tullut, eikä kukaan esim. mp3car.com:ssakaan ole moista väsännyt vaikka tarve on autoPC:n käyttäjille kohtuu akuutti. Itse en todellakaan asiaa penkoisi tällä osaamiselle muutoin, mutta kun navisofta ja musasoitin pyörii pc:ssä samaan aikaan, on ihan kohtuullisen tarpeellista että soitin hiljenisi siksi aikaa kun se akka haluaa käännöksissä neuvoa.
Tuo os:n linkki selkeytti tuota "vale-dll":n käyttöä hyvin.
os kirjoitti:
Kaikkille dll:n sisältämille funkkareille — — pitäisi kirjoittaa omaan dll:ään täsmälleen samanlaiset vastineet.
Tämän pitäisi kyllä onnistua jokseenkin näin:
;; Oma funktio, joka "kutsuu" uutta. ;; Tästä kannattaisi tehdä makro, jolla saa helposti luotua funktioita funktio: mov eax, .nimi jmp hyppyri .nimi: db "funktio",0 ;; "funktio", joka hyppää alkuperäiseen funktioon ;; eax = osoitin alkuperäisen funktion nimeen ;; HANDLE y_dll_kahva voidaan täyttää vaikkapa DllMain-funktiossa. hyppyri: push eax push DWORD [y_dll_kahva] call GetProcAddress ; ([y_dll_kahva], eax) add esp, 8 push eax ; Hypätään haettuun osoitteeseen ret
Koodi on luonnollisesti testaamatonta.
sniiki kirjoitti:
Kiitos vastauksista. Ihan helppo tuo homma ei tosiaan ilmeisesti ole kun ei kerran noita IndieVolumen kaltaisia sovelluksia ole muita vastaan tullut, eikä kukaan esim. mp3car.com:ssakaan ole moista väsännyt vaikka tarve on autoPC:n käyttäjille kohtuu akuutti. Itse en todellakaan asiaa penkoisi tällä osaamiselle muutoin, mutta kun navisofta ja musasoitin pyörii pc:ssä samaan aikaan, on ihan kohtuullisen tarpeellista että soitin hiljenisi siksi aikaa kun se akka haluaa käännöksissä neuvoa.
Jos vain seuraat yleistä äänen ulosmenoa? Eikös se ole helpompaa. Eli jos se eroaa siitä mitä soitin on sinne puskenut, tiedät että joku muu ohjelma ääntää myös.
Mistäs tiän eroaako se siitä? Vähän hankalaa on alkaa mitään äänenpätkiä nauhotteleen ja tulkkaamaan josko se äänipätkä koostuikin ajo-ohjeista ja sillon olis jo myöhäistä tehdä asialla mitään.
Melko hankalalta vaikuttaa :/ Itse asiasta kiinnostuneena otin selvää miten IndieVolume toimii. Se nimenomaan koukuttaa (madCodeHookkia käyttämällä) seuraavat funktiot:
WinMM.dll
PlaySoundA/W
sndPlaySoundA/W
waveOutOpen
waveOutPrepareHeader
waveOutUnprepareHeader
waveOutWrite
waveOutPause
waveOutClose
waveOutReset
waveOutRestart
waveOutGetVolume
waveOutSetVolume
waveOutGetPitch
waveOutSetPitch
dsound.dll
DirectSoundCreate
IDirectSoundBuffer.GetCaps
IDirectSoundBuffer.GetCurrentPosition
IDirectSoundBuffer.GetFormat
IDirectSoundBuffer.GetVolume
IDirectSoundBuffer.GetPan
+ 20 muuta...
Ja kaiken huipuksi:
user32.dll
MessageBeep
MessageBoxExA/W
MessageBoxIndirectA/W
Eipä olisi todellakaan mikään helppo homma kyseessä. Vaihtoehtona tietenkin olisi koodata jonkinlainen ajuri, joka nappaisi kaiken ulosmenevän äänen. Tosin semmosenkin tekeminen on turhan vaikea temppu, ja äänidatan alkuperää prosessin tarkkuudella tuskin pystyisi selvittämään (?)
Joo en tiedä sitten miten toi indie osaa sen homman ryssiä niin totaalisesti mutta kaatuu/heittää errorit naamalle joka toisella ohjelmalla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.