Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. include 'import32.inc'
  4. include 'proc32.inc'
  5.  
  6. use32
  7. org 0x0
  8.  
  9.   db 'MENUET02'
  10.   dd 0x01
  11.   dd __start
  12.   dd __iend
  13.   dd __bssend
  14.   dd __stack
  15.   dd __cmdline
  16.         dd __pgmname
  17.   dd 0x0
  18.         dd __idata_start
  19.         dd __idata_end
  20.         dd main
  21.  
  22. IMAGE_DOS_SIGNATURE                                     equ 0x5A4D
  23. IMAGE_NT_SIGNATURE                                      equ 0x00004550
  24. IMAGE_FILE_MACHINE_I386         equ 0x014c
  25. IMAGE_NT_OPTIONAL_HDR32_MAGIC equ 0x10B
  26. IMAGE_NT_HEADERS32_SIZE       equ 0xF8
  27.  
  28.  
  29. __start:
  30.  
  31. .e_lfanew                     equ  0x3C
  32.  
  33. .FileHeader.NumberOfSections  equ  0x06
  34.  
  35. .OptionalHeader.ImageBase     equ  0x34
  36. .SectionAlignment             equ  0x38
  37. .FileAlignment                equ  0x3C
  38.  
  39. .OptionalHeader.SizeOfImage   equ  0x50
  40. .OptionalHeader.SizeOfHeaders equ  0x54
  41.  
  42. .VirtualAddress               equ  0x0C
  43. .SizeOfRawData                equ  0x10
  44. .PointerToRawData             equ  0x14
  45.  
  46. .OptionalHeader.RelocDataDirectory.VirtualAddress   equ 0xA0
  47. .OptionalHeader.RelocDataDirectory.Size             equ 0xA4
  48.  
  49. .SizeOfBlock                  equ  0x04
  50.  
  51.  
  52.           mov   eax, 68
  53.           mov   ebx, 12
  54.           mov   ecx, STACK_SIZE
  55.           add   ecx, 4095
  56.           and   ecx, -4096
  57.           int   0x40
  58.           test  eax, eax
  59.           jz    .exit
  60.  
  61.           add   ecx, eax
  62.           mov   [fs:8], eax
  63.           mov   [fs:12], ecx
  64.           mov   esp, ecx
  65.  
  66.           sub   esp, 1024
  67.           mov   eax, 9
  68.           mov   ebx, esp
  69.           mov   ecx, -1
  70.           int   0x40
  71.  
  72.           mov   eax, [ebx+30]
  73.           mov   [fs:0], eax
  74.           add   esp, 1024
  75.  
  76.           mov   eax, 68
  77.           mov   ebx, 27
  78.           mov   ecx, libc_path
  79.           int   0x40
  80.           test  eax, eax
  81.           jz    .exit
  82.  
  83.           push  edx
  84.           push  eax
  85.  
  86. .validate_pe:
  87.  
  88.           cmp     edx, 0x3F
  89.           jbe     .exit
  90.           cmp     word [eax], IMAGE_DOS_SIGNATURE
  91.           jne     .exit
  92.  
  93.           mov     edx, [eax+.e_lfanew]
  94.           test    edx, edx
  95.           jz      .exit
  96.  
  97.           add     edx, eax                ;edx = nt header
  98.           jb      .exit
  99.  
  100.           cmp     dword [edx], IMAGE_NT_SIGNATURE
  101.           jnz     .exit
  102.  
  103.           cmp     word [edx+0x04], IMAGE_FILE_MACHINE_I386
  104.           jnz     .exit
  105.  
  106.           cmp     word [edx+0x18], IMAGE_NT_OPTIONAL_HDR32_MAGIC
  107.           jnz     .exit
  108.  
  109.           mov     ecx, [edx+.SectionAlignment]
  110.           cmp     ecx, 4095
  111.           ja      .l1
  112.  
  113.           cmp     ecx, [edx+.FileAlignment]
  114.           jne     .exit
  115.  
  116.           jmp     @F
  117. .l1:
  118.           cmp     ecx, [edx+.FileAlignment]
  119.           jb      .exit
  120. @@:
  121.           test    ecx, ecx
  122.           jz      .exit
  123.  
  124.           lea     eax, [ecx-1]
  125.           test    ecx, eax
  126.           jnz     .exit
  127.  
  128.           mov     ecx, [edx+.FileAlignment]
  129.           test    ecx, ecx
  130.           jz      .exit
  131.  
  132.           lea     ebx, [ecx-1]
  133.           test    ecx, ebx
  134.           jnz     .exit
  135.  
  136.           cmp     word [edx+.FileHeader.NumberOfSections], 96
  137.           ja      .exit
  138.  
  139. .create_image:
  140.  
  141.           mov     ecx, [edx+.OptionalHeader.SizeOfImage]
  142.           mov     eax, 68
  143.           mov     ebx, 12
  144.           int     0x40
  145.  
  146.           mov     ebp, eax
  147.           test    eax, eax
  148.           jz      .exit_2
  149.  
  150.           mov     ecx, [edx+.OptionalHeader.SizeOfHeaders]
  151.           mov     esi, [esp]
  152.           mov     edi, eax
  153.           shr     ecx, 2                                      ;copy header
  154.           rep movsd
  155.  
  156.           lea     eax, [edx+IMAGE_NT_HEADERS32_SIZE]          ;eax = MAGE_SECTION_HEADER
  157.           movzx   ebx, word [edx+.FileHeader.NumberOfSections]
  158.           test    ebx, ebx
  159.           jz      @F
  160.  
  161. .copy_loop:
  162.           mov     ecx, [eax+.SizeOfRawData]
  163.           test    ecx, ecx
  164.           jz      .next_section
  165.  
  166.           mov     esi, [eax+.PointerToRawData]
  167.           test    esi, esi
  168.           jz      .next_section
  169.  
  170.           add     esi, [esp]
  171.           mov     edi, [eax+.VirtualAddress]
  172.           add     edi, ebp
  173.           shr     ecx, 2
  174.           rep movsd
  175.                                                    ;copy section
  176. .next_section:
  177.           add     eax, 0x28
  178.           dec     ebx
  179.           jnz     .copy_loop
  180. @@:
  181.           push    edx
  182.  
  183.           mov     esi, [edx+.OptionalHeader.RelocDataDirectory.Size]
  184.           test    esi, esi
  185.           jz      .call_libc
  186.  
  187.           mov     ebx, ebp
  188.           sub     ebx, [edx+.OptionalHeader.ImageBase]                          ;delta
  189.           mov     edx, [edx+.OptionalHeader.RelocDataDirectory.VirtualAddress]
  190.           lea     ecx, [ebp+edx]                                                ;IMAGE_BASE_RELOCATION
  191.           mov     eax, [ecx+.SizeOfBlock]
  192.           test    eax, eax
  193.           jz      .unmap_relocs
  194.  
  195.           mov     esi, ebx
  196.           shr     esi, 16
  197.           push    esi
  198. align 4
  199. .loop_block:
  200.           sub     eax, 8
  201.           lea     edx, [ecx+8]                                ;entry
  202.           shr     eax, 1
  203.           jz      .next_block
  204.           lea     edi, [ecx+eax*2+8]                          ;last entry
  205. align 4
  206. .loop_reloc:
  207.  
  208.           mov     si, [edx]
  209.           mov     eax, esi
  210.           and     eax, 0FFFh
  211.           add     eax, [ecx]                                  ;offset
  212.           shr     si, 12                                      ;reloc type
  213.           dec     si
  214.           jnz     @F
  215.  
  216. .type_1:
  217.           mov     esi, [esp]
  218.           add     [eax+ebp], si
  219.           jmp     .next_entry
  220. @@:
  221.           dec     si
  222.           jnz     @F
  223.  
  224. .type_2:
  225.           add     [eax+ebp], bx
  226.           jmp     .next_entry
  227. @@:
  228.           dec     si
  229.           jnz     .next_entry
  230.  
  231. .type_3:
  232.           add     [eax+ebp], ebx
  233. .next_entry:
  234.           add     edx, 2
  235.           cmp     edx, edi
  236.           jne     .loop_reloc
  237. .next_block:
  238.           add     ecx, [ecx+.SizeOfBlock]
  239.           mov     eax, [ecx+.SizeOfBlock]
  240.           test    eax, eax
  241.           jnz     .loop_block
  242.  
  243.           add     esp, 4
  244.           pop     edx
  245.           mov     esi, [edx+.OptionalHeader.RelocDataDirectory.Size]
  246.           mov     edx, [edx+.OptionalHeader.RelocDataDirectory.VirtualAddress]
  247.  
  248. .unmap_relocs:
  249.           mov     ebx, 26
  250.           mov     eax, 68
  251.           mov     ecx, ebp
  252.           int     0x40
  253.  
  254. .call_libc:
  255.  
  256.           push  ebp
  257.           mov   edx, [ebp+0x3C]
  258.           add   ebp, [ebp+edx+0x28]
  259.  
  260.           call  ebp
  261.  
  262. .exit_2:
  263. .exit:
  264.           or    eax, -1
  265.           int   0x40
  266.  
  267. libc_path db '/kolibrios/lib/libc.dll',0
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.