Статья ASM для х86. (3.0) Практика

Часть 3. Практика под виндой

Теорию можно продолжать бесконечно, тем-более что тема эта настолько обширна, что закончить её можно только ко ‘второму пришествию’. Без практики она теряет смысл, поэтому пробежавшись по макушкам основ, рассмотрим фундаментальные команды ассемблера на практике.

В качестве компилятора буду использовать FASM, т.к. считаю его синтаксис самым правильным из всех ассемблеров. В отличии от своих собратьев, в нём нет двумысленных команд, да и в использовании он до неприличия прост - компилирует без всяких батников, по одной клавише F9 в своём окне. Весит всего 1 Мб и бесплатно валяется на сайте разработчика, от куда
. Теперь создайте в любой директории папку FASM и просто распакуйте в неё архив – fasm не требует установки в систему.

Ещё нам понадобится отладчик, чтобы воочию лицезреть происходящее внутри программы. Под виндой большой популярностью пользуется OllyDBG, причём советую скачать не вторую, , т.к. она возвращает более детальную информацию. Кроме того, для исследования ядерных структур, позже нужен будет и WinDbg от Microsoft. Этот зверь может отлаживать как пользовательские программы, так системные драйвера, до чего Оля пока не доросла. Ну и по мелочи, это дизассемблеры W32Dasm и HackersDisassembler, хек-редакторы HIEW32 и HxD. Калькулятор винды в инженерном виде, можно вообще закрепить на рабочем столе. Для начала этого хватит за глаза.


3.0. Приложение для тестов

Если с инструментами разобрались, напишем Win32 приложение, которое в дальнейшем будем использовать как ‘бокс’ для вставки в него различных инструкций. Запустим FASMW.EXE и скопи\пастим в окно его редактора такой код:

C-подобный:
format   PE gui
include  'win32ax.inc'
;------
.data
capt     db  'Прога v1.0',0
text     db  'Программируем на FASM под Win32.',13,10
         db  'Для выхода из программы нажмите ОК!',0
;------
.code
start:   invoke  MessageBox,0,text,capt,0
         invoke  ExitProcess,0
;------
.end start
Теперь просто жмём F9 и должна появиться такая форточка..

api_0.png


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

Весь код состоит из четырёх частей. В заголовке строка PE-GUI указывает fasm’у собрать оконное, а не консольное приложение. Инклуд почти всегда будет только один ‘win32ax.inc’ – он универсальный и подходит для большинства случаев. Дальше идёт секция-данных, в которой задаём имя окну, и текст в его тушке. 13,10 означает перевод строки, сама-же строка должна быть в кавычках и заканчиваться нулём. Под виндой все строки нуль-терминальные, в отличии от ДОС, где маркером окончания строки служит символ доллара($).

За секцией-данных сразу начинается секция-кода. Метка start: (с двоеточием в конце) является точкой-входа в программу, что на буржуйский манер звучит как ‘Entry-Point’ или просто ЕР. Если открыть эту программу в отладчике, то первым его Breakpoint будет как раз ЕР.

Для вывода диалогового окна используем Win-API ‘MessageBox’, которой в качестве параметров передаём адреса выводимых строк. Последний её параметр(0) задаёт кол-во буттонов в окне. Попробуйте установить его в 1, получите две кнопки ОК\Отмена.

Следом за первой API идёт вторая ‘ExitProcess’, которая прихлопнет нашу программу и выгрузит её из памяти Win. В самом хвосте кода, расположилась секция-импорта виндовых API-функций - это макрос такой ‘.end метка’. В качестве стартовой метки ЕР можно использовать любое имя (не обязательно start:), главное – потом подставить в макрос .end это-же имя.


3.1. Основные команды ассемблера.

3.1.0. Организация циклов

Циклы в ассемблере можно строить по разному - тут зависит от поставленной задачи.
Допустим нужно посчитать длину строки и мы знаем, что она заканчивается нулём. Тогда обнуляем один из свободных регистров, и на каждом шаге (итерации) увеличиваем этот регистр на 1. Как-только найдём терминальный нуль, выходим из цикла и в регистре-счётчике получаем длину строки. В этом случае нужна проверка и переход назад, если условие ложно. Пример такого цикла представлен ниже:


