alco.exe

Тема в разделе "WASM.PROJECTS", создана пользователем edemko, 9 мар 2011.

  1. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Вместо предисловия:
    Код (Text):
    1. ; rus: опьяняющее средство, созданное на фасме
    2. ;      1ый параметр имя_файла или "имя файла" если то содержит пробелы
    3. ;      старайтесь разделять параметры пробелами
    4. ;      далее идут смещения и данные, которые будут записаны за ими
    5. ;      смещения отсчитываются с 0 и ограничены размером файла
    6. ;      если смещение не указано, подставится 0
    7. ;      определить смещение просто: @offset
    8. ;      смещения без данных будут опускаться: @offset1 @offset3
    9. ;      после определения смещения все данные после него будут принадлежать ему пока не встретиться следующее оглашение смещения
    10. ;      к примеру строка @offset1 1  @offset2 1 2  внесет байт 1 за адресом offset1 и байты 1 2 по адресу offset2
    11. ;      при старте размер данных = байт
    12. ;      без учета регистра можно этот размер изменить: bwdq т.е. байт, слово, двойное слово, учетверенное слово
    13. ;      как и с адресами, обределитель размера действует до следующего определителя
    14. ;      таким образом b@offset1 1  w @offset2 1 2  @offset3 b1 w2 d4 q8  внесет $01 по адресу offset1, $0001 $0002 по адресу offset2, $01 $0002 $0000'0004 $00000000'00000008 по адресу offset3
    15. ;      адреса и данные могут записываться в двоичной(0b), десятичной(0 0d 0D), шестнадцатеричной($0 0x0 0X0), строковой('', "", '''', """", '12''4', "12""4") формах
    16. ;      для строк '' и "" ровно нулю, '' станет ' если строка начиналась с ', "" станет " если строка начиналась с "
    17. ;      в числах ' пропустится(1'204 $'00'00' ...)
    18. ;      для удобства (все символы из таких кавычек считываются как есть) (не закрывайте ее, если хотите читать до конца
    19. ;      встретив {, программа пропустит все, пока не встретит }
    20. ;      {} можно сравнить с пробелами т.е. разделителями параметров, помните об этой особенности
    21. ;      ничего не будет записано до полной проверки
    22. ;      иногда возможны сообщения
    23. ;      пример использования:
    24. ;        start /wait alco.exe test\test.exe @647 0 @756 0
    25. ;        start /wait test\test.exe
    26. ;        start /wait alco.exe test\test.exe @647(моей погибшей флешке)0 @756(почему укр. И не совпадает с англ.)10(почему в наших языках столько запятых)0 {умеет игнорить :)}@$1'0000'0000
    27. ;        start /wait test\test.exe
    28. ;      для писем: edemko@rambler.ru
    В сорсе комментарии на английском.
    Если чего не получает?ся, вы только спросите.
    Комментарии на русском к get_number лежат тут.
    Есть желание поддерживать VA, скоро должно появиться.
    Перед компиляцией измените LNG equ ENU на RUS.

    Сюда возможны посылания из других мест...
    Код (Text):
    1. ; enu: this is an alcoholic tool written in fasm
    2. ;      1st parameter must be victim_name or "victim name" if it contains spaces
    3. ;      parameters should be separated with spaces
    4. ;      next offsets and data for the offsets come
    5. ;      offsets counted from 0 and limited to file size
    6. ;      if no offset specified 0 one implied
    7. ;      to define an offset type @offset
    8. ;      empty offsets like @offset1 @offset3 will be skipped
    9. ;      after an offset defined, any values after that place belong to it until another definition is met
    10. ;      so @offset1 1  @offset2 1 2  string will put byte value 1 at offset1 and bytes 1 2 at offset2
    11. ;      default value size is byte
    12. ;      other ones, neglecting case, are bwdq i.e. byte, word, dword, qword
    13. ;      once put, it acts until other size is met
    14. ;      so b@offset1 1  w @offset2 1 2  @offset3 b1 w2 d4 q8  string will put $01 at offset1, $0001 $0002 at offset2, $01 $0002 $0000'0004 $00000000'00000008 at offset3
    15. ;      offsets and values can be in binary(0b), decimal(0 0d 0D), hexadecimal($0 0x0 0X0), string('', "", '''', """", '12''4', "12""4")
    16. ;      for strings '' or "" mean zero, '' become ' if string was stated by ', "" become " if string was stated by "
    17. ;      for numbers ' gets ignored(1'204 $'00'00' etc)
    18. ;      to read symbols as is (use such braces) or (if you need all to be read
    19. ;      having met { all chars treaded spaces i.e. parameter separators until } found
    20. ;      no writings will be performed until everything checked
    21. ;      also messages possible
    22. ;      command line example:
    23. ;        start /wait alco.exe test\test.exe @647 0 @756 0
    24. ;        start /wait test\test.exe
    25. ;        start /wait alco.exe test\test.exe @647(title)0 @756(you touched me deeply)10(line 2)0 {etc}@$1'0000'0000
    26. ;        start /wait test\test.exe
    27. ;      mailme: edemko@rambler.ru
    alco
     
  2. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    А как это работает?
    И что должно делать?
    Создал батник с этой строкой start /wait alco.exe test\test.exe @647(моей погибшей флешке)0 @756(почему укр. И не совпадает с англ.)10(почему в наших языках столько запятых)0 {умеет игнорить :)}@$1'0000'0000
    Теперь test.exe какие-то крякозябры начал показывать.
     
  3. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    трой же
     
  4. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    s_d_f
    ;Теперь test.exe какие-то крякозябры начал показывать.
    Батник видимо делает конвертацию символов из 866 в 1251.
    У меня тоже.
    AkelPad(люблю его плужки) умеет работать со множеством кодировок.
    Сохранив в 866 - все в порядке.
    Попробуйте вставить(кодировка win1251) в окне cmd.exe или totalcmd.exe - все в порядке.

    ;А как это работает?
    Приведенная в примере строчка расположит?ся по статическому адресу bytes:
    db "моей погибшей флешке",0
    dd 674,0,длина тех байт
    db "почему укр. И не совпадает с англ.",10,"почему в наших языках столько запятых",0
    dd 756,0,длина тех байт
    Потом они запишут?ся каждая одним проходом.

    fsd
    ;трой же
    ?
    кряк, патч, оно?
     
  5. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Наверно АВ Касперского это определил.
     
  6. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    nod тоже может ругат?ся
    чутку позже выложу все по русски, прошу подождать
     
  7. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    ссылка на загрузку из первого поста будет временно недоступна
    код стал компактнее и менее запутан
    появится ключ S, отключающий запрос на запись файла
    преобразования виртуальных адресов в физические по прежнему нет
    но они будут(дошло как делать)
    программа в целях уменшения размера использует заглушку
    временно она закомментирована
    также в комментах стоит контроль инструкций(386, 486...)
    Код (Text):
    1. см. ниже
     
  8. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    тестовая
    обнаруженные ошибки отмечены гггг_мм_дд, Ошибка №...
    нод говорит, что она - неизвестный вирус win32, пришлось добавить в доверенные
    пример:
    - скопируйте alco.exe в test.exe
    - выполните комманду "alco.exe test.exe @$40'153bV $eb$f7 s {отключили сообщение холостого вызова}"
    - запустите патченый файл

    Код (Text):
    1. ; языки программы ----------------------------------------------
    2. LNG equ ENU
    3. match lng,`LNG{display 13,10,'LNG equ ',lng}
    4. match =ENU,LNG{
    5.   string_cannot_open_a_file equ 'cannot open a file'
    6.   string_invalid_file       equ 'file size = 0 or >= 2^32'
    7.   string_invalid_value      equ 'invalid value'
    8.   string_nothing_to_do      equ 'nothing to do'
    9.   string_out_of_file        equ 'out of file'
    10.   string_out_of_memory      equ 'out of memory'
    11.   string_write_file?        equ 'write file?'
    12. }
    13. match =RUS,LNG{
    14.   string_cannot_open_a_file equ 'не открыть файл'
    15.   string_invalid_file       equ 'размер файла = 0 или >= 2^32'
    16.   string_invalid_value      equ 'плохое число'
    17.   string_nothing_to_do      equ 'холостой запуск'
    18.   string_out_of_file        equ 'вне файла'
    19.   string_out_of_memory      equ 'вне памяти'
    20.   string_write_file?        equ 'писать файл?'
    21. }
    22.  
    23.  
    24.  
    25.  
    26. ; контроль инструкций от revo ----------------------------------
    27. ;include 'revolution\compatibility.inc'
    28. ;.386
    29.  
    30.  
    31.  
    32.  
    33. format pe gui; on 'stub\stub.exe'
    34. section '' code executable import readable writable
    35. ; импорт -------------------------------------------------------
    36.   dd 0,0,0,rva kernel_name,rva kernel_table,\
    37.      0,0,0,rva user_name,rva user_table,\
    38.      0,0,0,0,0
    39.  
    40.   kernel_name db 'kernel32.dll',0
    41.   align 4
    42.   kernel_table:
    43.     CloseHandle                dd rva CloseHandle_
    44.     CreateFileA                dd rva CreateFileA_
    45.     ExitProcess                dd rva ExitProcess_
    46.     GetCommandLineA            dd rva GetCommandLineA_
    47.     GetFileSize                dd rva GetFileSize_
    48.     ReadFile                   dd rva ReadFile_
    49.     SetFilePointer             dd rva SetFilePointer_
    50.     WriteFile                  dd rva WriteFile_
    51.                                dd 0
    52.     CloseHandle_               dw 0
    53.                                db 'CloseHandle',0
    54.     CreateFileA_               dw 0
    55.                                db 'CreateFileA',0
    56.     ExitProcess_               dw 0
    57.                                db 'ExitProcess',0
    58.     GetCommandLineA_           dw 0
    59.                                db 'GetCommandLineA',0
    60.     GetFileSize_               dw 0
    61.                                db 'GetFileSize',0
    62.     ReadFile_                  dw 0
    63.                                db 'ReadFile',0
    64.     SetFilePointer_            dw 0
    65.                                db 'SetFilePointer',0
    66.     WriteFile_                 dw 0
    67.                                db 'WriteFile',0
    68.  
    69.   user_name db 'user32.dll',0
    70.   align 4
    71.   user_table:
    72.     MessageBoxA                dd rva MessageBoxA_
    73.                                dd 0
    74.     MessageBoxA_               dw 0
    75.                                db 'MessageBoxA',0
    76.  
    77.  
    78.  
    79.  
    80. entry $
    81. ; пропустить себя в командной строке ---------------------------
    82.         call    [GetCommandLineA]
    83.         mov     esi,eax
    84.         lodsb
    85.         mov     ah,al
    86.         cmp     ah,'"'
    87.         je      skip_myself            ;имена с кавычками
    88.         mov     ah,' '                 ;без
    89. skip_myself:
    90.         lodsb
    91.         cmp     al,0
    92.         je      nothing_to_do          ;нет праметров
    93.         cmp     al,ah
    94.         jne     skip_myself
    95.  
    96.  
    97.  
    98.  
    99. ; пропустить пустоты после себя в командной строке -------------
    100. skip_myself_spaces:
    101.         lodsb
    102.         cmp     al,0
    103.         je      nothing_to_do          ;нет параметров
    104.         cmp     al,' '
    105.         je      skip_myself_spaces
    106.  
    107.  
    108.  
    109.  
    110. ; найти начало и конец имени жертвы ----------------------------
    111.         mov     ah,al
    112.         cmp     ah,'"'
    113.         je      skip_victim            ;имена с кавычками
    114.         mov     ah,' '                 ;без
    115.         dec     esi
    116. skip_victim:
    117.         mov     [victim.path],esi      ;начало имени
    118. skip_victim_:
    119.         lodsb
    120.         cmp     al,0
    121.         je      nothing_to_do          ;нет параметров
    122.         cmp     al,ah
    123.         jne     skip_victim_
    124.         mov     byte[esi-1],0          ;конец имени
    125.  
    126.  
    127.  
    128.  
    129. ; открываем файл-жертву ----------------------------------------
    130.         sub     eax,eax
    131.         push    eax                    ;hTemplateFile
    132.         push    eax                    ;dwFlagsAndAttributes
    133.         push    3                      ;dwCreationDistribution = OPEN_EXISTING
    134.         push    eax                    ;lpSecurityAttributes
    135.         push    1                      ;dwShareMode = FILE_SHARE_READ
    136.         push    $8000'0000+$4000'0000  ;dwDesiredAccess = GENERIC_READ+WRITE
    137.         push    [victim.path]          ;lpFileName
    138.         call    [CreateFileA]
    139.         inc     eax
    140.         jnz     check_victim_size
    141.         push    eax                    ;uType
    142.         call    @f                     ;lpCation
    143.         db      string_cannot_open_a_file,0
    144. @@:     push    [victim.path]          ;lpText
    145.         push    eax                    ;hWnd
    146.         call    [MessageBoxA]
    147.         jmp     exit
    148. check_victim_size:
    149.         dec     eax
    150.         push    eax                    ;CloseHandle.hObject
    151.         push    0                      ;lpFileSizeHigh
    152.         push    eax                    ;hFile
    153.         call    [GetFileSize]
    154.         test    eax,eax
    155.         jnz     victim_size_ok
    156.         push    eax                    ;uType
    157.         call    @f                     ;lpCaption
    158.         db      string_invalid_file,0
    159. @@:     push    [victim.path]          ;lpText
    160.         push    eax                    ;hWnd
    161.         call    [MessageBoxA]
    162.         jmp     leave_victim
    163. victim_size_ok:
    164.         mov     [victim.size],eax
    165.  
    166.  
    167.  
    168.  
    169. ; поддержка перевода pe32 адресов в физические -----------------
    170.                                        ;IDH = IMAGE_DOS_HEADER
    171.                                        ;INH = IMAGE_NT_HEADERS
    172.                                        ;IOH = IMAGE_OPTIONAL_HEADER
    173.                                        ;IFH = IMAGE_FILE_HEADER
    174.                                        ;ISH = IMAGE_SECTION_HEADER
    175. @v_init:mov     edi,@v.size
    176.         lea     ebx,[edi+4]
    177.         mov     ebp,[esp]
    178.         push    esi
    179.         push    0 edi $40 ebx ebp
    180.         call    [ReadFile]             ;считываем IDH
    181.         cmp     dword[edi],$40
    182.         jne     .nok
    183.         cmp     word[ebx],'MZ'         ;проверяем IDH.Signature
    184.         jne     .nok
    185.         push    0 0 dword[ebx+$3c] ebp
    186.         call    [SetFilePointer]       ;смещаемся к INH
    187.         cmp     eax,-1
    188.         je      .nok
    189.         mov     esi,eax                ;INH
    190.         push    0 edi $58 ebx ebp
    191.         call    [ReadFile]             ;читаем по IOH.SizeOfHeaders включно
    192.         cmp     dword[edi],$58
    193.         jne     .nok
    194.         cmp     dword[ebx],'PE'        ;проверяем INH.Signature
    195.         jne     .nok
    196.         movzx   eax,word[ebx+$14]      ;читаем IFH.SizeOfOptionalHeader
    197.         add     eax,$18                ;прибавляем к нему sizeof.INH.Signature($04) и sizeof.IFH($14)
    198.         add     esi,eax                ;получаем смещение ISH
    199.         jc      .nok
    200.         cmp     esi,[victim.size]
    201.         ja      .nok
    202.         movzx   ecx,word[ebx+$06]      ;читаем IFH.NumberOfSections
    203.         imul    eax,ecx,$28            ;IFH.NumberOfSections * sizeof.ISH = размеру заголовков секций
    204.         add     eax,esi                ;заголовки сзаду(смещение)
    205.         jc      .nok
    206.         cmp     eax,[victim.size]
    207.         ja      .nok
    208.         ;
    209.         lea     eax,[ecx+1]            ;@v.size = секция заголовков + остальные секции
    210.         stosd
    211.         mov     eax,[ebx+$34]
    212.         stosd                          ;@v.base = IOH.ImageBase
    213.         sub     eax,eax
    214.         stosd                          ;rva заголовков              = 0
    215.         mov     eax,[ebx+$54]
    216.         stosd                          ;размер заголовков в файле   = IOH.SizeOfHeaders
    217.         sub     eax,eax
    218.         stosd                          ;смещение заголовков в файле = 0
    219.         push    0 0 esi ebp
    220.         mov     ebx,ecx
    221.         call    [SetFilePointer]       ;сместиться к ISH
    222.   .loop:dec     ebx
    223.         js      .ok
    224.         sub     esp,$28
    225.         mov     esi,esp
    226.         push    0 esi $28 esi ebp
    227.         call    [ReadFile]             ;прочитать 1 заголовок секции
    228.         add     esp,$28
    229.         add     esi,$0c                ;ISH.{Rva, SizeOfRawData, PointerToRawData}
    230.         mov     ecx,3
    231.         rep     movsd                  ;чередовой элемент @v.rva_size_addr готов
    232.         jmp     .loop
    233.         ;
    234.   .nok: sub     eax,eax
    235.         stosd
    236.   .ok:  pop     esi
    237.  
    238.  
    239.  
    240.  
    241. ; заполняем bytes.body: db b1,b2,..bn; dd @1,0,sizeof(db b1,b2,..bn)
    242. ;                       db b3,b4,..bn; dd @2,0,sizeof(db b3,b4,..bn)
    243. ;                       ...
    244.         mov     [element.size],1
    245.         sub     eax,eax
    246.         mov     [option.s],al          ;вкл/откл запрос на запись файла
    247.         mov     edi,bytes.body         ;создаем пустую цепочку
    248.         stosd                          ;  по смещению 0
    249.         stosd                          ;  ...
    250. get_bytes_:
    251.         stosd                          ;  и с числом байт 0
    252. get_bytes:
    253.         lodsb
    254.         cmp     al,0
    255.         je      write_bytes
    256.         cmp     al,' '
    257.         je      get_bytes
    258.         cmp     al,'('
    259.         je      long_string
    260.         cmp     al,'@'
    261.         je      chain
    262.         cmp     al,'{'
    263.         je      pascal_comment
    264.  
    265.         call    ascii_lower
    266.  
    267.         cmp     al,'b'
    268.         mov     ah,1
    269.         je      set_element.size
    270.         cmp     al,'w'
    271.         mov     ah,2
    272.         je      set_element.size
    273.         cmp     al,'d'
    274.         mov     ah,4
    275.         je      set_element.size
    276.         cmp     al,'q'
    277.         mov     ah,8
    278.         je      set_element.size
    279.  
    280.         cmp     al,'s'
    281.         je      set_option.s
    282.  
    283. bwdq:   cmp     edi,bytes.limit-$ff +12;2011_03_14, ошибка №3(не грубая): +12 отсутствовало
    284.         ja      out_of_memory          ;особенность get_number
    285.         cmp     dword[edi-8],0
    286.         jnz     out_of_file            ;вне файла
    287.         mov     ebx,[edi-12]           ;смещение цепочки в файле
    288.         mov     edx,[edi-4]            ;данных в цепочке
    289.         add     edx,[element.size]     ;станет данных в цепочке
    290.         mov     ecx,ebx
    291.         add     ecx,edx
    292.         jc      out_of_file
    293.         cmp     ecx,[victim.size]
    294.         ja      out_of_file            ;вне файла
    295.         push    ebx
    296.         push    edx
    297.         push    esi                    ;данные об ошибке
    298.         sub     edi,12                 ;2011_03_14, ошибка №2: линия отсутствовала
    299.         call    get_number
    300.         pop     eax
    301.         pop     edx
    302.         pop     ebx
    303.         jc      invalid_value
    304.         lea     ecx,[edi-8]            ;начало qword'a
    305.         add     ecx,[element.size]     ;начало байт которые должны быть 0, их мы перепишем шапкой цепочки
    306.   .loop:cmp     edi,ecx
    307.         je      long_string.loop_ok
    308.         dec     edi
    309.         cmp     byte[edi],0
    310.         je      .loop
    311.  
    312. invalid_value:
    313.         mov     esi,eax
    314.         push    0                      ;uType
    315.         call    @f                     ;lpTitle
    316.         db      string_invalid_value,0
    317. out_of_file:
    318.         push    0                      ;uType
    319.         call    @f                     ;lpTitle
    320.         db      string_out_of_file,0
    321. @@:     dec     esi
    322.         push    esi                    ;lpText
    323.         push    0                      ;hWnd
    324.         call    [MessageBoxA]
    325.         jmp     leave_victim
    326. out_of_memory:
    327.         push    0                      ;uType
    328.         call    @b                     ;lpTitle
    329.         db      string_out_of_memory,0
    330.  
    331. set_option:
    332.   .s:   mov     [option.s],al
    333.         jmp     get_bytes
    334.  
    335. set_element.size:
    336.         mov     byte[element.size],ah
    337.         jmp     get_bytes
    338.  
    339. chain:  cmp     dword[edi-4],0
    340.         jnz     .keep_previous
    341.         sub     edi,12                 ;переписать пустую цепочку
    342.   .keep_previous:
    343.         lodsb
    344.         cmp     edi,bytes.limit-$ff
    345.         ja      out_of_memory          ;особенность get_number
    346.         push    esi
    347.         call    get_number
    348.         pop     eax
    349.         jc      invalid_value
    350.         cmp     byte[esi],'V'
    351.         je      .@v_init
    352.         cmp     byte[esi],'v'
    353.         je      .@v_init
    354.         sub     eax,eax
    355.         jmp     get_bytes_             ;данных в цепочке = 0
    356.  
    357.   .@v_init:
    358.         cmp     dword[edi-4],0
    359.         jnz     invalid_value
    360.         mov     ebx,[@v.base]
    361.         sub     [edi-8],ebx            ;-IOH.ImageBase = размер относительно начала загрузки
    362.         jc      invalid_value
    363.         mov     ebx,@v.rva_size_addr-12
    364.         mov     ecx,[@v.size]
    365.     .loop:dec   ecx
    366.         js      invalid_value          ;физ. адрес не найден
    367.         add     ebx,12                 ;чередовой ISH.{Rva, SizeOfRawData, PointerToRawData}
    368.         mov     edx,[edi-8]
    369.         sub     edx,[ebx]              ;-ISH.Rva = размер относительно начала секции
    370.         jc      .loop
    371.         cmp     edx,[ebx+4]            ;ISH.SizeOfRawData
    372.         ja      .loop
    373.         add     edx,[ebx+8]            ;+ISH.PointerToRawData = смещение в файле
    374.         jc      .loop
    375.         mov     [edi-8],edx            ;физ. адрес
    376.         inc     esi                    ;
    377.         sub     eax,eax
    378.         jmp     get_bytes_             ;данных в цепочке = 0
    379.  
    380. long_string:
    381.         lodsb
    382.         cmp     al,0
    383.         je      write_bytes            ;(
    384.         cmp     al,')'
    385.         je      get_bytes              ;()
    386.         cmp     dword[edi-8],0
    387.         jnz     out_of_file            ;вне файла
    388.         mov     ebx,[edi-12]           ;сохранить смещение цепочки
    389.         mov     ecx,[victim.size]
    390.         sub     ecx,ebx                ;максимум байт для цепочки в файле при таком смещении
    391.         jna     out_of_file            ;для цепочки не осталось места
    392.         mov     edx,[edi-4]            ;сохранить байт_в_цепочке_на_данный_момент
    393.         sub     ecx,edx                ;столько мы можем взять сичас
    394.         jna     out_of_file            ;ни`сколько
    395.         sub     edi,12                 ;вытрем шапку, она всегда в хвосте
    396.   .loop:sub     ecx,1                                                     ;2011_03_09, ошибка №1: стояло dec ecx
    397.         jc      out_of_file            ;вне файла                         ;                              jz  ...
    398.         cmp     edi,bytes.limit-12
    399.         jae     out_of_memory          ;мало памяти
    400.         stosb
    401.         inc     edx                    ;байт_в_цепочке_на_данный_момент +1
    402.         lodsb
    403.         cmp     al,0
    404.         je      .loop_ok               ;(
    405.         cmp     al,')'
    406.         jne     .loop
    407.   .loop_ok:
    408.         mov     eax,ebx                ;обновлеям шапку цепочки
    409.         stosd
    410.         sub     eax,eax
    411.         stosd
    412.         mov     eax,edx
    413.         jmp     get_bytes_
    414.  
    415. pascal_comment:
    416.         lodsb
    417.         cmp     al,0
    418.         je      write_bytes            ;{
    419.         cmp     al,'}'
    420.         je      get_bytes              ;{}
    421.         jmp     pascal_comment
    422.  
    423.  
    424.  
    425.  
    426. ; записать цепочки ---------------------------------------------
    427. write_bytes:
    428.         cmp     dword[edi-4],0
    429.         jnz     .ask_write
    430.         sub     edi,12
    431.         cmp     edi,bytes.body
    432.         je      nothing_to_do
    433.   .ask_write:
    434.         cmp     [option.s],'s'
    435.         je      .skip_ask_write        ;запрос на запись файла отключен
    436.         push    4                      ;uType = MB_YESNO
    437.         call    @f                     ;lpCaption
    438.         db      string_write_file?,0
    439.   @@:   push    [victim.path]          ;lpText
    440.         push    0                      ;hWnd
    441.         call    [MessageBoxA]
    442.         cmp     eax,6                  ;IDYES
    443.         jne     leave_victim
    444.   .skip_ask_write:
    445.         mov     ebx,[esp]              ;CloseHandle.hObject
    446.   .loop:push    0                      ;dwMoveMethod = FILE_BEGIN
    447.         push    0                      ;lpDistanceToMoveHigh
    448.         push    dword[edi-12]          ;lDistanceToMove = смещение цепочки
    449.         push    ebx                    ;hFile
    450.         call    [SetFilePointer]
    451.         push    0                      ;lpOverlapped
    452.         sub     edi,4
    453.         push    edi                    ;lpNumberOfBytesWritten
    454.         mov     eax,[edi]
    455.         push    eax                    ;nNumberOfBytesToWrite
    456.         sub     edi,12-4
    457.         sub     edi,eax
    458.         push    edi                    ;lpBuffer
    459.         push    ebx                    ;hFile
    460.         call    [WriteFile]
    461.         cmp     edi,bytes.body
    462.         jne     .loop
    463.  
    464.  
    465.  
    466.  
    467. ; выход(ы) -----------------------------------------------------
    468. leave_victim:
    469.         call    [CloseHandle]
    470.  
    471. exit:   push    eax                    ;uExitCode
    472.         call    [ExitProcess]
    473.  
    474. nothing_to_do:
    475.         sub     eax,eax
    476.         push    eax                    ;uType
    477.         push    eax                    ;lpCaption
    478.         call    @f                     ;lpText
    479.         db      string_nothing_to_do,0
    480. @@:     push    eax                    ;hWnd
    481.         call    [MessageBoxA]
    482.         jmp     exit
    483.  
    484.  
    485.  
    486.  
    487. ; см. больше тут: http://fasmme.googlecode.com/files/calc.rar --
    488. ascii_lower:
    489.         cmp     al,'A'
    490.         jb      @f
    491.         cmp     al,'Z'
    492.         ja      @f
    493.         add     al,' '                 ;'A..Z' -> 'a..z'
    494. @@:     ret     0
    495.  
    496.  
    497.  
    498.  
    499. get_number:
    500.         cmp     al,1
    501.         jnc     @f
    502.         ret     0                      ;конец строки
    503. @@:     xor     ecx,ecx                ;чисел записано в буфер
    504.         cmp     al,'"'
    505.         je      .raw                   ;как есть
    506.         cmp     al,"'"
    507.         je      .raw                   ;как есть
    508.         cmp     al,'$'
    509.         je      .set_number_notation_hex
    510.         cmp     word[esi-1],'0x'
    511.         je      .set_number_notation_hex_
    512.         cmp     word[esi-1],'0X'
    513.         je      .set_number_notation_hex_
    514.         mov     bl,0                   ;примем за десятичное
    515.         jmp     .check_load
    516. .set_number_notation_hex_:
    517.         inc     esi                    ;сместиться за 0x
    518.         mov     al,'$'
    519. .set_number_notation_hex:
    520.         mov     bl,al                  ;и так, шестн. или десятичное
    521. .load:  lodsb                          ;соберем цифры
    522.         cmp     al,"'"
    523.         je      .load                  ;fasm
    524. .check_load:
    525.         call    ascii_lower
    526.         cmp     al,'b'                 ;попробуем установить двоичную форму числа
    527.         je      .try_set_number_notation
    528.         cmp     al,'d'                 ;попробуем установить десятич. форму числа
    529.         je      .try_set_number_notation
    530.         cmp     al,'0'
    531.         jb      .load_to_number        ;меньше "0"
    532.         cmp     al,'9'
    533.         ja      .load_hex?             ;больше "9"
    534.         sub     al,'0'                 ;"0..9" -> 0..9
    535.         jmp     .store_load            ;сохранить цифру
    536. .load_hex?:
    537.         cmp     al,'a'
    538.         jb      .load_to_number        ;меньше 10
    539.         cmp     al,'f'
    540.         ja      .load_to_number        ;больше 15
    541. .load_hex:
    542.         sub     al,'a'-10              ;"a..f" -> 10..15
    543. .store_load:
    544.         add     cl,1
    545.         jnc     @f
    546.         ret     0                      ;вне памяти
    547. @@:     stosb                          ;сохраняем наконец
    548.         jmp     .load                  ;продолжаем сбор
    549. .try_set_number_notation:
    550.         cmp     bl,'$'
    551.         je      .load_hex              ;b, d в шестнадц. числе
    552.         mov     bl,al
    553.         inc     esi                    ;вспомнит?ся позже
    554. .load_to_number:
    555.         cmp     cl,1
    556.         jnc     @f
    557.         ret     0                      ;буфер пуст
    558. @@:     push    esi ebp                ;на выходе esi и edi вказывают на конец буферов в случае все ОК, ebp не трогаем
    559.         mov     ebp,esp                ;бедет leave для освобождения стэка
    560.         cmp     bl,'$'
    561.         je      .load_hex_to_number
    562.         cmp     bl,'b'
    563.         je      .load_bin_to_number
    564.  
    565. ;.load_dec_to_number:
    566.         xor     ebx,ebx                ;степень десятки
    567.         push    ebx ebx                ;результат
    568. .ldtn:  dec     edi
    569.         movzx   eax,byte[edi]          ;загрузили цифру
    570.         cmp     al,9
    571.         ja      .stc_leave_pepsi_ret   ;но шестн. :)
    572.         cmp     al,0
    573.         je      .ldtn_continue         ;0 * 10^x = 0
    574.         test    ebx,ebx
    575.         jnz     .ldtn_rank_nz
    576.         mov     [ebp-8],al
    577.         jmp     .ldtn_continue         ;al * 10^0 = al *  1 = al
    578. .ldtn_rank_nz:
    579.         push    ebx ecx
    580.         mov     ecx,ebx
    581.         mov     ebx,eax                ;младшее
    582.         xor     esi,esi                ;старшее
    583. .ldtn_rank:
    584.         mov     eax,10
    585.         mul     esi
    586.         jc      .leave_pepsi_ret       ;вне qword
    587.         mov     esi,eax
    588.         mov     eax,10
    589.         mul     ebx
    590.         add     esi,edx
    591.         jc      .leave_pepsi_ret       ;вне qword
    592.         mov     ebx,eax
    593.         loop    .ldtn_rank
    594.         add     [ebp-8],ebx            ;получаем общее
    595.         adc     [ebp-4],esi
    596.         jc      .leave_pepsi_ret       ;вне qword
    597.         pop     ecx ebx                ;восстанавливаемся и ...
    598. .ldtn_continue:
    599.         inc     ebx                    ;увеличим степень 10
    600.         loop    .ldtn
    601.         pop     ebx esi
    602.  
    603. .load_ok:
    604.         mov     eax,ebx
    605.         stosd
    606.         mov     eax,esi
    607.         stosd
    608.         leave
    609.         pop     esi
    610.         dec     esi
    611.         clc
    612.         ret     0
    613. .stc_leave_pepsi_ret:
    614.         stc
    615. .leave_pepsi_ret:
    616.         leave
    617.         pop     esi
    618.         ret     0
    619.  
    620. .load_hex_to_number:
    621.         mov     edx,ecx
    622.         xor     ecx,ecx                ;степень 16ти
    623.         xor     esi,esi                ;конечный результат
    624.         xor     ebx,ebx                ;...
    625. .lhtn:  dec     edi
    626.         movzx   eax,byte[edi]          ;загрузили из очередного млад. разряда
    627.         cmp     al,0
    628.         jz      .lhtn_continue         ;0
    629.         cmp     ecx,64
    630.         jae     .stc_leave_pepsi_ret   ;вне числа
    631.         cmp     cl,32
    632.         jae     .lhtn_high
    633.         shl     eax,cl
    634.         add     ebx,eax
    635.         jmp     .lhtn_continue
    636. .lhtn_high:
    637.         sub     cl,32
    638.         shl     eax,cl
    639.         add     cl,32
    640.         add     esi,eax
    641. .lhtn_continue:
    642.         dec     edx
    643.         jz      .load_ok
    644.         add     ecx,4                  ;*16 = *2^4 = shl 4
    645.         jmp     .lhtn
    646.  
    647. .load_bin_to_number:                   ;почти так само
    648.         mov     edx,ecx
    649.         xor     ecx,ecx
    650.         xor     esi,esi
    651.         xor     ebx,ebx
    652. .lbtn:  dec     edi
    653.         movzx   eax,byte[edi]
    654.         cmp     al,1
    655.         ja      .stc_leave_pepsi_ret
    656.         jb      .lbtn_continue
    657.         cmp     ecx,64
    658.         jae     .stc_leave_pepsi_ret
    659.         cmp     cl,32
    660.         jae     .lbtn_high
    661.         shl     eax,cl
    662.         add     ebx,eax
    663.         jmp     .lbtn_continue
    664. .lbtn_high:
    665.         sub     cl,32
    666.         shl     eax,cl
    667.         add     cl,32
    668.         add     esi,eax
    669. .lbtn_continue:
    670.         dec     edx
    671.         jz      .load_ok
    672.         inc     ecx
    673.         jmp     .lbtn
    674.  
    675. .raw:   mov     ah,al                  ;запомнить " или '
    676. .raw_loop:
    677.         lodsb
    678.         cmp     al,1
    679.         jc      .raw_ret               ;нет завершающей кавычки ah
    680.         cmp     al,ah
    681.         jne     .raw_store             ;не кавычка
    682.         lodsb
    683.         cmp     al,ah
    684.         je      .raw_store             ;ahah -> ah
    685.         dec     esi
    686.         mov     al,0                   ;подложка
    687.         neg     cl
    688.         add     cl,8
    689.         rep     stosb
    690.         clc
    691.         ret     0
    692. .raw_store:
    693.         inc     ecx                    ;счетчик записаных чисел
    694.         cmp     cl,8
    695.         ja      .raw_stc_ret           ;вне числа
    696.         stosb
    697.         jmp     .raw_loop
    698. .raw_stc_ret:
    699.         stc
    700. .raw_ret:
    701.         ret     0
    702.  
    703.  
    704.  
    705.  
    706. ; виртуальные данные -------------------------------------------
    707. victim:
    708.   .path dd ?                           ;имя файла-жертвы
    709.   .size dd ?                           ;размер в байтах
    710.  
    711. bytes:
    712.   .body rb $fffc                       ;статический буфер
    713.   .limit:                              ;и его кордон
    714.  
    715. element:
    716.   .size dd ?                           ;как писать числа: 1=байт, 2=слово, 4=двойное слово, 8=учетверенное слово
    717.  
    718. @v:                                    ;см. @v_init и .@v_init
    719.   .size dd ?                           ;имеем записей
    720.   .base dd ?                           ;база образа
    721.   .rva_size_addr rb 3*4*65'536         ;записи
    722.  
    723. option:
    724.   .s    db ?                           ;вкл\откл запрос на запись файла
     
  9. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    все бы было хорошо, если бы где нибудь вначале было кратко намекнуто в общих чертах что это и для чего это. приблизительно
     
  10. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    qqwe озадачил :)

    дальнейшее развитие как всегда не планирую
    спасибо
    пока