1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

От зеленого к красному.

Тема в разделе "WASM.BEGINNERS", создана пользователем psh3nka, 5 фев 2017.

  1. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    Добрый день, форумчане. В данный момент прохожусь по данному мануалу. Переписываю код под fasm со своими модификациями(костылями) ,в общем учусь, практикуюсь и все такое. Там есть сэмпл, который немного смутил меня.
    Код (ASM):
    1.  
    2. ;#########################################################################
    3. ;Процедура GetBase                        
    4. ;Поиск базы исполняемого файла, если есть адрес где-то внутри него
    5. ;Вход: В esi - адрес внутри файла в памяти
    6. ;Выход:В eax - база PE-файла
    7. ;Заметки:обычно процедура используется с спроецируемыми файлами в память
    8. ;#########################################################################
    9. GetBase proc
    10. LOCAL Base:DWORD;чтобы не изменять контекст по договоренности
    11.     push esi;сохраняем все регистры, которые используются
    12.     push ecx
    13.  
    14.     pushf;сохраняем регистр флагов
    15.     and esi,0FFFF0000H;гранулярность выделения памяти
    16.     mov ecx,6;счетчик страниц
    17.  
    18. NextPage:;проверка очередной страницы
    19.     call ValidPE
    20.     .IF eax==1
    21.         mov Base,esi
    22.         popf
    23.         pop ecx
    24.         pop esi
    25.         mov eax,Base
    26.         ret
    27.     .ENDIF
    28.     sub esi,10000H
    29.     loop NextPage
    30.  
    31.     popf;восстанавливаем значения флагов
    32.     pop ecx
    33.     pop esi;восстанавливаем значения регистров
    34.     mov eax,FALSE;не нашли базу :(
    35.     ret
    36. GetBase endp
    37. ;#########################################################################
    38. ;Конец процедуры GetBase
    39. ;#########################################################################
    40.  
    А именно, вот этот участок:
    Код (ASM):
    1.  
    2.     mov Base,esi
    3.     popf
    4.     pop ecx
    5.     pop esi
    6.     mov eax,Base
    7.     ret
    8.  

    Зачем мы сохраняем адрес из esi в локальную Base,а потом из Base в eax, если можно просто mov eax, esi pop esi ?
     
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    602
    Адрес:
    Russia
    Думаю, просто авторское. Если переменная локальная, смысла так делать, действительно, мало.
     
    psh3nka нравится это.
  3. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    Спасибо. Я себя в ассме пока неуверенно чувствую, поэтому и не чую подвоха особо, но этот случай особенно в глаза бросился.
     
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    602
    Адрес:
    Russia
    Всегда пожалуйста. Способов найти базу Kernel32, наверное, полдюжины. Но на Висте+, таким образом, если не ошибаюсь, находится KernelBase.dll.
     
  5. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    _edge, да, для win7+ придется иначе реализовывать. Я пока только тренируюсь, дальше уже буду подтачивать в процессе создания своего.
     
  6. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    602
    Адрес:
    Russia
    С конкретными алго можно пока не торопиться, это никуда не убежит. Имхо лучше пока базу обкатывать, вроде извращений с регистрами и циклов, чтобы их "влет" понимать, вне зависимости от их "махровости".

    Т.е. пока отойти от викс-не викс, и рассматривать асм все ОС. Чтобы не было затыков на конструкциях вроде этой, когда думаешь "что он здесь удумал делать?" )

    "вредные советы" Евгения Остера http://z0mbie.daemonlab.org/21zero.html

    А также команды TEST, OR, AND для работы с частями байтов. Конечно у 386+ есть bit-test/bit-set команды, но часто именно встречаешь какой-нибудь AND.
     
    psh3nka нравится это.
  7. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    _edge, эти мнемоники я знаю, даже почти сразу понял, что сделал автор и почему именно ffff0000
    Код (ASM):
    1.  
    2. and esi,0FFFF0000H;
    3.  
    Страничка Зомби открыта во вкладках, но пока хочу окончательно с PE разобраться и методами его инфицирования. Это вполне себе практические задачи, которые интересно решать и одновременно учиться. Если есть инфа по win7 ,то поделитесь, пожалуйста источниками) А то пока нашел только сорцы, где автор не особо густо объясняет принцип. Еще на rohitab немного нашел.
     
  8. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    906
    Адрес:
    Ташкент
    Xм, по мне - так пахнет "компилятором"… Хотя, мои познания давным давно устарели…
    В свою очередь, от себя я бы этот код писал бы так
    Код (ASM):
    1.     popf
    2.     pop ecx
    3.     xchg esi,[esp]
    4.     pop eax
    5.     ret
    P.S.: Выглядит странно…
    Но, этим бы выделилось, что
    1. Код писался человеком :read:
    2. Код писался мною :russian:
     
    rococo795 нравится это.
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.568
    Адрес:
    г. Санкт-Петербург
    Код (ASM):
    1.  
    2. xchg esi,[esp]
    3.  
    Очень медленная инструкция. Словил лулзов, когда производительность моей реализации FFT из-за этой инструкции упала раз в десять.
    А разгадка проста - на время выполнения блокируется шина данных.
     
    shufps и Indy_ нравится это.
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.827
    SadKo,

    Профайл:

    xchg eax,[esp] / xchg [esp],eax - идентичный.

    mov ecx,[esp]
    mov [esp],eax
    mov eax,ecx

    В 3 раза быстрее xchg. Но никак не в 10.
     
  11. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    906
    Адрес:
    Ташкент
    Вoт вот, проблема в том, что такая безобитная инструкция фокусничает с шиной.
    Но, выход давно найден в Microsoft.
    [​IMG]
    P.S.: Кто не понял, о чём я… :clapping:
    Раньше каждый лишний вывод микросхемы имел свою стоимость (читал как-то про отличия сложности производства корпусов на 14, 16 и т.д. ног) и всё мультиплексироварось в "узких местах" (RAS/CAS в DRAM, A0/D0..A7/D7 у i8088 и т.д.).
    Но, у динамического ОЗУ была особенность - данные на запись и читаемые данные имели отдельные выводы.
    Тем самым, если бы у процессоров для доступа к памяти существовали шина читаемых и шина записываемых данных, блокировать шину бы не пришлось: xchg esi,[esp] одновременно и читала бы слово, и писало бы по разным шинам :beee:
     
  12. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.568
    Адрес:
    г. Санкт-Петербург
    Я говорю про то, что показали синтетические тесты на алгоритме FFT. Я реально сам обалдел.
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.827
    SadKo,

    Копался в ядре, попалась интересная конструкция. Два обмена в памяти сделаны для задержки, ожидание переключения контекста.
     

    Вложения:

    • lastcall.txt
      Размер файла:
      4,7 КБ
      Просмотров:
      573
  14. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    Indy_, а способ достать базу kernel32.dll с получением ret адреса из стека в самом начале тела вируса, который указывает куда-то в середину kernel32.dll с дальнейшим пролистыванием по 64kb назад пока не наткнемся на сигнатуру PE\0\0 еще работает?
    Потому что результат такой же как при использовании другого способа:
    Код (ASM):
    1.  
    2. mov ebx, [FS : 0x30]  ; get a pointer to the PEB
    3. mov ebx, [ebx + 0x0C]  ; get PEB->Ldr
    4. mov ebx, [ebx + 0x14]  ; get PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)
    5. mov ebx, [ebx]  ; 2nd Entry
    6. mov ebx, [ebx]  ; 3rd Entry
    7. mov ebx, [ebx + 0x10]  ; Get Kernel32 Base
    8.  
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.827
    psh3nka,

    Не, такое не годится. Во первых нельзя абы откуда обратиться абы куда - NX. В частности NX-SEH(это не просто резолвится).

    Во вторых считается что простое разыменование списка не есть гуд. Нужно пройти по связанному списку загрузчика и вычислить(взять") хэш от имени модуля.

    Код (Text):
    1. ; +
    2. ;
    3.  assume fs:nothing
    4. LdrGetNativeBase proc uses ebx esi edi
    5.  mov ebx,fs:[TEB.Peb]
    6.  mov ebx,PEB.Ldr[ebx]
    7.  lea ebx,PEB_LDR_DATA.InMemoryOrderModuleList[ebx] ; Head
    8.  assume ebx:PLIST_ENTRY
    9.  
    10.  mov esi,[ebx].Flink
    11.  assume esi:PLIST_ENTRY
    12.  
    13.  .while Ebx != Esi
    14.  lea edi,[esi][-LDR_DATA_TABLE_ENTRY.InMemoryOrderModuleList]
    15.  assume edi:PLDR_DATA_TABLE_ENTRY
    16.  
    17.  movzx eax,[edi].BaseDllName._Length
    18.  invoke LdrCalcHash, [Edi].BaseDllName.Buffer, Eax
    19.  .if Eax == 0A5951FEH
    20.  mov eax,[edi].DllBase
    21.  jmp Exit
    22.  .endif
    23.  mov esi,[esi].Flink
    24.  .endw
    25.  xor eax,eax
    26. Exit:
    27.  test eax,eax
    28.  ret
    29. LdrGetNativeBase endp
    Табуляция конечно офигенна, как собственно и само наличие тега кода :dntknw:
     
    Последнее редактирование: 8 фев 2017
    psh3nka нравится это.
  16. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    Вот эту строчку не совсем понял :)
    А предыдущие два примера что в себе содержат? У меня просто подозрение, что там kernelbase, а не kernel32
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.827
    psh3nka,

    > А предыдущие два примера что в себе содержат?

    Да какая разница, хэш нужный забейте туда. И вообще, это для обучения только, что бы вы вкурили что такое двусвязные списки.

    Вроде как я только один привёл. Впрочем и так всё ясно)
     
  18. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    602
    Адрес:
    Russia
    У меня схожий вопрос.

    Делаем exe, состоящий из одной инструкции ret. Грузим в Ольку, шагаем into,

    upload_2017-2-8_9-20-38.png

    Чем не Кернел32? Это я запускал 32-бит exe на вин7-64.

    --

    По двусвязным спискам находится здесь такое http://wasm.in/forum/threads/kak-poluchit-komandnuju-stroku-storonnego-processa.24418/

    Двусвязный список - это структура данных, которая состоит из узлов, которые хранят полезные данные, указатели на предыдущий узел и следующий узел. /Гугл/

    --

    Ожидая возможные грабли с Фасмом и FS:, напишу как его адресовать,

    fs
    mov eax,[something]
     
    Последнее редактирование: 8 фев 2017
  19. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    906
    Адрес:
    Ташкент
    Код (ASM):
    1.     assume fs:nothing
    2. LdrGetNativeBase proc uses ebx esi edi
    3.     mov ebx,fs:[TEB.Peb]
    4.     mov ebx,PEB.Ldr[ebx]
    5.     lea ebx,PEB_LDR_DATA.InMemoryOrderModuleList[ebx] ; Head
    6.     assume  ebx:PLIST_ENTRY
    7.  
    8.     mov esi,[ebx].Flink
    9.     assume  esi:PLIST_ENTRY
    10.  
    11.     .while Ebx != Esi
    12.         lea edi,[esi][-LDR_DATA_TABLE_ENTRY.InMemoryOrderModuleList]
    13.         assume  edi:PLDR_DATA_TABLE_ENTRY
    14.  
    15.         movzx   eax,[edi].BaseDllName._Length
    16.         invoke  LdrCalcHash, [Edi].BaseDllName.Buffer, Eax
    17.         .if Eax == 0A5951FEH
    18.             mov eax,[edi].DllBase
    19.             jmp Exit
    20.         .endif
    21.         mov esi,[esi].Flink
    22.     .endw
    23.     xor eax,eax
    24. Exit:
    25.     test    eax,eax
    26.     ret
    27. LdrGetNativeBase endp
    :declare:
     
    Indy_ нравится это.
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.827
    Paguo_86PK,

    Спасибо, это уже норм читабельно. Как вы это запостили ?

    _edge,

    > Чем не Кернел32? Это я запускал 32-бит exe на вин7-64.

    Анстаб метод. Тем более обычно не имеется стартап контекста.

    > Двусвязный список - это структура

    Спасибо я вкурсе. Мне уже эти списки весь мозг проели.)