C-подобный:
format   PE gui
include  'win32ax.inc'
;------
.data
capt     db  'Считаем длину строки',0
text     db  'Программируем на FASM под Win32.',13,10
         db  'Для выхода из программы нажмите ОК!',0
;------
.code
start:   sub     ecx,ecx         ; ECX будет счётчик - обнуляем его.
         mov     esi,text        ; ESI = указатель на начало строки
@cycle:  cmp     byte[esi],0     ; цикл! сравнить байт из ESI с нулём.
         je      @ok             ; переход на метку, если равно (Jump Equal)
         inc     ecx             ; иначе: счётчик +1
         inc     esi             ; сдвигаем указатель ESI на сл.позицию в строке
         jmp     @cycle          ; вернуться в начало цикла!

@ok:     invoke  MessageBox,0,text,capt,0
         invoke  ExitProcess,0
;------
.end start
В комментах есть все пояснения, поэтому повторяться не буду.
Загрузите эту программу в отладчик OllyDbg и потрассируйте её клавишей F8.
По окончании цикла, в ECX получим длину строки равной 45h (69) символов.


cycle.png


Другой вариант цикла – это когда мы знаем длину строки, и нам нужно что-нибудь с ней сделать. В этом случае можно пойти по такому-же алгоритму, только не увеличивать счётчик, а поместив в него длину наоборот уменьшать его, пока не получим в нём нуль. Однако есть и другой вариант.

Для организации циклов, в ассемблере предусмотрена специальная команда LOOP, которая требует в качестве счётчика строго регистр ECX. Как только он обнуляется, LOOP автоматически останавливает цикл. Кроме того, эта инструкция сама и уменьшает ECX на каждой итерации, и нам не нужно двигать его руками. Вообщем как-раз то, что доктор прописал.

Попробуем таким макаром, например, зашифровать всю строку. Метод шифрования сейчас не важен.. пусть будет обычная операция XOR с любым 1-байтным ключом, таким как 7Eh. Вот пример такого алгоритма (будем считать, что длину строки(69) мы уже знаем из предыдущего кода):

C-подобный:
.code
start:   mov     ecx,69          ; ECX = длина строки для LOOP
         mov     esi,text        ; ESI = адрес строки
@crypt:  xor     byte[esi],7Eh   ; цикл! шифруем байт из ESI нашим ключом
         inc     esi             ; сл.байт в строке..
         loop    @crypt          ; повторить ECX-раз!

         invoke  MessageBox,0,text,capt,0
         invoke  ExitProcess,0
.end start

3.1.1. Команды для работы со-строками

Часто приходится иметь дело с большими массивами данных. Это может быть и просто копирование блоков памяти с места-на-место, или например повторить одну операцию несколько раз. Для таких случаев в ассемблере предусмотрены т.н. ‘цепочечные’ команды. Плюсы их в том, что не нужно вручную двигать указатели – они сдвигаются на автомате:
  • LODSB - чтение в AL из ESI;
  • STOSB - запись AL в EDI;
  • MOVSB - копирование из ESI в EDI;
  • CMPSB - сравнивает байт EDI, с байтом ESI (сравнивает строки);
  • SCASB - сравнивает байт AL, с байтом EDI (поиск символа в строке).
Буквально во-всех случаях, в качестве указателя на источник данных используется регистр ESI, а EDI – это всегда приёмник. Окончание(B) в названии команды означает байт, соответственно можно заменить его на: W=2-байта (word), или D=4-байта (dword). В зависимости от этого окончания, указатели авто\увеличиваются на 1, 2 или 4-байта.

Для организации циклов к ним применяется префикс REP. Как и в случае с командой LOOP, счётчиком служит регистр ECX, который при каждом шаге уменьшается на 1. Ниже приведены модификации префикса REP для строковых команд:

