Запуск PE из памяти, проблема с ресурсами

Тема в разделе "WASM.BEGINNERS", создана пользователем holod, 21 май 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Пофиксил опечатку в загрузчике, изза чего были траблы с секциями. Теперь вроде всё норм:
    http://indy-vx.narod.ru/Bin/LdrUpd.zip
    http://files.virustech.org/indy/Code/LDR/Src/
    Тут тестовый семпл:
    http://files.virustech.org/indy/Code/LDR/Test/+Exe/
    Код (Text):
    1. .code
    2.     include Ldr.inc
    3.  
    4. %NTERR macro
    5.     .if Eax
    6.     Int 3
    7.     .endif
    8. endm
    9.  
    10. %APIERR macro
    11.     .if !Eax
    12.     Int 3
    13.     .endif
    14. endm
    15.  
    16. ; +
    17. ; Поправка базы для GetModuleHandle(0).
    18. ;
    19. %LDR_FIXUP_PEB macro DllHandle
    20.     assume fs:nothing
    21.     mov ecx,fs:[TEB.Peb]
    22.     mov eax,DllHandle
    23.     lock xchg PEB.ImageBaseAddress[ecx],eax
    24. endm
    25.  
    26. ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID    equ 1
    27. ACTCTX_FLAG_LANGID_VALID                    equ 2
    28. ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID        equ 4
    29. ACTCTX_FLAG_RESOURCE_NAME_VALID         equ 8
    30. ACTCTX_FLAG_SET_PROCESS_DEFAULT         equ 10H
    31. ACTCTX_FLAG_APPLICATION_NAME_VALID          equ 20H
    32. ACTCTX_FLAG_HMODULE_VALID               equ 80H
    33.  
    34. ACTCTX struct   ; 0x20
    35. cbSize              ULONG ?
    36. dwFlags             DWORD ?
    37. lpSource                PWSTR ?
    38. wProcessorArchitecture  WORD ?
    39. wLangId             WORD ?
    40. lpAssemblyDirectory     PSTR ?
    41. lpResourceName          PSTR ?
    42. lpApplicationName       PSTR ?
    43. hModule             HANDLE ?
    44. ACTCTX ends
    45. PACTCTX typedef ptr ACTCTX
    46.  
    47. ; +
    48. ;
    49. LdrImageNtHeader proc ImageBase:PVOID, ImageHeader:PIMAGE_NT_HEADERS
    50.     mov edx,ImageBase
    51.     mov eax,STATUS_INVALID_IMAGE_FORMAT
    52.     assume edx:PIMAGE_DOS_HEADER
    53.     cmp [edx].e_magic,'ZM'
    54.     jne @f
    55.     add edx,[edx].e_lfanew
    56.     assume edx:PIMAGE_NT_HEADERS
    57.     cmp [edx].Signature,'EP'
    58.     jne @f
    59.     cmp [edx].FileHeader.SizeOfOptionalHeader,sizeof(IMAGE_OPTIONAL_HEADER32)
    60.     jne @f
    61.     cmp [edx].FileHeader.Machine,IMAGE_FILE_MACHINE_I386   
    62.     jne @f
    63.     test [edx].FileHeader.Characteristics,IMAGE_FILE_32BIT_MACHINE
    64.     je @f
    65.     mov ecx,ImageHeader
    66.     xor eax,eax
    67.     mov dword ptr [ecx],edx
    68. @@:
    69.     ret
    70. LdrImageNtHeader endp
    71.  
    72. .data
    73. Entries     PVOID 4 DUP (?)
    74. SxsEntries  PVOID 3 DUP (?)
    75.  
    76. $ExeName    CHAR "calc.exe",0
    77. align 4
    78.  
    79. include Map.inc
    80.  
    81. .code
    82. comment '
    83. Stub proc DllHandle:HANDLE, Reason:ULONG, Context:PVOID
    84.     .if Reason == DLL_PROCESS_ATTACH
    85.     push DllHandle
    86.     Call Entries[4] ; LdrDisableThreadCalloutsForDll()
    87.     mov eax,TRUE
    88.     .endif
    89.     ret
    90. Stub Endp'
    91.  
    92. $KernelNameW    WCHAR "k", "e", "r", "n", "e", "l", "3", "2", ".", "d", "l", "l"
    93.             WCHAR 0
    94. $KernelNameU    UNICODE_STRING <sizeof $KernelNameW, sizeof $KernelNameW + 2, offset $KernelNameW>
    95.  
    96. ; * Don't use ntdll!LdrpImageEntry.
    97. ;  
    98. Entry proc
    99. Local ExeHandle:HANDLE, KernelHandle:HANDLE
    100. Local ImageHeader:PIMAGE_NT_HEADERS
    101. Local LdrEntry:PLDR_DATA_TABLE_ENTRY
    102. Local ActCtx:ACTCTX, Cookie:ULONG
    103. Local CtxHandle:HANDLE
    104.     xor ecx,ecx
    105.     lea edx,Entries
    106.     mov Entries[0],0CB096353H   ; CRC32("LdrFindEntryForAddress")
    107.     mov Entries[4],21F56BC4H        ; CRC32("LdrDisableThreadCalloutsForDll")
    108.     mov Entries[2*4],0E21C1C46H ; CRC32("LdrGetDllHandle")
    109.     mov eax,LDR_QUERY_ENTRIES
    110. ;   mov Entries[3*4],ecx
    111.     push edx
    112.     push ecx
    113.     push ecx
    114.     Call LDR
    115.     %NTERR
    116. ; kernel32.dll
    117.     lea ecx,KernelHandle
    118.     push ecx
    119.     push offset $KernelNameU
    120.     push eax
    121.     push eax
    122.     Call Entries[2*4]   ; LdrGetDllHandle()
    123.     %NTERR
    124. ; SXS
    125.     lea edx,SxsEntries
    126.     mov SxsEntries[0],0B18A3D2FH    ; CRC32("CreateActCtxA")
    127.     mov SxsEntries[4],06AA0C20CH    ; CRC32("ActivateActCtx")  
    128. ;   mov Entries[2*4],eax
    129.     push edx
    130.     push eax
    131.     push KernelHandle
    132.     mov eax,LDR_QUERY_ENTRIES
    133.     Call LDR
    134.     %NTERR
    135. ; PE
    136.     invoke LdrImageNtHeader, addr gMap, addr ImageHeader
    137.     %NTERR
    138. ; IP
    139.     xor esi,esi
    140.     mov ebx,ImageHeader
    141.     assume ebx:PIMAGE_NT_HEADERS
    142.     xchg [ebx].OptionalHeader.AddressOfEntryPoint,esi   ; may be stub.
    143. ; for LdrpWalkImportDescriptor().
    144.     or [ebx].FileHeader.Characteristics,IMAGE_FILE_DLL
    145. ; #LDR_LOAD_DLL
    146.     lea ecx,ExeHandle
    147.     push ecx
    148.     push 0
    149.     push offset $ExeName
    150.     push offset gMap
    151.     Call LDR
    152.     %NTERR
    153.    
    154.     push ExeHandle
    155.     Call Entries[4] ; LdrDisableThreadCalloutsForDll()
    156.     %NTERR
    157. ; PEB.ImageBase
    158.     %LDR_FIXUP_PEB ExeHandle
    159. ; LDR_DATA_TABLE_ENTRY.EntryPoint
    160.     lea eax,LdrEntry
    161.     push eax
    162.     push ExeHandle
    163.     Call Entries[0] ; LdrFindEntryForAddress()
    164.     %NTERR
    165. ; IP
    166.     add esi,ExeHandle
    167.     mov eax,LdrEntry
    168.     mov LDR_DATA_TABLE_ENTRY.EntryPoint[eax],esi
    169. ; SXS
    170.     mov ecx,ExeHandle
    171.     lea edx,ActCtx
    172.     mov ActCtx.cbSize,sizeof(ACTCTX)
    173.     mov ActCtx.dwFlags,ACTCTX_FLAG_HMODULE_VALID or ACTCTX_FLAG_RESOURCE_NAME_VALID
    174.     mov ActCtx.lpResourceName,1
    175.     mov ActCtx.lpSource,offset $ExeName
    176.     mov dword ptr [ActCtx.wProcessorArchitecture],eax
    177.     mov ActCtx.lpAssemblyDirectory,eax
    178.     mov ActCtx.lpApplicationName,eax
    179.     mov ActCtx.hModule,ecx
    180.     push edx
    181.     Call SxsEntries[0]  ; CreateActCtxA()
    182.     mov CtxHandle,eax
    183.     .if Eax == INVALID_HANDLE_VALUE
    184.     Int 3
    185.     .endif
    186.     lea ecx,Cookie
    187.     push ecx
    188.     push eax
    189.     Call SxsEntries[4]  ; ActivateActCtx()
    190.     %APIERR
    191. ; Run
    192.     Call Esi
    193.    
    194.     invoke ExitProcess, STATUS_SUCCESS
    195.     ret
    196. Entry endp
    Это не большой стаб, загружающий из памяти калькулятор(образ без изменений от XPSP3).