Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. struc APP_HEADER_02
  3. { .banner      dq ?
  4.   .version     dd ?    ;+8
  5.   .start       dd ?    ;+12
  6.   .i_end       dd ?    ;+16
  7.   .mem_size    dd ?    ;+20
  8.   .stack_top   dd ?    ;+24
  9.   .cmdline     dd ?    ;+28
  10.   .path        dd ?    ;+32
  11. }
  12.  
  13. virtual at 0
  14.   app_hdr APP_HEADER_02
  15. end virtual
  16.  
  17. format MS COFF
  18.  
  19. public EXPORTS
  20.  
  21. section '.flat' code readable align 16
  22.  
  23. EXPORTS:
  24.         dd szStart,    START
  25.         dd szVersion,  0x00010001
  26.         dd szExec,     exec
  27.         dd 0
  28.  
  29. check   dd 0
  30.  
  31. szStart    db 'START',0
  32. szVersion  db 'version',0
  33. szExec     db 'exec',0
  34.  
  35. START:
  36.         xor eax, eax
  37.         cmp [app_hdr.path], 0
  38.         je  .ret
  39.         not eax
  40. .ret:
  41.         mov [check], eax
  42.         ret 4
  43.  
  44. align 4
  45. exec:
  46.         cmp [check], 0
  47.         lea ebp, [esp+4]
  48.         je  .fail
  49.  
  50.         mov eax, [ebp+8]
  51.         test eax, eax
  52.         jz .fail
  53.  
  54.         mov ecx, [ebp]
  55.         mov edx, [ebp+4]
  56.         call validate_pe
  57.         test eax, eax
  58.         jz .fail
  59.  
  60.         mov eax, 68
  61.         mov ebx, [ebp]
  62.         mov ecx, [ebx+60]
  63.         mov ecx, [ecx+96+ebx]       ; app stack size
  64.         add ecx, 4095
  65.         and ecx, -4096
  66.         mov ebx, 12
  67.  
  68.         int 0x40
  69.         test eax, eax
  70.         jz .fail
  71.  
  72.         add ecx, eax
  73.         mov [fs:4], eax         ;stack base
  74.         mov [fs:8], ecx         ;stack top
  75.  
  76.         mov esp, ecx
  77.  
  78.         sub esp, 1024
  79.         mov eax, 9
  80.         mov ebx, esp
  81.         mov ecx, -1
  82.         int 0x40
  83.         mov eax, [ebx+30]
  84.         mov [fs:0], eax         ; save pid
  85.         add esp, 1024
  86.  
  87.         mov ecx, my_libc
  88.         call create_image
  89.         test eax, eax
  90.         jz .fail
  91.  
  92.         mov  ebx, [eax+60]
  93.         mov  ebx, [ebx+40+eax]
  94.         add  ebx, eax
  95.         push ebp
  96.         push EXPORTS
  97.         push eax
  98.         call ebx
  99.  
  100.         ret
  101.  
  102. .fail:
  103.         ret 4
  104.  
  105. align 4
  106.  
  107. validate_pe:
  108.         test    ecx, ecx
  109.         je      .L2
  110.         cmp     edx, 63
  111.         jbe     .L2
  112.         cmp     [ecx], word 23117
  113.         je      .L10
  114. .L2:
  115.         xor     eax, eax
  116.         ret
  117.  
  118. align 4
  119. .L10:
  120.         mov     eax, [ecx+60]
  121.         test    eax, eax
  122.         je      .L2
  123.         add     ecx, eax
  124.         jb      .L2
  125.         cmp     [ecx], dword 17744
  126.         jne     .L2
  127.         cmp     [ecx+4], word 332
  128.         jne     .L2
  129.         test    [ecx+23], byte 32
  130.         jne     .L2
  131.         cmp     [ecx+24], word 267
  132.         jne     .L2
  133.         mov     eax, [ecx+56]
  134.         cmp     eax, 4095
  135.         ja      .L3
  136.         cmp     eax, [ecx+60]
  137.         jne     .L2
  138.         test    eax, eax
  139.         je      .L2
  140. .L5:
  141.         lea     edx, [eax-1]
  142.         test    edx, eax
  143.         jne     .L2
  144.         mov     eax, [ecx+60]
  145.         test    eax, eax
  146.         je      .L2
  147.         lea     edx, [eax-1]
  148.         test    edx, eax
  149.         jne     .L2
  150.         xor     eax, eax
  151.         cmp     [ecx+6], word 96
  152.         setbe   al
  153.         ret
  154. .L3:
  155.         cmp     eax, [ecx+60]
  156.         jae     .L5
  157.         jmp     .L2
  158.  
  159. align 4
  160. create_image:
  161.         push    ebp
  162.         push    edi
  163.         push    esi
  164.         push    ebx
  165.         sub     esp, 20
  166.         mov     [esp+16], ecx
  167.         mov     eax, [ecx+60]
  168.         add     eax, ecx
  169.         mov     [esp], eax
  170.         mov     ecx, [eax+80]
  171.         mov     ebx, 12
  172.         mov     eax, 68
  173.         int     0x40
  174.         test    eax, eax
  175.         je      .L16
  176.  
  177.         mov     edx, [esp]
  178.         mov     ecx, [edx+84]
  179.         mov     esi, [esp+16]
  180.         mov     edi, eax
  181.         shr     ecx, 2
  182.         rep     movsd
  183.         mov     cx, [edx+6]
  184.         test    cx, cx
  185.         je      .L17
  186.         add     edx, 248
  187.         movzx   ecx, cx
  188.         lea     ebp, [ecx-1]
  189.         xor     bl, bl
  190.         jmp     .L19
  191.  
  192. align 4
  193. .L31:
  194.         add     edx, 40
  195.         inc     ebx
  196. .L19:
  197.         mov     ecx, [edx+16]
  198.         test    ecx, ecx
  199.         je      .L18
  200.         mov     esi, [edx+20]
  201.         test    esi, esi
  202.         je      .L18
  203.         add     esi, [esp+16]
  204.         mov     edi, [edx+12]
  205.         add     edi, eax
  206.  
  207.         shr     ecx, 2
  208.         rep     movsd
  209.  
  210. .L18:
  211.         cmp     ebx, ebp
  212.         jne     .L31
  213. .L17:
  214.         mov     edx, [esp]
  215.         mov     ecx, [edx+164]
  216.         test    ecx, ecx
  217.         je      .L16
  218.  
  219.         mov     ebp, eax
  220.         sub     ebp, [edx+52]
  221.         mov     ebx, [edx+160]
  222.         add     ebx, eax
  223.         mov     esi, [ebx+4]
  224.         test    esi, esi
  225.         je      .L16
  226.  
  227.         mov     edi, ebp
  228.         shr     edi, 16
  229.         mov     [esp], di
  230.  
  231. align 4
  232. .L26:
  233.         lea     edi, [esi-8]
  234.         shr     edi, 1
  235.         je      .L20
  236.         xor     ecx, ecx
  237.         jmp     .L25
  238.  
  239. align 4
  240. .L32:
  241.         cmp     si, 3
  242.         je      .L24
  243.         dec     si
  244.         jne     .L21
  245.         mov     esi, [esp]
  246.         add     [eax+edx], si
  247. .L21:
  248.         inc     ecx
  249.         cmp     ecx, edi
  250.         je      .L20
  251. .L25:
  252.         mov     si, [ebx+8+ecx*2]
  253.         mov     edx, esi
  254.         and     edx, 4095
  255.         add     edx, [ebx]
  256.         shr     si, 12
  257.         cmp     si, 2
  258.         jne     .L32
  259.         add     [eax+edx], bp
  260.         inc     ecx
  261.         cmp     ecx, edi
  262.         jne     .L25
  263. .L20:
  264.         add     ebx, [ebx+4]
  265.         mov     esi, [ebx+4]
  266.         test    esi, esi
  267.         jne     .L26
  268. .L16:
  269.         add     esp, 20
  270.         pop     ebx
  271.         pop     esi
  272.         pop     edi
  273.         pop     ebp
  274.         ret
  275.  
  276. align 4
  277. .L24:
  278.         add     [eax+edx], ebp
  279.         jmp     .L21
  280.  
  281.  
  282. align 16
  283. my_libc:
  284.         file '../libc.dll'
  285.