Код:
REP   - применяется для MOVSB (копирование строки)
REPE  - применяется для CMPSB (сравнение строк)
REPNE - применяется для SCASB (поиск символа в строке)
В качестве демки напишем программу, которая выведет в окно Environment машины, на которую попала. Среди этих данных будет: имя пользователя, версия Win, пути установки и прочая информация. Эти данные система копирует в самый подвал адресного пространства любого процесса, который запускает на исполнение. Это адрес 0х10000, хотя для самой программы выделяется база 0х400000. Адреса ниже 0х10000 система резервирует для отлова нулевых указателей. Это 64К-байтный сегмент от нуля, куда приложениям доступ закрыт:

envir.png


Как видно из этого скрина, текстовые строки хранятся там в виде ‘Unicode’, т.е. каждый символ кодируется двумя байтами, а не одним как в ASCII. Второй байт всегда нуль. Значит наша задача поставить указатель источника ESI на адрес 0х10000, а приёмник EDI прицелить на буфер в своей программе. Теперь, чтобы отсеять нули, читать будем из ESI по 2-байта, а сохранять в EDI по одному. Тогда получим ASCII-строку, которую можно будет сбоксить в мессагу функцией MessageBox(). Каждая строка текста заканчивается Unicode нулём (выделен синим), а после всего блока данных идёт топкое болото нулей, т.е. маркером окончания блока - будет 4 нуля подряд. Это на словах громоздко, а на деле..

C-подобный:
format   PE gui
include 'win32ax.inc'
;-------
.data
capt    db      'Блок окружения системы',0
buff    db      2048 dup(0)     ; выделяем 2К буфер в секции-данных
;-------
.code
start:  mov     esi,10000h      ; указатель на источник
        mov     edi,buff        ; адрес приёмника
@unicode:
        lodsw                   ; берём 2-байта из ESI в АХ
        cmp     ax,0            ; конец строки?
        jz      @test           ; да - на метку! (Jump Zero)
        stosb                   ; иначе: сохраняем в EDI только байт AL (из всего АХ)
        jmp     @unicode        ; продолжить.. (lodsw сам увеличивает esi на 2)

;// Встретилась пара нулей! Проверка на конец блока данных --------
@test:  cmp     dword[esi],0    ; проверить 4-байта из ESI на нуль
        je      @stop           ; если нарвались на болото нулей - стоп!
        mov     ax,0a0dh        ; иначе: перевод строки 13,10
        stosw                   ; вставить их в буфер!
        jmp     @unicode        ; продолжить..

@stop:  invoke  MessageBox,0,buff,capt,0    ; выводим мессагу на экран
        invoke  ExitProcess,0               ; выход из приложения!
.end start
envir_0.png


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


3.1.2. Команды CALL и RET – передача и возврат управления

Эта парочка должна всегда ходить вместе. Команда CALL кладёт на вершину стека адрес-возврата и вызывает какую-нибудь процедуру, а команда RET должна находится в конце вызванной процедуры, и сняв со стека адрес-возврата, передаёт на него управление. Рассмотрим такой код в отладчике..


C-подобный:
format   PE gui
include 'win32ax.inc'
;-------
.data
capt1   db     'Окно процедуры',0
text1   db     'Это вызов процедуры из приложения!',0
capt2   db     'Выход',0
text2   db     'Программа завершена успешно!',0
;-------
.code
start:  call    Merylin        ;// вызов процедуры!
        nop
        nop
        invoke  MessageBox,0,text2,capt2,0
        invoke  ExitProcess,0
;- Процедура ------
proc    Merylin
        invoke  MessageBox,0,text1,capt1,0
        ret                    ;// возврат управления
endp
.end start
ret.png


Инструкция RET вообще окутана тайнами, к которым прибегают многие асматики. Дело в том, что для процессора регистр EIP играет роль собаки-поводыря - куда он указывает, туда процессор и идёт. Значит чтобы перехватить управление у программы, нужно перехватить регистр EIP. Только он не поддаётся никаким уговорам и ‘причесать’ его не так-уж просто. В него нельзя записать значение, его нельзя поместить в стек, и вообще с ним ничего нельзя делать.

