2009年4月29日星期三

酷我音乐盒协议逆向分析

使用lrcdis听歌可以实现桌面歌词,但很多歌词都与歌曲对不上号,或快或慢。酷我音乐盒这方面做得很不错,分析一下,写个程序移动LINUX上面。
用wireshark来捕获虚拟机WINXP上面酷我音乐盒的歌词获取网络数据,分析其歌词获取的流程是这样的:
1、发送歌词获取请求到服务器,如下面这样的形式URL:
http://newlyric.koowo.com/newlyric.lrc?DBYAHlRXVkFdXVRRV0I0MDYlKjBcV1dLXUdfMSk9SdOIobyrkaW6079cV1dLXUdfQBwdAEAiGCMMFgwPTx0LCBAAHx0KHEQJCg8IAwYWFhFKHRYeHFgWBQRJHBwUWF9PHAEXAgsNBApTu7vVtdXFSBgXEQUaG1MQRQgFGhxOAAoQ
2、服务器收到客户端的歌词获取请求后,返回压缩过的歌词文件和一些其它的歌曲相关信息。
数据如下:
!!!酷我音乐盒!!!
未加密过的歌词获取URL参数:
user=88888888,MUSIC_2.2.1.0_PX,酷我音乐盒2.2.1.0.exe,KwMusic&requester=localhost&type=sim&req=3&songname=罗百吉&artist=i miss you
客户端发送的歌词请求:
http://newlyric.koowo.com/newlyric.lrc?DBYAHlRXVkFdXVRRV0I0MDYlKjBcV1dLXUdfMSk9SdOIobyrkaW6079cV1dLXUdfQBwdAEAiGCMMFgwPTx0LCBAAHx0KHEQJCg8IAwYWFhFKHRYeHFgWBQRJHBwUWF9PHAEXAgsNBApTu7vVtdXFSBgXEQUaG1MQRQgFGhxOAAoQ
歌词服务器返回数据 :
HITFROM=tag
ZIPSIG=1568180347,3357133508
Path=10/6/1837755805
TP=content
show=0
PK(注:歌词等歌曲相关信息数据,PK表示使用ZIP方式来压缩。)

看起来歌词获取URL的参数是BASE64编码过,但使用BASE64工具解码后,发现不是字符串,得到的是乱码。
话不多说,PERDR反汇编后:
来到下面歌词获取代码:
* Possible string reference 627B1Ch "yeelion"
|
004DFF57 push 00627B1Ch
004DFF5C push edx
004DFF5D mov ecx, edi

* Reference to MSVCP71.?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ
|
004DFF5F call dword ptr [00618090h]
004DFF65 push eax
004DFF66 push esi
004DFF67 call 004194D0h // encode_url



//url加密函数:
004194D0 push ebx
004194D1 mov ebx, [esp+10h]
004194D5 push ebp
004194D6 push esi
004194D7 push edi
004194D8 push ebx

* Reference to MFC71.762
|
004194D9 call 005A83D6h
004194DE mov esi, [esp+1Ch]
004194E2 mov ebp, eax
004194E4 mov ecx, ebx
004194E6 mov eax, ecx
004194E8 shr ecx, 02h
004194EB mov edi, ebp
004194ED rep movsd
004194EF mov ecx, eax
004194F1 add esp, 04h
004194F4 and ecx, 03h
004194F7 rep movsb
004194F9 mov edi, [esp+20h]
004194FD mov eax, edi
004194FF lea edx, [eax+01h]
-1>-----
00419502 mov cl, [eax]
00419504 inc eax
00419505 test cl, cl
00419507 jnz 00419502h
00419509 sub eax, edx
0041950B mov esi, eax
0041950D xor eax, eax
0041950F test ebx, ebx
00419511 jle 00419534h
-1>-----
00419513 xor ecx, ecx
00419515 test esi, esi
00419517 jle 00419530h
00419519 lea esp, [esp+00000000h]
-1>-----
00419520 cmp eax, ebx
00419522 jge 00419534h
00419524 mov dl, [ecx+edi]
00419527 xor [eax+ebp], dl //将原明文URL与“YEELION”异或加密,怪不得BASE64解码后会是乱码而不是URL字符串
0041952A inc eax
0041952B inc ecx
0041952C cmp ecx, esi
0041952E jl 00419520h
-1<-----
00419530 cmp eax, ebx
00419532 jl 00419513h
-2<-----
00419534 mov eax, [esp+14h]
00419538 push ebx
00419539 push ebp
0041953A push eax
0041953B call 00419260h //Base64加密
00419540 push ebp
00419541 mov esi, eax

* Reference to MFC71.764
|
00419543 call 005A8298h
00419548 add esp, 10h
0041954B pop edi
0041954C mov eax, esi
0041954E pop esi
0041954F pop ebp
00419550 pop ebx
00419551 ret


___阅读全文___

2009年4月26日星期日

