网络包似乎就这样拿到了,有HTTP请求,也有加密的tcp、udp报文,下一步就是追踪加密函数了。
2、加密函数的追踪定位
我觉得加密函数是很难定位的,以我写程序的经验,加密的动作可以放在数据刚产生的时候,也可以放在数据将要发送前,还可以放在两者之间,即:数据产生了,把它缓存到一个队列,这个队列是未加密的数据队列,然后有个线程专门来加密数据,从这个队列提取未加密的数据进行加密,然后放到待发送队列,这种情况是最难的,因为没有源头也没有终点供我们追踪,如果目标程序无法调试,只能静态分析的话,要定位到这样的加密代码,如同大海捞针。还好,也许是这种方法会影响实时性,这个游戏不是这样的。
摸索过程就不讲太多了,简单说一下。CE可以打开进程,无法调试,看不到汇编代码,OD无法附加到进程。Dump出来的数据也无法用IDA分析。过驱动保护我是不会的,太难了。瞎猫碰到死耗子,我用vs调试dump出来的数据时候,试着用vs到附加到进程,居然成功了。然后我设了个函数断点。成功在send函数中断,并且这个send是我自己的send,就是那个假ws2_32.dll中的send,它还能定位到我的源码(难道是因为我用的debug版本的dll?)。
停在中断的方不动,我CE加载进程,这时候可以看到汇编代码了,赶紧保存一份内存。Vs中可以看到各个模块的地址范围,然后把这个范围的内存用ce保存起来,不包含CE头。用IDA直接加载这个.CEM,IDA成功识别出了是64位exe文件,根据send函数调用的返回地址,在IDA中找到它,发现地下不对,没办法,16进制搜索,最后发现IDA中的地址比与vs中运行时的地址大了C00H。
这个ws2_send是我重命名的,IDA无法识别出任何系统API,通过调试,发现数据在上面那次函数调用时加密了
64位汇编函数调用参数传递顺序:function(rcx, rdx, r8x, r9x, 栈0,栈8,栈16),其中,当调用对象的方法时,rcx为this指针,
加密调用,一次封装:
加密处理:
加密函数1:这段代码根据数据长度小于8、8-32之间,大于32,作了优化,最终结果就是:原始数据[i]=原始数据[i] xor 密钥[i]
EncryptFunc1 proc near ; CODE XREF: sub_140E37EC0+42↓p
; sub_140E37EC0+1AE↓p ...
arg_0 = qword ptr 8
arg_8 = qword ptr 10h
arg_10 = qword ptr 18h
arg_18 = qword ptr 20h
mov [rsp+arg_8], rbx
mov [rsp+arg_10], rbp
mov [rsp+arg_18], rsi
push rdi
xor ebx, ebx
mov r11, r9
shr r11, 3 ; 数据长度/8
mov r10, rcx
mov edi, ebx
test r11, r11
jz loc_140E3136A ; 数据长度/8==0则跳转
cmp r11, 4
jb loc_140E31327
add rcx, 0FFFFFFFFFFFFFFF8h
lea rax, [r8-8]
lea rax, [rax+r11*8]
lea rcx, [rcx+r11*8]
cmp r10, rax
ja short loc_140E312BB
cmp rcx, r8
jnb short loc_140E31327
loc_140E312BB: ; CODE XREF: EncryptFunc1+44↑j
lea rax, [rdx-8]
lea rax, [rax+r11*8]
cmp r10, rax
ja short loc_140E312CD
cmp rcx, rdx
jnb short loc_140E31327
loc_140E312CD: ; CODE XREF: EncryptFunc1+56↑j
mov rax, r11
mov rbp, r11
and eax, 3
mov rcx, r10
sub rbp, rax
sub rcx, rdx
mov rsi, r8
lea rax, [rdx+10h]
sub rsi, rdx
nop dword ptr [rax+00000000h]
loc_140E312F0: ; CODE XREF: EncryptFunc1+B5↓j
movdqu xmm0, xmmword ptr [rax-10h]
add rdi, 4
movdqu xmm1, xmmword ptr [rsi+rax-10h]
lea rax, [rax+20h]
pxor xmm1, xmm0
movdqu xmmword ptr [rcx+rax-30h], xmm1
movdqu xmm1, xmmword ptr [rsi+rax-20h]
movdqu xmm0, xmmword ptr [rax-20h]
pxor xmm1, xmm0
movdqu xmmword ptr [rcx+rax-20h], xmm1
cmp rdi, rbp
jb short loc_140E312F0
loc_140E31327: ; CODE XREF: EncryptFunc1+2B↑j
; EncryptFunc1+49↑j ...
cmp rdi, r11
jnb short loc_140E3136A
mov [rsp+8+arg_0], r14
lea rcx, [r8+rdi*8]
mov r14, r10
mov rsi, rdx
sub r14, r8
sub rsi, r8
sub r11, rdi
add rdi, r11
nop word ptr [rax+rax+00000000h]
loc_140E31350: ; CODE XREF: EncryptFunc1+F3↓j
mov rax, [rsi+rcx]
xor rax, [rcx]
mov [r14+rcx], rax
lea rcx, [rcx+8]
sub r11, 1
jnz short loc_140E31350
mov r14, [rsp+8+arg_0]
loc_140E3136A: ; CODE XREF: EncryptFunc1+21↑j
; EncryptFunc1+BA↑j
lea rdi, ds:0[rdi*8]
sub r9, rdi
jz loc_140E31534
add r10, rdi
add rdx, rdi
add r8, rdi
mov r11, r9
shr r11, 2
mov rdi, rbx
test r11, r11
jz loc_140E31462
cmp r11, 8
jb loc_140E31427
lea rax, [r11-1]
lea rax, [r8+rax*4]
lea rcx, [r11-1]
lea rcx, [r10+rcx*4]
cmp r10, rax
ja short loc_140E313BB
cmp rcx, r8
jnb short loc_140E31427
loc_140E313BB: ; CODE XREF: EncryptFunc1+144↑j
lea rax, [r11-1]
lea rax, [rdx+rax*4]
cmp r10, rax
ja short loc_140E313CD
cmp rcx, rdx
jnb short loc_140E31427
loc_140E313CD: ; CODE XREF: EncryptFunc1+156↑j
mov rax, r11
mov rbp, r11
and eax, 7
mov rcx, r10
sub rbp, rax
sub rcx, rdx
mov rsi, r8
lea rax, [rdx+10h]
sub rsi, rdx
nop dword ptr [rax+00000000h]
loc_140E313F0: ; CODE XREF: EncryptFunc1+1B5↓j
movdqu xmm0, xmmword ptr [rax-10h]
add rdi, 8
movdqu xmm1, xmmword ptr [rax+rsi-10h]
lea rax, [rax+20h]
pxor xmm1, xmm0
movdqu xmmword ptr [rax+rcx-30h], xmm1
movdqu xmm1, xmmword ptr [rax+rsi-20h]
movdqu xmm0, xmmword ptr [rax-20h]
pxor xmm1, xmm0
movdqu xmmword ptr [rax+rcx-20h], xmm1
cmp rdi, rbp
jb short loc_140E313F0
loc_140E31427: ; CODE XREF: EncryptFunc1+12B↑j
; EncryptFunc1+149↑j ...
cmp rdi, r11
jnb short loc_140E31462
mov rsi, rdx
lea rcx, [r8+rdi*4]
mov rbp, r10
sub rsi, r8
sub rbp, r8
sub r11, rdi
add rdi, r11
nop dword ptr [rax+00h]
db 66h, 66h
nop word ptr [rax+rax+00000000h]
loc_140E31450: ; CODE XREF: EncryptFunc1+1F0↓j
mov eax, [rcx+rsi]
xor eax, [rcx]
mov [rcx+rbp], eax
lea rcx, [rcx+4]
sub r11, 1
jnz short loc_140E31450
loc_140E31462: ; CODE XREF: EncryptFunc1+121↑j
; EncryptFunc1+1BA↑j
lea rdi, ds:0[rdi*4]
sub r9, rdi
jz loc_140E31534
add r10, rdi
add rdx, rdi
add r8, rdi
test r9, r9
jz loc_140E31534
cmp r9, 20h
jb short loc_140E31507
lea rcx, [r10-1]
lea rax, [r8-1]
add rcx, r9
add rax, r9
cmp r10, rax
ja short loc_140E314A3
cmp rcx, r8
jnb short loc_140E31507
loc_140E314A3: ; CODE XREF: EncryptFunc1+22C↑j
lea rax, [rdx-1]
add rax, r9
cmp r10, rax
ja short loc_140E314B4
cmp rcx, rdx
jnb short loc_140E31507
loc_140E314B4: ; CODE XREF: EncryptFunc1+23D↑j
mov rax, r9
mov rdi, r9
and eax, 1Fh
mov rcx, r10
sub rdi, rax
sub rcx, rdx
mov r11, r8
mov rax, rdx
sub r11, rdx
nop
loc_140E314D0: ; CODE XREF: EncryptFunc1+295↓j
movdqu xmm0, xmmword ptr [rax]
add rbx, 20h
movdqu xmm1, xmmword ptr [rax+r11]
lea rax, [rax+20h]
pxor xmm1, xmm0
movdqu xmmword ptr [rax+rcx-20h], xmm1
movdqu xmm1, xmmword ptr [r11+rax-10h]
movdqu xmm0, xmmword ptr [rax-10h]
pxor xmm1, xmm0
movdqu xmmword ptr [rcx+rax-10h], xmm1
cmp rbx, rdi
jb short loc_140E314D0
loc_140E31507: ; CODE XREF: EncryptFunc1+219↑j
; EncryptFunc1+231↑j ...
cmp rbx, r9
jnb short loc_140E31534
sub rdx, r8
lea rcx, [rbx+r8]
sub r10, r8
sub r9, rbx
nop dword ptr [rax+00000000h]
loc_140E31520: ; CODE XREF: EncryptFunc1+2C2↓j
movzx eax, byte ptr [rcx+rdx]
xor al, [rcx]
mov [rcx+r10], al
lea rcx, [rcx+1]
sub r9, 1
jnz short loc_140E31520
loc_140E31534: ; CODE XREF: EncryptFunc1+105↑j
; EncryptFunc1+1FD↑j ...
mov rbx, [rsp+8+arg_8]
mov rbp, [rsp+8+arg_10]
mov rsi, [rsp+8+arg_18]
pop rdi
retn
EncryptFunc1 endp