И тут на помощь приходит инструкция RET. Достаточно через PUSH поместить указатель на любую область памяти в стек, и следом вызвать инструкцию RET, как EIP сменит свой нрав на милость и прямиком последует за нами. Это старый приём, который назвали ‘фиктивным вызовом функций’.



3.1.3. Условные переходы

Под занавес главы, вспомним таблицу условных переходов, где литер N втиснутый по-середине, просто обращает условие на противоположное. Литер E в конце, уточняет условие и означает равно (например, JBE - это "ниже или равно", а JNG - "не больше"):
Код:
+----------------+-----------------+-------------------+
|   Символьный   |    Знаковый     |    По-флагам      |
+----------------+-----------------+-------------------+
|   JB - ниже    |   JL - меньше   |   JS - знак(-)    |
|   JE - равно   |   JZ - ноль     |   JC - перенос    |
|   JA - выше    |   JG - больше   |   JP - чётный     |
+----------------+-----------------+-------------------+
 
Последнее редактирование:
Z

zigun

В 10ке я так понимаю нет Environment

Код:
Memory map
Address    Size       Owner      Section    Contains                               Type   Access    Initial   Mapped as
00010000   00010000                                                                Map    RW        RW
00020000   0000F000                                                                Priv   RW        RW
00030000   00004000                                                                Map    R         R
00040000   00019000                                                                Map    R         R
00095000   0000B000                                                                Priv   RW  Guar  RW
000DA000   00002000                                                                Priv   RW  Guar  RW
000DC000   00004000                         stack of main thread                   Priv   RW  Guar  RW
000E0000   00004000                                                                Map    R         R
000F0000   00001000                                                                Priv   RW        RW
00100000   000C5000                                                                Map    R         R         \Device\HarddiskVolume5\Windows\System32\locale.nls
0031D000   00004000                                                                Priv   RW        RW
00321000   00003000                         data block of main thread              Priv   RW        RW
00324000   00003000                         data block of thread 00003DA0          Priv   RW        RW
00327000   00003000                         data block of thread 000039F4          Priv   RW        RW
0032A000   00001000                         data block of thread 00004D60          Priv   RW        RW
00400000   00001000   test                  PE header                              Imag   R         RWE
00401000   00001000   test       .data      data                                   Imag   R         RWE
00402000   00001000   test       .text      code                                   Imag   R         RWE
00403000   00001000   test       .idata     imports                                Imag   R         RWE
00410000   0000F000                                                                Priv   RW        RW
00545000   0000B000                                                                Priv   RW  Guar  RW
00585000   0000B000                                                                Priv   RW  Guar  RW
005C5000   0000B000                                                                Priv   RW  Guar  RW
005E0000   00007000                                                                Priv   RW        RW
006ED000   00002000                                                                Priv   RW  Guar  RW
006EF000   00001000                         stack of thread 00003DA0               Priv   RW  Guar  RW
007ED000   00002000                                                                Priv   RW  Guar  RW
007EF000   00001000                         stack of thread 000039F4               Priv   RW  Guar  RW
008ED000   00002000                                                                Priv   RW  Guar  RW
008EF000   00001000                         stack of thread 00004D60               Priv   RW  Guar  RW
008F0000   0004E000                                                                Map    R         R
00AF0000   00181000                                                                Map    R         R
00C80000   00258000                                                                Map    R         R
6FE80000   00001000   apphelp               PE header                              Imag   R         RWE
6FE81000   0007A000   apphelp    .text      code,exports                           Imag   R         RWE
6FEFB000   00002000   apphelp    .data      data                                   Imag   R         RWE
6FEFD000   00003000   apphelp    .idata     imports                                Imag   R         RWE
6FF00000   00017000   apphelp    .rsrc      resources                              Imag   R         RWE
6FF17000   00006000   apphelp    .reloc     relocations                            Imag   R         RWE
74080000   00001000   win32u                PE header                              Imag   R         RWE
74081000   00012000   win32u     .text      code,exports                           Imag   R         RWE
74093000   00001000   win32u     .data      data                                   Imag   R         RWE
74094000   00001000   win32u     .idata     imports                                Imag   R         RWE
74095000   00001000   win32u     .rsrc      resources                              Imag   R         RWE
74096000   00001000   win32u     .reloc     relocations                            Imag   R         RWE
75B50000   00001000   gdi32ful              PE header                              Imag   R         RWE
75B51000   0013D000   gdi32ful   .text      code,exports                           Imag   R         RWE
75C8E000   00003000   gdi32ful   .data      data                                   Imag   R         RWE
75C91000   00008000   gdi32ful   .idata     imports                                Imag   R         RWE
75C99000   00001000   gdi32ful   .didat                                            Imag   R         RWE
75C9A000   00012000   gdi32ful   .rsrc      resources                              Imag   R         RWE
75CAC000   00008000   gdi32ful   .reloc     relocations                            Imag   R         RWE
75D70000   00001000   IMM32                 PE header                              Imag   R         RWE
75D71000   0001A000   IMM32      .text      code,exports                           Imag   R         RWE
75D8B000   00001000   IMM32      .data      data                                   Imag   R         RWE
75D8C000   00002000   IMM32      .idata     imports                                Imag   R         RWE
75D8E000   00001000   IMM32      .didat                                            Imag   R         RWE
75D8F000   00005000   IMM32      .rsrc      resources                              Imag   R         RWE
75D94000   00002000   IMM32      .reloc     relocations                            Imag   R         RWE
76030000   00001000   KERNEL32              PE header                              Imag   R         RWE
76040000   00061000   KERNEL32   .text      code                                   Imag   R E       RWE
760B0000   00028000   KERNEL32   .rdata     imports,exports                        Imag   R         RWE
760E0000   00001000   KERNEL32   .data      data                                   Imag   RW        RWE
760F0000   00001000   KERNEL32   .rsrc      resources                              Imag   R         RWE
76100000   00005000   KERNEL32   .reloc     relocations                            Imag   R         RWE
76580000   00001000   ucrtbase              PE header                              Imag   R         RWE
76581000   0010C000   ucrtbase   .text      code,exports                           Imag   R         RWE
7668D000   00002000   ucrtbase   .data      data                                   Imag   R         RWE
7668F000   00002000   ucrtbase   .idata     imports                                Imag   R         RWE
76691000   00001000   ucrtbase   .rsrc      resources                              Imag   R         RWE
76692000   0000B000   ucrtbase   .reloc     relocations                            Imag   R         RWE
76830000   00001000   GDI32                 PE header                              Imag   R         RWE
76831000   00019000   GDI32      .text      code,exports                           Imag   R         RWE
7684A000   00001000   GDI32      .data      data                                   Imag   R         RWE
7684B000   00003000   GDI32      .idata     imports                                Imag   R         RWE
7684E000   00001000   GDI32      .didat                                            Imag   R         RWE
7684F000   00001000   GDI32      .rsrc      resources                              Imag   R         RWE
76850000   00002000   GDI32      .reloc     relocations                            Imag   R         RWE
76870000   00001000   KERNELBA              PE header                              Imag   R         RWE
76871000   001AE000   KERNELBA   .text      code,exports                           Imag   R         RWE
76A1F000   00004000   KERNELBA   .data      data                                   Imag   R         RWE
76A23000   00006000   KERNELBA   .idata     imports                                Imag   R         RWE
76A29000   00001000   KERNELBA   .didat                                            Imag   R         RWE
76A2A000   00001000   KERNELBA   .rsrc      resources                              Imag   R         RWE
76A2B000   00029000   KERNELBA   .reloc     relocations                            Imag   R         RWE
77170000   00001000   USER32                PE header                              Imag   R         RWE
77171000   00098000   USER32     .text      code,exports                           Imag   R         RWE
77209000   00002000   USER32     .data      data                                   Imag   R         RWE
7720B000   00009000   USER32     .idata     imports                                Imag   R         RWE
77214000   00001000   USER32     .didat                                            Imag   R         RWE
77215000   000E2000   USER32     .rsrc      resources                              Imag   R         RWE
772F7000   00006000   USER32     .reloc     relocations                            Imag   R         RWE
77300000   00001000   msvcp_wi              PE header                              Imag   R         RWE
77301000   00070000   msvcp_wi   .text      code,exports                           Imag   R         RWE
77371000   00003000   msvcp_wi   .data      data                                   Imag   R         RWE
77374000   00002000   msvcp_wi   .idata     imports                                Imag   R         RWE
77376000   00001000   msvcp_wi   .didat                                            Imag   R         RWE
77377000   00001000   msvcp_wi   .rsrc      resources                              Imag   R         RWE
77378000   00005000   msvcp_wi   .reloc     relocations                            Imag   R         RWE
773E0000   00078000                                                                Imag   R         RWE
77460000   00052000                                                                Imag   R         RWE
774C0000   0000A000                                                                Imag   R         RWE
774D0000   00001000   ntdll                 PE header                              Imag   R         RWE
774D1000   00113000   ntdll      .text      code,exports                           Imag   R         RWE
775E4000   00001000   ntdll      RT                                                Imag   R         RWE
775E5000   00006000   ntdll      .data      data                                   Imag   R         RWE
775EB000   00003000   ntdll      .mrdata                                           Imag   R         RWE
775EE000   00001000   ntdll      .00cfg                                            Imag   R         RWE
775EF000   0006C000   ntdll      .rsrc      resources                              Imag   R         RWE
7765B000   00005000   ntdll      .reloc     relocations                            Imag   R         RWE
7FE60000   00005000                                                                Map    R         R
7FF68000   00001000                                                                Priv   RW        RW
7FF71000   00001000                                                                Priv   RW        RW
7FF90000   00001000                                                                Priv   RW        RW
7FFA1000   00001000                                                                Priv   RW        RW
7FFB0000   00023000                                                                Map    R         R
7FFE0000   00001000                                                                Priv   R         R
 