iphone平台学习之:字符串处理

源程序:
#import

int main (int argc, const char * argv[])
{
NSLog ( @"HelloWorld" );

return (0);
}


我们先编译成可执行文件,然后再用OTOOL工具反汇编:
$ arm-apple-darwin9-otool -tVv ./HelloWorld >HelloWorld.S
反汇编文件如下:
_main:
00001f34 e92d4080 stmdb sp!, {r7, lr}
00001f38 e28d7000 add r7, sp, #0 ; 0x0
00001f3c e24dd008 sub sp, sp, #8 ; 0x8
00001f40 e58d0004 str r0, [sp, #4]
00001f44 e58d1000 str r1, [sp]
00001f48 e59f3018 ldr r3, [pc, #24] ; 0x1f68
00001f4c e08f3003 add r3, pc, r3
00001f50 e1a00003 mov r0, r3
00001f54 eb000022 bl 0x1fe4 ; symbol stub for: _NSLog
00001f58 e3a03000 mov r3, #0 ; 0x0
00001f5c e1a00003 mov r0, r3
00001f60 e247d000 sub sp, r7, #0 ; 0x0
00001f64 e8bd8080 ldmia sp!, {r7, pc}


00001f48 e59f3018 ldr r3, [pc, #24] ; 0x1f68
上面地址0x1f68指向的数据:(0xd4)

00000F60 00 D0 47 E2 80 80 BD E8 D4 00 00 00 5F 5F 64 79 ..G.........__dy

00001f4c e08f3003 add r3, pc, r3
上面一条指令就是:(r3)0xd4 + PC(0x1f54) = 0x2028

0x2028指向数据,NSLog的参数为NSString类型:

@interface NSString : NSObject

/* NSString primitive (funnel) methods. A minimal subclass of NSString just needs to implement these, although we also recommend getCharacters:range:. See below for the other methods.
*/
- (NSUInteger)length;
- (unichar)characterAtIndex:(NSUInteger)index;

@end:

00001020 00 00 00 00 00 00 00 00 00 00 00 00 C8 07 00 00 ................
00001030 B4 1F 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 ................

0x1FB4指向字符串数据:
00000FB0 73 00 00 00 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 s...HelloWorld..
00000FC0 00 C0 9F E5 00 F0 9C E4 0C 20 00 00 00 C0 9F E5 ......... ......



00000FB0 73 00 00 00 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 s...HelloWorld..
00000FC0 00 C0 9F E5 00 F0 9C E4 0C 20 00 00 00 C0 9F E5 ......... ......
___阅读全文___

2009年4月23日星期四

iphone平台学习




图左使用ida for linux,图右为otool反汇编效果。
___阅读全文___

2009年4月21日星期二

ubuntu 上安装 iphone-2.2.1-toolchain

http://code.google.com/p/iphonedevonlinux/wiki/Installation

sudo apt-get install gobjc g++ gpref

修改KEY获取网址为:http://www.theiphonewiki.com/wiki/index.php?title=VFDecrypt_Keys:_2.x

export PATH=/data/iphone/toolchain/pre/bin/:$PATH
___阅读全文___

2009年4月20日星期一

RISC ARM学习

ARM的特点

采用 RISC 架构的 ARM 微处理器一般具有如下特点:

1. 体积小、低功耗、低成本、高性能;
2. 支持 Thumb ( 16 位) /ARM ( 32 位)双指令集,能很好的兼容 8 位 /16 位器件;
3. 大量使用寄存器,指令执行速度更快;
4. 大多数数据操作都在寄存器中完成;
5. 寻址方式灵活简单,执行效率高;
6. 指令长度固定;

ARM 类型

ARM 微处理器目前包括下面几个系列,以及其它厂商基于 ARM 体系结构的处理器,除了具有ARM 体系结构的共同特点以外,每一个系列的 ARM 微处理器都有各自的特点和应用领域。

- ARM7 系列
- ARM9 系列
- ARM9E 系列
- ARM10E 系列
- SecurCore 系列
- Intel 的 Xscale
- Intel 的 StrongARM

其中, ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。 SecurCore 系列专门为安全要求较高的应用而设计。
___阅读全文___

2009年4月13日星期一

2009年4月9日星期四

系统配置记录


  • gtk theme: Murrine-Dark-Mint
  • icon theme: ALLWHITE
  • point theme: redglass cousors
  • metacity: Simple-Slim
  • WallPaper:
  • amule服务器列表:
    http://www.srv1000.com/x1/server.met
    http://emule.945.cn/server.met
    http://www.edk-files.com/x1/server.met
    ed2k://server|no1.eserver.emule.org.cn|8080|
    ed2k://server|no2.eserver.emule.org.cn|8080|
    http://www.emule.org.cn/server.met
  • 摄像头:http://groups.google.com/group/microdia/browse_thread/thread/9ce6ce45407c304d#

___阅读全文___