Az iTunes 10-es verzió sem engedi debugolni magát. Éppen úgy, ahogy az előzők sem engedték ezt.
Ahogy korábban is, megint a szokásos rutin részletet kell keresnünk.
.text:1014918C test al, al
.text:1014918E jz short loc_10149198
.text:10149190 push 0 ; uExitCode
.text:10149192 call ds:ExitProcess
.text:1001D970 call sub_1001D780
.text:1001D975 test al, al
.text:1001D977 jz short loc_1001D97C
.text:1001D979
.text:1001D979 loc_1001D979: ; CODE XREF: sub_1001D970+13j
.text:1001D979 mov al, 1
.text:1001D97B retn
.text:1001D97C ; ---------------------------------------------------------------------------
.text:1001D97C
.text:1001D97C loc_1001D97C: ; CODE XREF: sub_1001D970+7j
.text:1001D97C call sub_1001D800
.text:1001D981 test al, al
.text:1001D983 jnz short loc_1001D979
.text:1001D985 call ds:IsDebuggerPresent
.text:1001D98B test eax, eax
.text:1001D98D setnz al
.text:1001D990 retn
.text:1001D990 sub_1001D970 endp
Szinte már rutinszerűen patcheljük át, hogy minden esetben nullás EAX értékkel térjen vissza.
Csakhogy ebben az esetben egy kicsit más a történet, mert a kérdéses programrészleteket nem az iTunes.exe-ben találjuk meg, hanem az iTunes.dll-ben!
Most, hogy elárultam a megoldást, lássuk röviden, hogyan akadhatunk a nyomára - nyilván ez egy olyan kérdés, ami többek oldalát fúrhatja.
Az iTunes.exe IDA-ba töltése után indítsuk el és a dll-ek töltése közben egy időre állítsuk meg a folyamatot, hogy az ExitProcess-t megkereshessük és megszakítást tehessünk le a belépési pontjára - [G] ExitProcess. Ha ez megtörtént, akkor hagyjuk, hogy a betöltődés és a programfutás folytatódjon. Egyszercsak üzenet érkezik, hogy megszakítási ponthoz érkeztünk, ami nem más, mint az ExitProcess. Én itt a stack view-t az ESP regiszter értékére igazítottam és a legtetején levő érték címén levő pozíciót töltettem be a disassembly képernyőre, ahol a meghívott ExitProcess utáni utasításon jelent meg a kijelölés érthető módon. Innentől pedig már gyerekjáték feltérképezni a hatásmechanizmust.
Ennyi a történet.