Marylin

Mod.Assembler
Red Team
05.06.2019
312
1 406
BIT
452
В 10ке я так понимаю нет Environment
По сути блок окружения Environment должен быть у всех процессов.
Функция GetEnvironmentStrings() возвращает адрес блока-окружения для текущего процесса - попробуйте получить адрес при помощи этой функции. Если система 64-битная, код будет такой (проверить RAX в отладчике):
C-подобный:
format  PE64 gui
include 'win64ax.inc'
.code
start:  invoke  GetEnvironmentStrings
        invoke  ExitProcess,0
.end start
 
  • Нравится
Реакции: zigun и CKAP

CKAP

Green Team
10.06.2019
68
39
BIT
0
Если система 64-битная, код будет такой (проверить RAX в отладчике):
C-подобный:
format  PE64 gui
include 'win64ax.inc'
.code
start:  invoke  GetEnvironmentStrings
        invoke  ExitProcess,0
.end start

Просит стаковое пространство. И почему то инклуды приходится класть в каталог с кодом..
31371
 

Marylin

Mod.Assembler
Red Team
05.06.2019
312
1 406
BIT
452
СКАР, для 64-бит посмотрите примеры оформления кода в папке %fasm%\example
у меня нет х64 машины, а код набросал от фонаря (по их примерам)
И почему то инклуды приходится класть в каталог с кодом..
в секции Environment файла fasmw.ini пропишите полный путь до инклуд

