Skype
Из операторской webos-прошивки какого-то HTC-девайса получилось достать SkypeKit под arm!
SkypeKit - это не сам скайп, а только SDK, к которому еще нужно прикрутить какую-то оболочку.
[email protected]:~/Downloads$ ./linux-armv7-skypekit-voicepcm-videortp SkypeRuntime Copyright (C) 2003-2011 Skype Technologies S.A. SkypeRuntime Version: 3.4.1/linux-armv7-skypekit-voicepcm-videortp_3.4.1.620_359974 Proprietary and confidential, do not share this application.
[email protected]:~/Downloads$ ./linux-armv7-skypekit-voicepcm-videortp --help ./linux-armv7-skypekit-voicepcm-videortp: usage: ./linux-armv7-skypekit-voicepcm-videortp [options] ./linux-armv7-skypekit-voicepcm-videortp: [-d path] file where to write debug log ./linux-armv7-skypekit-voicepcm-videortp: [-p port] port for TCP local only communication ./linux-armv7-skypekit-voicepcm-videortp: [-P port] port for TCP global communication ./linux-armv7-skypekit-voicepcm-videortp: [-l name] local communication channel (abstract socket on Linux) ./linux-armv7-skypekit-voicepcm-videortp: [-r logname] record transport streams in <logname>_log_in.1/_log_out.1 ./linux-armv7-skypekit-voicepcm-videortp: [-f dbpath] Skype data path (if dbpath = 'nodb' saves nothing in .Skype directory ./linux-armv7-skypekit-voicepcm-videortp: [-F dbpath] Skype data path with in memory transactional log ./linux-armv7-skypekit-voicepcm-videortp: if dbpath = 'nodb' saves nothing in .Skype directory ./linux-armv7-skypekit-voicepcm-videortp: [-v] print legal notice ./linux-armv7-skypekit-voicepcm-videortp: [-x] do not start netlogging ./linux-armv7-skypekit-voicepcm-videortp: [-b] run crypto benchmark before starting up ./linux-armv7-skypekit-voicepcm-videortp: [-s] set filename prefix for audio & video IPC keys (default /tmp/) ./linux-armv7-skypekit-voicepcm-videortp: [-sa] set filename prefix for audio IPC keys (default /tmp/) ./linux-armv7-skypekit-voicepcm-videortp: [-sv] set filename prefix for video IPC keys (default /tmp/) ./linux-armv7-skypekit-voicepcm-videortp: [-T maxthreads] 0 (default) <= maxthreads <= 32 ./linux-armv7-skypekit-voicepcm-videortp: [-t numthread] 1 (default) <= numthreadpersession <= 3 ./linux-armv7-skypekit-voicepcm-videortp: [-m] enable multiple sessions ./linux-armv7-skypekit-voicepcm-videortp: [-N numparallel] 1 (default:ie main) <= num parallel session <= 32, if > 1 => -m [email protected]:~/Downloads$
Про ключи и обфускацию
Сам рантайм, теоретически, можно скачать с developer.skype.com. Там он есть в том числе и для ARMv7. Отличаться от рантайма, выложенного выше, он будет только вшитым ID компании. Сложность использования текущей версии рантайма (судя по всему, от оператора verizon) состоит в необходимости наличия файла ключа keypair.pem, который позволяет собирать приложения-обертки для рантайма. Каждый файл ключа привязан к рантайму. Сам скайп рекомендует:
WARNING! This method of including key pairs for applications (in separate plain text files) is NOT something that you should ever do in your own applications. You do not want third parties getting access to your key pairs. For this reason, you shouuld use obfuscation techniques to hide the keys in your application.
Возможно, ключ получится достать из той же WebOS. Если нет, останется вариант зарегистрироваться на developer.skype.com и запросить ключ там, но для этого придется подписать очень-очень ограничивающие соглашения. Подробнее http://habrahabr.ru/blogs/skype/124321/
upd: Полученный рантайм отождествлен с вашей зарегистрированной организацией. И во время разработки возможно залогинивание только тех аккаунтов, которые состоят в вашей организации. (цитата с хабра)
Так что вариант с получением ключа на skype.com отпадает. Стоимость production keypair составляет около $4000)
В webos ключ, скорее всего, зашит в один из двух бинарников. Собственно, на этом, скорее всего, все и закончится, поскольку достать его оттуда вряд ли получится. Сами бинарники требуют окружение webos, в ней они работают как интерфейс для javascript-html приложений. skype-validator — судя по описанию из ipkg, валидатор аккаунтов, через него проходит авторизация.
Однако, желающие могут попытаться что-то извлечь вот из этих функций:
0001a484 <_Z10getKeyPairv>: 1a484: e3a00001 mov r0, #1 1a488: e12fff1e bx lr 0001a48c <_Z14releaseKeyPairv>: 1a48c: e12fff1e bx lr 0001a490 <_GLOBAL__I_keyBuf>: 1a490: e30a1688 movw r1, #42632 ; 0xa688 1a494: e3401008 movt r1, #8 1a498: e92d4010 push {r4, lr} 1a49c: e5910000 ldr r0, [r1] 1a4a0: ebffce5b bl de14 <_init+0x8e4> 1a4a4: e30d3e2c movw r3, #56876 ; 0xde2c 1a4a8: e3403008 movt r3, #8 1a4ac: e3a02000 mov r2, #0 1a4b0: e1a04003 mov r4, r3 1a4b4: e5a42004 str r2, [r4, #4]! 1a4b8: e5830000 str r0, [r3] 1a4bc: e2840004 add r0, r4, #4 1a4c0: eb009021 bl 3e54c <_ZN11SEMutexImplC2Ev> 1a4c4: e1a00004 mov r0, r4 1a4c8: e30c1750 movw r1, #51024 ; 0xc750 1a4cc: e3401006 movt r1, #6 1a4d0: eb009789 bl 402fc <_ZN8SEStringaSEPKc> 1a4d4: e1a00004 mov r0, r4 1a4d8: e30c14c8 movw r1, #50376 ; 0xc4c8 1a4dc: e30a260c movw r2, #42508 ; 0xa60c 1a4e0: e3401001 movt r1, #1 1a4e4: e3402008 movt r2, #8 1a4e8: e8bd4010 pop {r4, lr} 1a4ec: eaffcc44 b d604 <_init+0xd4> 000402fc <_ZN8SEStringaSEPKc>: 402fc: e92d41f0 push {r4, r5, r6, r7, r8, lr} 40300: e1a07001 mov r7, r1 40304: e1a06000 mov r6, r0 40308: ebffffd5 bl 40264 <_ZN8SEString7d_unrefEv> 4030c: e3570000 cmp r7, #0 40310: 0a00001b beq 40384 <_ZN8SEStringaSEPKc+0x88> 40314: e3a00028 mov r0, #40 ; 0x28 40318: ebff366f bl dcdc <_init+0x7ac> 4031c: e1a05000 mov r5, r0 40320: e2800010 add r0, r0, #16 40324: ebfff888 bl 3e54c <_ZN11SEMutexImplC2Ev> 40328: e3a0e001 mov lr, #1 4032c: e5865000 str r5, [r6] 40330: e1a00007 mov r0, r7 40334: e585e000 str lr, [r5] 40338: ebff36b5 bl de14 <_init+0x8e4> 4033c: e5961000 ldr r1, [r6] 40340: e2802001 add r2, r0, #1 40344: e3c2400f bic r4, r2, #15 40348: e2840010 add r0, r4, #16 4034c: e5810008 str r0, [r1, #8] 40350: e5964000 ldr r4, [r6] 40354: e5940008 ldr r0, [r4, #8] 40358: ebff36aa bl de08 <_init+0x8d8> 4035c: e1a01007 mov r1, r7 40360: e5840004 str r0, [r4, #4] 40364: e596c000 ldr ip, [r6] 40368: e59c0004 ldr r0, [ip, #4] 4036c: ebff35f4 bl db44 <_init+0x614> 40370: e5962000 ldr r2, [r6] 40374: e3a03000 mov r3, #0 40378: e1a00006 mov r0, r6 4037c: e5c2300c strb r3, [r2, #12] 40380: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} 40384: e5867000 str r7, [r6] 40388: e1a00006 mov r0, r6 4038c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} 40390: e1a06000 mov r6, r0 40394: e1a00005 mov r0, r5 40398: ebff35f2 bl db68 <_init+0x638> 4039c: e1a00006 mov r0, r6 403a0: ebff3626 bl dc40 <_init+0x710>
…и так далее. Это фрагменты файла skypem, прошедшего через дизассемблер
Дополнительно
SDK (возможно, слегка устаревшее): https://docs.google.com/leaf?id=0B-tYGGx-gUMFMWJlOWJhYTUtNmYyYi00NTkyLWI1MTEtMmQ5NzlkZWNjYTgx&hl=ru
Пример консольной скайп-звонилки: http://developer.skype.com/skypekit/reference/cpp/examples.html