标题: 让Skype直接生成明文debug-yyyymmdd-hhmm.trace.txt
创建: 2006-10-27 14:59 更新: 2006-11-01 15:52 链接: http://scz.617.cn/misc/200610271459.txt
我们修理的Skype.exe属性如下:
Skype在生成debug-yyyymmdd-hhmm.log的同时生成debug-yyyymmdd-hhmm.trace.txt, 记录语音引擎相关信息,用了简单的异或加密。
00963D78 loc_963D78: 00963D78 8B 54 24 18 mov edx, [esp+14h+in] 00963D7C 00963D7C loc_963D7C: 00963D7C 8B 7C 24 10 mov edi, [esp+14h+var_4] 00963D80 8A 0C 2A mov cl, [edx+ebp] ; in[i] 00963D83 8B 47 28 mov eax, [edi+28h] ; x,初值为0 00963D86 8A 04 45 F8 22 B7 00 mov al, byte ptr xortable[eax*2] ; xortable[x] 00963D8D 32 C1 xor al, cl ; xortable[x] ^ in[i] 00963D8F 3C 1F cmp al, 1Fh ; if ( ( xortable[x] ^ in[i] ) > 31 ) 00963D91 7F 0E jg short loc_963DA1 00963D93 C6 04 1E 01 mov byte ptr [esi+ebx], 1 ; out[o] = 1 00963D97 B1 7F mov cl, 7Fh 00963D99 46 inc esi ; o++ 00963D9A 2A C8 sub cl, al ; 127 - xortable[x] ^ in[i] 00963D9C 88 0C 1E mov [esi+ebx], cl ; out[o] = 127 - xortable[x] ^ in[i] 00963D9F EB 1C jmp short loc_963DBD 00963DA1 00963DA1 loc_963DA1: ; if ( 127 != ( xortable[x] ^ in[i] ) ) 00963DA1 3C 7F cmp al, 7Fh 00963DA3 75 0D jnz short loc_963DB2 00963DA5 C6 04 1E 02 mov byte ptr [esi+ebx], 2 ; out[o] = 2 00963DA9 8A 14 2A mov dl, [edx+ebp] ; in[i] 00963DAC 46 inc esi ; o++ 00963DAD 88 14 1E mov [esi+ebx], dl ; out[o] = in[i] 00963DB0 EB 0B jmp short loc_963DBD 00963DB2 00963DB2 loc_963DB2: ; if ( ( xortable[x] ^ in[i] ) < 32 ) 00963DB2 3C 20 cmp al, 20h 00963DB4 7C 3C jl short loc_963DF2 00963DB6 3C 7E cmp al, 7Eh ; if ( ( xortable[x] ^ in[i] ) > 126 ) 00963DB8 7F 38 jg short loc_963DF2 00963DBA 88 04 1E mov [esi+ebx], al ; out[o] = xortable[x] ^ in[i] 00963DBD 00963DBD loc_963DBD: ; x 00963DBD 8B 47 28 mov eax, [edi+28h] 00963DC0 46 inc esi ; o++ 00963DC1 40 inc eax ; x++ 00963DC2 B9 1F 00 00 00 mov ecx, 1Fh 00963DC7 99 cdq 00963DC8 F7 F9 idiv ecx ; x / 31 00963DCA 8B 44 24 10 mov eax, [esp+14h+var_4] 00963DCE 8B 7C 24 18 mov edi, [esp+14h+in] 00963DD2 83 C9 FF or ecx, 0FFFFFFFFh 00963DD5 45 inc ebp ; i++ 00963DD6 89 50 28 mov [eax+28h], edx ; x = x % 31 00963DD9 33 C0 xor eax, eax 00963DDB F2 AE repne scasb 00963DDD F7 D1 not ecx 00963DDF 49 dec ecx ; 不包括结尾的NUL字符 00963DE0 3B E9 cmp ebp, ecx ; if ( i < strlen( in ) ) 00963DE2 7C 94 jl short loc_963D78
xortable定义如下:
00B722F8 11 00 64 00 63 00 0B 00 03 00 38 00 57 00 56 00 00B72308 2C 00 58 00 77 00 65 00 11 00 45 00 39 00 41 00 00B72318 6F 00 4D 00 50 00 11 00 01 00 3B 00 63 00 7A 00 00B72328 28 00 49 00 76 00 34 00 47 00 60 00 3F 00
注意汇编代码对xortable的使用,这是一个包含31个元素的数组,每个元素占两字节, 但实际只用了第一个字节。
用C风格的伪代码描述加密过程:
/*
- 全部有符号 */ int i, o, x, t, len; char *in, *out; char xortable[31] = { 0x11, 0x64, 0x63, 0x0B, 0x03, 0x38, 0x57, 0x56, 0x2C, 0x58, 0x77, 0x65, 0x11, 0x45, 0x39, 0x41, 0x6F, 0x4D, 0x50, 0x11, 0x01, 0x3B, 0x63, 0x7A, 0x28, 0x49, 0x76, 0x34, 0x47, 0x60, 0x3F };
/*
- 这是一个Skype进程范围内的全局变量
/
x = 0;
len = strlen( in );
for ( i = 0, o = 0; i < len; i++, o++ )
{
t = xortable[x] ^ in[i];
/
- [0x00,0x1F]及[0x80,0xFF] / if ( t <= 0x1F ) { out[o++] = 1; out[o] = 127 - t; } else if ( 0x7F == t ) { out[o++] = 2; out[o] = in[i]; } /
- 汇编代码中有两个永远为假的比较,属于垃圾判断。 / else { out[o] = t; } x = ( x + 1 ) % 31; } / end of for */
debug-yyyymmdd-hhmm.trace.txt原始内容如下:
可以离线解密:
http://scz.617.cn/misc/skypedecrypttrace.exe
也可以直接修改二进制文件:
这样处理后的Skype_new.exe可以并且只能生成明文debug-yyyymmdd-hhmm.trace.txt。