ini.png
 
  • Нравится
Реакции: CKAP

CKAP

Green Team
10.06.2019
68
39
BIT
0
СКАР, для 64-бит посмотрите примеры оформления кода в папке %fasm%\example
Да не ну его накуй :) Я так мельком глянул в тот ад.. и я пока к такому не готов.
--------------------
Кстати из ВМн добрые люди посоветовали VMWare вместо Оракла. Ну я не тестил, ибо собрал физ машину и меня все устраивает. Но если кто ищет иной путь:
----------------------
>Так ты локальное ядро хочешь смотреть ? Лучше варьку поставь и вруби отладку по сети. Чтобы можно было стопнуть когда хочешь и посмотреть чо там.
----------------------
Так что, те кто тянутся ко всей этой адской ядерной теме пускай экспериментируют.
 
C

cracker888

Да не ну его накуй :) Я так мельком глянул в тот ад.. и я пока к такому не готов.
--------------------
Кстати из ВМн добрые люди посоветовали VMWare вместо Оракла. Ну я не тестил, ибо собрал физ машину и меня все устраивает. Но если кто ищет иной путь:
----------------------
>Так ты локальное ядро хочешь смотреть ? Лучше варьку поставь и вруби отладку по сети. Чтобы можно было стопнуть когда хочешь и посмотреть чо там.
----------------------
Так что, те кто тянутся ко всей этой адской ядерной теме пускай экспериментируют.
На Оракле работает, win7 x64, masm32

good.png
 
  • Нравится
Реакции: zigun и CKAP

CKAP

Green Team
10.06.2019
68
39
BIT
0
На Оракле работает, win7 x64, masm32
О как.. я на физ тачку перенес, тоже семка 64 и

31449

--------------------------------------------------------------------------------------------------------------------
Дамп от второго запуска.. ну короче там рандом
31450

-------------------------------
Скинь свой сорс для масма
******************************
Зы. > (Кстати из ВМн добрые люди посоветовали VMWare вместо Оракла ) Это отсылка к 4 части от автора
******************************
> Запускаем WinDbg в локальном режиме ядра [Ctrl+K --> Local] и ищем структуры:
 
Последнее редактирование:
C

cracker888

Скинь свой сорс для масма

Код:
.386
.model flat, stdcall
option casemap:none

include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib

.data
  
.code
main:
    call GetEnvironmentStrings
exit:
    push 0
    call ExitProcess        
end main

батник для компиляции

Код:
c:\masm32\bin\ml.exe /c /coff app.asm
c:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS app.obj
pause
--- --- ---
По поводу 4й части, после команды bcdedit /debug on WinDbg [Ctrl+K --> Local] на виртуалке тоже работает
 
Последнее редактирование:
  • Нравится
Реакции: CKAP

CKAP

Green Team
10.06.2019
68
39
BIT
0
Да.. нашел.. только вобче что то де то не там :)
31459


Ну да ладно. Было интересно.
 

jonni_vu

Green Team
24.06.2017
43
8
BIT
0
Привет. как формат изменить в программке .
 

Вложения

  • format.png
    format.png
    19,6 КБ · Просмотры: 499

jonni_vu

Green Team
24.06.2017
43
8
BIT
0
Помогло исправление реестра в моей англоязычной ОС . давно в разных прогах вопросы мешались))
 

SooLFaa

Platinum
15.07.2016
898
1 560
BIT
36
Вот достойные внимания темы. С огромным удовольствием читаю! Очень удобно познавать ассемблер в кратких мауналах, а не толмуты читать. Автор - продолжай.
 

InetTester

Green Team
21.10.2018
308
43
BIT
5
У меня одного Avast ругается при скачивание fasm?
 

Вложения

  • Новый точечный рисунок.jpg
    Новый точечный рисунок.jpg
    38,7 КБ · Просмотры: 254

Hardreversengineer

Green Team
20.08.2019
49
28
BIT
14
У меня одного Avast ругается при скачивание fasm?
Ну как говорил Крис Касперски "FASM - Игрушка хакера ежжи", по этому неудивительно.
Сам софт безвредный и с открытым исходным кодом, так что особо волноваться не стоит.
 

InetTester

Green Team
21.10.2018
308
43
BIT
5
Ну как говорил Крис Касперски "FASM - Игрушка хакера ежжи", по этому неудивительно.
Сам софт безвредный и с открытым исходным кодом, так что особо волноваться не стоит.

в базах он не числится

Да я наверное сильно много прочитал и услышал последнее время про Avast, и не совсем хорошего...)
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!