【文章标题】: SKYPE不能远行多个实例分析
【文章作者】: sunsjw
【软件名称】: SKYPE
【下载地址】: http://download.skype.tom.com/Tom-SkypeSetup.exe
【加壳方式】: 无壳
【编写语言】: C++Builder 6.0
【使用工具】: OLLYDBG,PEID
【操作平台】: win2003 r2
【软件介绍】: IM类的软件
【作者声明】: 只是感兴趣,作为学习,由于水平有限错误之处请高手指出。。。。
SKYPE最近搞活动,挂机送话费。我想在一头电脑上多挂几个账号,可是SKYPE只允许一个实例。我申请了5个账号,难道要5台电脑同时开着吗?太浪费国家的电力了。自己动手丰衣足食吧。
PEID查Borland Delphi 6.0 - 7.0 [Overlay],但是我觉得是C++Builder。不管怎么好在程序没加壳比较好办。该程序有反调试功能,不过太弱了只是反ICE和一个什么调试器,对OD根本不起作用。
打开OD载放SKYPE.EXE文件停在入口处 005c9ecc:
005C9ECC > $ /EB 57 jmp short 005C9F25
005C9ECE . |BA 04777777 mov edx, 77777704
005C9ED3 . |52 push edx
005C9ED4 . |B9 689F5C00 mov ecx, 005C9F68
005C9ED9 . |B8 ED9E5C00 mov eax, 005C9EED
005C9EDE . |29C1 sub ecx, eax
005C9EE0 . |BB 03777777 mov ebx, 77777703
005C9EE5 > |301C01 xor byte ptr [ecx+eax], bl
005C9EE8 . |C1C3 03 rol ebx, 3
005C9EEB .^|E2 F8 loopd short 005C9EE5
005C9EED . |5A pop edx
005C9EEE . |31C9 xor ecx, ecx
005C9EF0 . |BB 41403938 mov ebx, 38394041
005C9EF5 > |81FA CC9E5C00 cmp edx, <模块入口点>
在命令行下断点:bp CreateMutexA
F9运行程序,然看观察堆栈直到出现下面的字样
0013FEDC 00408987 /CALL 到 CreateMutexA 来自 Skype.00408982
0013FEE0 00000000 |pSecurity = NULL
0013FEE4 00000000 |InitialOwner = FALSE
0013FEE8 025A4F94 \MutexName = "Local\SkypeMutex"
0013FEEC /0013FF28
0013FEF0 |00D33B2B 返回到 Skype.00D33B2B 来自 Skype.0040896C
0013FEF4 |00000000
0013FEF8 |00000000
0013FEFC |025A4F94 ASCII "Local\SkypeMutex"
0013FF00 |0013FF30 指向下一个 SEH 记录的指针
0013FF04 |00D33BEB SE处理程序
好了,现在Alt+F9返回到程序领空
00408987 |. 5D pop ebp ; 0013FF28
00408988 \. C2 0C00 retn 0C
0040898B 90 nop
现在按F8一步一步跟吧,按2次F8来到这里
00D33B2B |. A3 00FBEE00 mov dword ptr [EEFB00], eax
00D33B30 |. E8 C74F6DFF call <jmp.&kernel32.GetLastError> ; [GetLastError
00D33B35 |. 8945 F4 mov dword ptr [ebp-C], eax
00D33B38 |. 833D 00FBEE00>cmp dword ptr [EEFB00], 0
00D33B3F |. 74 54 je short 00D33B95
00D33B41 |. A1 00FBEE00 mov eax, dword ptr [EEFB00]
00D33B46 |. 50 push eax ; /hMutex => 00000160 (window)
00D33B47 |. E8 A0516DFF call <jmp.&kernel32.ReleaseMutex> ; \ReleaseMutex
00D33B4C |. 8D4D EC lea ecx, dword ptr [ebp-14]
00D33B4F |. B2 08 mov dl, 8
00D33B51 |. 8B45 F4 mov eax, dword ptr [ebp-C]
00D33B54 |. E8 C7F775FF call 00493320
00D33B59 |. 8B4D EC mov ecx, dword ptr [ebp-14]
00D33B5C |. 8D45 F0 lea eax, dword ptr [ebp-10]
00D33B5F |. BA 043CD300 mov edx, 00D33C04 ; ASCII "CreateMutex returned ok, GetLastError="
00D33B64 |. E8 27226DFF call 00405D90
00D33B69 |. 8B4D F0 mov ecx, dword ptr [ebp-10]
00D33B6C |. BA 343CD300 mov edx, 00D33C34 ; ASCII "findInstance"
00D33B71 |. A1 8CA1EA00 mov eax, dword ptr [EAA18C]
00D33B76 |. E8 D9CC1700 call 00EB0854
看这里00D33B3F |. 74 54 je short 00D33B95
把je改为jmp保存,OK,SKYPE可以运行多个实例了。
没什么技术含量,分析下:
程序调用CreateMutexA建立互斥变量,如果成功了就证明没有实例运行,失败则说明程序已经有一个实例在运行。激活运行的程序,退出本实例。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!