Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Toisen ohjelman äänen havaitseminen

Sivun loppuun

sniiki [24.06.2008 21:16:42]

#

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.

Metabolix [24.06.2008 21:27:13]

#

Jos oikeudet riittävät, niin järjestelmän äänifunktioiden koukuttamista voi tietysti yrittää. Hankalaksi menee kokemattomalle. ^^

miiro [24.06.2008 21:30:56]

#

jos kehittajaa yrittaisi kaivella ja pyytaa vaikka sorsien julkaisemista? ;)

sniiki [24.06.2008 22:06:06]

#

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.

sniiki [24.06.2008 23:16:09]

#

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.

sniiki [08.07.2008 14:03:46]

#

Eikö kukaan ole tosiaan api kutsujen koukuttamista harrastanut?

btw. tekeekö WM_COPYDATA käskyllä tässä yhteydessä mitään?

jimi-kimi [08.07.2008 19:50:49]

#

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

Metabolix [08.07.2008 20:50:34]

#

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.

sniiki [08.07.2008 21:04:23]

#

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.

Metabolix [08.07.2008 21:25:27]

#

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.

jimi-kimi [08.07.2008 22:04:13]

#

W.dll --> LoadLibrary( "Y.dll ), jotta saadaan ne muutkin funkkarit mukaan kesäkeittoon.

os [08.07.2008 23:32:43]

#

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 (LoadLibraryllä ladatun) alkuperäisen dll:n funktioita kutsumalla oikeaa funktioita GetProcAddressilla saadusta osoitteesta.

Itse en ole tällaisia harrastanut, mutta olisi hauska tietää, jos tuon voisi tehdä jotenkin helpommin.

sniiki [09.07.2008 08:44:30]

#

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.

Metabolix [09.07.2008 09:01:25]

#

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.

Meitzi [16.07.2008 15:06:23]

#

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.

sniiki [16.07.2008 20:38:11]

#

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.

Deffi [17.07.2008 13:26:18]

#

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 (?)

sniiki [18.07.2008 16:30:40]

#

Joo en tiedä sitten miten toi indie osaa sen homman ryssiä niin totaalisesti mutta kaatuu/heittää errorit naamalle joka toisella ohjelmalla.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta