Jump 2 new section

Тема в разделе "WASM.BEGINNERS", создана пользователем GeNeZiS, 25 фев 2008.

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток.
    Создаю в РЕ-файле новую секцию и хочу передать туда управление. При изменении точки входа на начало нужной секции все работает. Но хотелось бы на оригинальной точке входа сделать джамп на мою секцию. Не получается.
    Код:
    Код (Text):
    1.    ...
    2.    mov  eax, [edi].AddressOfEntryPoint
    3.    add   eax, [edi].ImageBase
    4.    mov  OLD_EP, eax
    5.  
    6.    mov  esi, OLD_EP
    7.    lea    edi, _saved_bytes
    8.    mov  ecx, 5
    9.    rep   movsb
    10.  
    11.    mov   edi, OLD_EP
    12.    lea   esi, _jump
    13.    movsb
    14.    mov   eax, NEW_EP
    15.    stosd
    16.  
    17.    ...
    18.    _saved_bytes  db 00,00,00,00,00
    19.    _jump db 0E9h
    20.    ...
    как я понимаю делать нужно примерно так (или нет?). NEW_EP - это начало новой секции?
    благодарю за внимание
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    этот код неправильный
    надо mov eax,(new_ep - (old_ep+5))
     
  3. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    сделал так:
    Код (Text):
    1.         mov edi, Old_EP
    2.         xor eax, eax
    3.         mov al, 0E9h
    4.         stosb
    5.         mov eax, NEW_EIP
    6.         sub eax, Old_EP
    7.         add eax, 5 
    8.         stosd
    все равно мой код не получает управления...
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    учитесь раскрывать скобки
     
  5. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    вот:
    Код (Text):
    1.         mov edi, Old_EP
    2.         xor eax, eax
    3.         mov al, 0E9h
    4.         stosb      
    5.         mov ebx, OLD_EIP
    6.         add ebx, 5
    7.         mov eax, NEW_EIP
    8.         sub eax, ebx   
    9.         stosd
    все равно не получается...
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    есть подозрение, что у вас NEW_EIP VA, OLD_EIP - RVA относительно базы образа
     
  7. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    а как мне правильно получить нужный NEW_EIP?
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    вобщем есле мои догатки верны, то попробуйте отнять ImageBase исчо текущий...
    а впринцепе гоуту отладчек + РТФМ
     
  9. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
  10. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    отнятл ImageBase и ничего не меняется.
    вот код функции полностью, так и немогу к сожалению разобраться...
    Код (Text):
    1. section_add proc lpCode, _Size : DWORD
    2.  
    3. ; open file
    4.         call    _open_file
    5.         inc eax
    6.         jz  _err_open
    7.         dec eax
    8.         P2P hFile, eax
    9.  
    10. ; file size
    11.         push    0
    12.         push    eax
    13.         call    GetFileSize
    14.         P2P fSize, eax
    15.         add eax, SECTION_SIZE
    16.        
    17. ; create map
    18.         call    _create_map
    19.         test    eax, eax
    20.         jz  _err_map
    21.         P2P hMapped, eax
    22.        
    23. ; map file
    24.         call    _map_file
    25.         test    eax, eax
    26.         jz  _err_mapping
    27.         P2P hFileImage, eax
    28.         P2P edi, eax
    29.        
    30. ; check PE
    31.         cmp word ptr [edi], 5A4Dh
    32.         jnz _err_not_pe
    33.         add edi, dword ptr [edi + 3Ch]
    34.         cmp word ptr [edi], 4550h
    35.         jnz _err_not_pe
    36.        
    37. ; get header data
    38.         add edi, 4
    39.         xor eax, eax
    40.         mov ax, word ptr [edi + 2]
    41.         P2P NumberOfSections, eax
    42.         inc word ptr [edi + 2]
    43.        
    44.         add edi, 14h
    45.         assume  edi : ptr IMAGE_OPTIONAL_HEADER
    46.         P2P eax, [edi].AddressOfEntryPoint
    47.         P2P ImageBase, [edi].ImageBase
    48.         add eax, ImageBase
    49.         P2P OLD_EIP, eax
    50.  
    51.         mov eax, [edi].SizeOfImage
    52.  
    53.         mov SizeOfImage, eax
    54.         add [edi].SizeOfImage, SECTION_SIZE
    55.        
    56. ; delete bounds
    57.         lea     edi, [edi].DataDirectory
    58.         mov     eax, IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
    59.         imul    eax, 8
    60.         add     edi, eax
    61.         cld
    62.         xor eax, eax
    63.         mov     ecx, sizeof IMAGE_DATA_DIRECTORY
    64.         rep     stosb
    65.         assume  edi : nothing
    66.  
    67.         mov edi, hFileImage
    68.         add edi, dword ptr [edi + 3Ch]
    69.         add edi, 0F8h
    70.         P2P eax, 28h
    71.         P2P ecx, NumberOfSections
    72.         imul    ecx
    73.         add edi, eax
    74.        
    75.         mov NEW_EIP, edi
    76. ; add section
    77.         assume  edi : ptr _IMAGE_SECTION_HEADER
    78.         mov     dword ptr [edi]._name, "XXX."      
    79.        
    80.         mov eax, SECTION_SIZE
    81.         mov [edi].vsz, eax
    82.        
    83.         mov eax, SizeOfImage
    84.         mov [edi].voff, eax
    85.        
    86.         mov eax, _Size
    87.         mov [edi].sz, eax
    88.        
    89.         mov eax, fSize
    90.         mov [edi].off, eax
    91.        
    92.         mov [edi]._char, 0E0000020h
    93.         assume  edi : nothing
    94.        
    95. ; write code
    96.         mov edi, hFileImage
    97.         add edi, fSize
    98.         lea esi, lpCode
    99.         mov ecx, _Size
    100.         rep movsb
    101.  
    102. ; write jump
    103.        
    104.         mov edi, OLD_EIP
    105.         P2P eax, 0E9h
    106.         stosb
    107.         mov ebx, OLD_EIP
    108.         add ebx, 5     
    109.         mov eax, NEW_EIP
    110.         sub eax, ImageBase
    111.         sub eax, ebx   
    112.         stosd  
    113.         xor eax, eax
    114.        
    115.  
    116. _unmap_file:
    117.         push    eax
    118.         push    hFileImage
    119.         call    UnmapViewOfFile
    120.         pop eax
    121. _close_map:
    122.         push    eax
    123.         push    hMapped
    124.         call    CloseHandle
    125.         pop eax
    126. _close_file:
    127.         push    eax
    128.         push    hFile
    129.         call    CloseHandle
    130.         pop eax
    131.  
    132.         ret
    133.  
    134. ; ----- E R R O R   M E S S A G E S -----
    135. _err_open:
    136.         P2P eax, ERROR_OPEN
    137.         ret
    138.        
    139. _err_map:
    140.         P2P eax, ERROR_OPEN
    141.         jmp _close_file
    142.        
    143. _err_mapping:
    144.         P2P eax, ERROR_OPEN
    145.         jmp _close_map
    146.        
    147. _err_not_pe:
    148.         P2P eax, ERROR_NOT_PE
    149.         jmp _unmap_file
    150.        
    151.        
    152. ;######################################################################
    153.  
    154.  
    155. ; eax - map handle
    156. _map_file:
    157.         push    0
    158.         push    0
    159.         push    0
    160.         push    2h          ; FILE_MAP_WRITE
    161.         push    eax
    162.         call    MapViewOfFile
    163.         retn
    164.  
    165. ; eax - size
    166. _create_map:
    167.         push    0
    168.         push    eax
    169.         push    0
    170.         push    4           ; PAGE_READWRITE
    171.         push    0
    172.         push    hFile
    173.         call    CreateFileMappingA
    174.         retn
    175.  
    176. ; edi - file name
    177. _open_file:
    178.         push    0
    179.         push    80h         ; FILE_ATTRIBUTE_NORMAL
    180.         push    3           ; OPEN_EXISTING
    181.         push    0
    182.         push    3h          ; FILE_SHARE_READ + FILE_SHARE_WRITE
    183.         push    0C0000000h      ; GENERIC_READ + GENERIC_WRITE
    184.         push    edi
    185.         call    CreateFileA
    186.         retn
    187.        
    188. section_add endp
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    щас угадаю, P2P - это mov???
     
  12. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Код (Text):
    1.         P2P MACRO P1, P2
    2.             push    P2
    3.             pop P1
    4.             ENDM
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Блин, нихрена не пойму. У тебя че, NEW_IP указывает на заголовок твоей секции??? Он должен указывать не на offset заголовка секции, а на va самой секции... Короче, рано тебе еще секции внедрять. Потренируйся пока что увеличивать последнюю секцию.
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    ога. и чото мне кажется, что код пишется методом научного тыка... потомучто причину сбойа в отладчеке видно практически сразу имхо.
     
  15. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    не пишется джамп. что делать?
    Код (Text):
    1.         mov edi, OLD_EIP
    2.         mov al, 0E9h
    3.         stosb      
    4.         mov eax, NEW_EIP
    5.         mov ebx, OLD_EIP
    6.         add ebx, 5
    7.         sub eax, ebx
    8.         stosd
    запускаю тестовую прогу в которую пишу - стартует по оригинальному EP. Как быть?
     
  16. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    получил из offset заголовка секции va секции, но не могу изменить оригинальную EP... вроде и меняю как надо, а не меняется. в чем может быть проблема?
     
  17. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    тема актуальна. выручайте новичка.
     
  18. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    сдаваться :)
     
  19. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    )) а если серьезно? почему не меняется ЕР?
    даже:
    Код (Text):
    1.         mov edi, OLD_EIP
    2.         mov al, 0E9h
    3.         stosb      
    4.         mov eax, 0FFFFFFFFh
    5.         stosd
    не записывается. уж и не знаю как быть...
    может я туплю, дык подскажите что не так
     
  20. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а что видно в отладчике? что пишет? куда указывает edi? ты, надеюсь, не забываешь, что прибавить базу образа к RVA EP и прибавить базу образа к offset EP - это разные вещи. Как я понял, ты берешь из заголовка RVA точки входа и прибавляешь базу образа. Ты получаешь VA точки входа. НО с этим адресом нельзя работать!!! Тебе нужен Offset, а не VA.

    Повторюсь еще раз - начни с увеличения последней секции. Только тогда поймешь, что такое заголовки секций, отличие VA от RVA и Offset и т.д. На васме есть хорошая статья про заражение.