Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Ассемблер: загрузка файлов на FTP-сервер

04.04.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой пример работы с Интернетом на Ассемблере, а именно передача файла на сервер по FTP-протоколу. В реализации нет ничего сложного, а вот где применить это знание - решать вам. Можете сливать логи с паролями жертвы, можете загружать картинки на свой сайт.

В процессе работы используются константы, которых по дефолту нет в FASM. Это не самая большая проблема, опишем их самостоятельно:
  1. ; Константы для работы
  2. INTERNET_OPEN_TYPE_PRECONFIG = 0
  3. INTERNET_FLAG_PASSIVE = 0x08000000
  4. INTERNET_SERVICE_FTP = 1
  5. FTP_TRANSFER_TYPE_BINARY = 2
Теперь несколько слов о порядке загрузки файлов на FTP. Сперва создается FTP-соединение с удаленным сервером на указанный порт (по умолчанию 21) и с заранее известными логином и паролем. Если соединение прошло успешно, на сервере выбирается целевая директория относительно корневой. Затем указывается существующий файл на диске и имя, под которым он будет загружен на сервер. Вот, в принципе, и все, что надо знать. Осталось перевести слова на язык Ассемблера.
  1. ; Данные для подключения к FTP-серверу
  2. user_agent  db   'FTP Uploader',0   ; User Agent вашего загрузчика
  3. login       db   'login',0          ; Логин
  4. password    db   'password',0       ; Пароль
  5. server      db   'example.com',0    ; Сервер
  6. port        dd   21                 ; Порт для подключения к серверу
  7. local_file  db   'C:\data.txt',0    ; Имя исходного файла на диске
  8. remote_file db   'data.txt',0       ; Имя целевого файла на сервере
  9. remote_dir  db   '/public_html/',0  ; Имя целевой директории на сервере
Выше перечислены примерные данные, необходимые для подключения к FTP-серверу и для передачи файла. В вашем случае, естественно, все значения будут другими.

Читать статью целиком »
Просмотров: 7194 | Комментариев: 14

Преобразование вещественного числа в строку на Ассемблере

14.03.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я выкладывал статью о том, как на Ассемблере перевести строку в вещественное число, теперь настало время произвести обратную операцию, то есть перевести вещественное число в строку. В отличие от целых чисел, где достаточно нескольких строк кода, с преобразованием вещественных чисел пришлось повозиться. В результате появилась следующая функция. За основу взята аналогичная функция из пакета MASM, но со значительными доработками.
  1. ;------------------------------------------------------------
  2. ; Функция перевода вещественного числа в строку
  3. ;------------------------------------------------------------
  4. ; Портирование с MASM, доработка и оптимизация - ManHunter
  5. ; Параметры:
  6. ;   lpFloat - указатель на вещественное число TBYTE
  7. ;   lpResult - указатель на строку-приемник результата
  8. ;------------------------------------------------------------
  9. proc    FloatToString lpFloat:DWORD, lpResult:DWORD
  10.         ; Локальные переменные
  11.         local   digits_count:DWORD
  12.         local   tmp:DWORD
  13.         local   old_cw:WORD
  14.         local   new_cw:WORD
  15.         local   saved_float:TBYTE
  16.         local   tmp1 rb 12h
  17.         local   tmp2 rb 12h
  18.  
  19.         ; Сохранить все регистры
  20.         pusha
  21.  
  22.         ; Указатель на строку-приемник
  23.         mov     edi,[lpResult]
  24.  
  25.         ; Это ноль?
  26.         mov     esi,[lpFloat]
  27.         cmp     dword [esi],0
  28.         jne     loc_not_zero
  29.         cmp     dword [esi+4],0
  30.         jne     loc_not_zero
  31.         cmp     word [esi+8],0x8000
  32.         je      loc_minus_zero
  33.         cmp     word [esi+8],0
  34.         jne     loc_not_zero
  35.         ; Записать в строку ноль
  36.         mov     al,'0'
  37.         stosb
  38.         jmp     loc_ret
  39. loc_minus_zero:
  40.         ; Записать в строку минус ноль
  41.         mov     ax,'-0'
  42.         stosw
  43.         jmp     loc_ret
  44. loc_not_zero:
  45.         ; Denormalized?
  46.         mov     ax,word [esi+8]
  47.         and     ax,7F80h
  48.         or      ax,ax
  49.         jnz     loc_not_denorm
  50.         cmp     dword [esi],0
  51.         jne     loc_denorm
  52.         cmp     dword [esi+4],0
  53.         je      loc_not_denorm
  54. loc_denorm:
  55.         mov     esi,szDen
  56.         movsd
  57.         movsd
  58.         movsd
  59.         jmp     loc_ret
  60. loc_not_denorm:
  61.         ; Infinity или NaN?
  62.         mov     ax,word [esi+8]
  63.         and     ax,7F80h
  64.         cmp     ax,7F80h
  65.         jne     loc_not_inf_nan
  66.  
  67.         ; Это Infinity?
  68.         cmp     dword [esi],0
  69.         jne     loc_nan
  70.         cmp     dword [esi+4],80000000h
  71.         jne     loc_nan
  72. loc_infinity:
  73.         mov     esi,szInf
  74.         movsd
  75.         movsb
  76. loc_plus_minus:
  77.         movsd
  78.         mov     esi,[lpFloat]
  79.         test    byte [esi+9],80h
  80.         jz      loc_ret
  81.         mov     esi,[lpResult]
  82.         mov     byte[esi],'-'
  83.         jmp     loc_ret
  84. loc_nan:
  85.         mov     esi,szNan
  86.         jmp     loc_plus_minus
  87.  
  88. loc_not_inf_nan:
  89.         ; Скопировать число в локальную переменную
  90.         push    edi
  91.         mov     esi,[lpFloat]
  92.         lea     edi,[saved_float]
  93.         movsd
  94.         movsd
  95.         movsw
  96.         pop     edi
  97.         ; Число отрицательное?
  98.         cmp     dword [saved_float+6],0
  99.         jge     loc_not_signed
  100.         ; Привести число к абсолютному значению
  101.         and     byte [saved_float+9],7Fh
  102.         ; Записать в строку минус
  103.         mov     al,'-'
  104.         stosb
  105.  
  106. loc_not_signed:
  107.         ; Проверить число на наличие дробной части и
  108.         ; подсчитать количество цифр в нем
  109.         fclex
  110.         ; Сохранить управляющее слово
  111.         fstcw   [old_cw]
  112.         ; Установить управляющее слово
  113.         mov     [new_cw],0000001001111111b
  114.         fldcw   [new_cw]
  115.         lea     esi,[saved_float]
  116.         fld     tbyte [esi]
  117.         fld     st
  118.         ; Выделить мантиссу и порядок
  119.         fxtract
  120.         fstp    st
  121.         fldlg2
  122.         ; Получить количество цифр в числе
  123.         fmulp   st1,st
  124.         fistp   [digits_count]
  125.         ; Если цифр больше 16, то число отображается в
  126.         ; нормализованном виде с мантиссой и экспонентой
  127.         cmp     [digits_count],10h
  128.         jnb     loc_not_integer
  129.         ; У числа есть дробная часть?
  130.         fld     st
  131.         frndint
  132.         fcomp   st1
  133.         fstsw   ax
  134.         test    ah,01000000b
  135.         ; Да, отображать число с дробной частью
  136.         jz      loc_not_integer
  137.  
  138.         ; Целое число без дробной части и экспоненты
  139.         lea     eax,[tmp1]
  140.         fbstp   [eax]
  141.  
  142.         ; Перевести BCD-число в строку
  143.         push    edi
  144.         lea     esi,[tmp1+8]
  145.         lea     edi,[tmp2]
  146.         mov     ecx, 9
  147. @@:
  148.         std
  149.         xor     eax,eax
  150.         lodsb
  151.         cld
  152.         rol     ax,12
  153.         rol     ah,4
  154.         add     ax,'00'
  155.         stosw
  156.         loop    @b
  157.         pop     edi
  158.  
  159.         ; Пропустить лидирующий ноль
  160.         mov     eax,11h
  161.         mov     ecx,[digits_count]
  162.         sub     eax,ecx
  163.         inc     ecx
  164.         lea     esi,[tmp2+eax]
  165.         cmp     byte [esi],'0'
  166.         jne     @f
  167.         inc     esi
  168.         dec     ecx
  169. @@:
  170.         ; Перенести полученное число из временного буфера
  171.         rep     movsb
  172.         jmp     loc_clear_stack
  173.  
  174. loc_not_integer:
  175.         mov     eax,10h
  176.         sub     eax,[digits_count]
  177.  
  178.         ; Преобразовать число в целое до 16 разрядов
  179.         mov     ecx,eax
  180.         cmp     eax,0
  181.         jge     @f
  182.         neg     eax
  183. @@:
  184.         ; Для чисел больше 0 корректировка округления в сторону 0
  185.         mov     [new_cw],0000101001111111b
  186.         cmp     ecx,0
  187.         jge     @f
  188.         mov     [new_cw],0000011001111111b
  189. @@:
  190.         ; Установить управляющее слово
  191.         fldcw   [new_cw]
  192.  
  193.         ; Возвести 10 в степень количества цифр
  194.         mov     [tmp],eax
  195.         fild    [tmp]
  196.         fld     [float2]
  197.         fyl2x
  198.         fld1
  199.         fld     st1
  200.         fprem
  201.         f2xm1
  202.         faddp
  203.         fscale
  204.  
  205.         ; Почистить стек
  206.         fxch    st1
  207.         fstp    st
  208.  
  209.         ; Если число меньше 0, то умножить, иначе разделить
  210.         cmp     ecx,0
  211.         jge     @f
  212.         fdivp   st1,st
  213.         jmp     loc_rounded
  214. @@:
  215.         fmulp   st1,st
  216.  
  217. loc_rounded:
  218.         ; Полученное значение меньше 1.0e16 ?
  219.         fcom    [float1]
  220.         fstsw   ax
  221.         test    ah,1
  222.         jz      @f
  223.         fmul    [float2]
  224.         dec     [digits_count]
  225. @@:
  226.         ; Целое число без дробной части и экспоненты
  227.         lea     eax,[tmp1]
  228.         fbstp   [eax]
  229.  
  230.         ; Перевести BCD-число в строку
  231.         push    edi
  232.         lea     esi,[tmp1+8]
  233.         lea     edi,[tmp2]
  234.         mov     ecx, 9
  235. @@:
  236.         std
  237.         xor     eax,eax
  238.         lodsb
  239.         cld
  240.         rol     ax,12
  241.         rol     ah,4
  242.         add     ax,'00'
  243.         stosw
  244.         loop    @b
  245.         pop     edi
  246.  
  247.         ; Числу требуется мантисса и экспонента?
  248.         lea     esi,[tmp2+1]
  249.         mov     ecx,[digits_count]
  250.         cmp     ecx,-0Fh
  251.         jl      loc_mantiss_and_exponent
  252.         cmp     ecx,10h
  253.         jg      loc_mantiss_and_exponent
  254.  
  255.         ; Заполнить дробную часть числа
  256.         inc     ecx
  257.         cmp     ecx,0
  258.         jg      @f
  259.         mov     ax,'0.'
  260.         stosw
  261.         neg     ecx
  262.         mov     al,'0'
  263.         rep     stosb
  264.         mov     ecx,10h
  265.         jmp     loc_fraction_filled
  266. @@:
  267.         rep     movsb
  268.         mov     al,'.'
  269.         stosb
  270.         mov     ecx,10h
  271.         sub     ecx,[digits_count]
  272.  
  273. loc_fraction_filled:
  274.         rep     movsb
  275.         jmp     @f
  276.  
  277. loc_clear_fraction:
  278.         ; Удалить завершающие нули дробной части
  279.         dec     edi
  280. @@:
  281.         cmp     byte [edi-1],'0'
  282.         jz      loc_clear_fraction
  283.         cmp     byte [edi-1],'.'
  284.         jnz     @f
  285.         dec     edi
  286. @@:
  287.         jmp     loc_clear_stack
  288.  
  289. loc_mantiss_and_exponent:
  290.         ; Дробная часть мантиссы
  291.         movsb
  292.         mov     al,'.'
  293.         stosb
  294.         movsd
  295.         movsd
  296.         movsw
  297.         ; Удалить завершающие нули дробной части
  298. @@:
  299.         cmp     byte [edi-1],'0'
  300.         jne     @f
  301.         cmp     byte [edi-2],'.'
  302.         je      @f
  303.         dec     edi
  304.         jmp     @b
  305. @@:
  306.         ; Символ и знак экспоненты
  307.         mov     al,'e'
  308.         stosb
  309.         mov     al,'+'
  310.         mov     ebx,[digits_count]
  311.         cmp     ebx, 0
  312.         jge     @f
  313.         mov     al,'-'
  314.         neg     ebx
  315. @@:
  316.         stosb
  317.  
  318.         ; Значение экспоненты
  319.         mov     eax,ebx
  320.         mov     ecx,10
  321.         mov     ebx,4
  322. @@:
  323.         dec     ebx
  324.         xor     edx,edx
  325.         div     ecx
  326.         add     dl,'0'
  327.         mov     [tmp1+ebx],dl
  328.         or      ebx,ebx
  329.         jnz     @b
  330.  
  331.         ; Пропустить лидирующие нули экспоненты
  332.         mov     ecx,4
  333.         lea     esi,[tmp1]
  334. @@:
  335.         lodsb
  336.         cmp     al,'0'
  337.         jne     @f
  338.         dec     ecx
  339.         jmp     @b
  340. @@:
  341.         dec     esi
  342.         rep     movsb
  343.  
  344. loc_clear_stack:
  345.         ; Восстановить управляющее слово
  346.         fldcw   [old_cw]
  347. loc_ret:
  348.         ; Окончание строки
  349.         mov     al,0
  350.         stosb
  351.  
  352.         ; Восстановить все регистры
  353.         popa
  354.         ret
  355.  
  356. float1  dq      1.0e16
  357. float2  dq      10.0
  358.  
  359. szInf   db      '+Infinity'
  360. szNan   db      '+NaN'
  361. szDen   db      'Denormalized'
  362.  
  363. endp
Параметры вызова: lpFloat - указатель на вещественное число TBYTE (10 байт), lpResult - указатель на строку-приемник результата. Функция самодостаточная, не требует никаких дополнительных переменных в секции данных и вспомогательных функций, исходное число не меняется. В отличие от MASM'овской функции, поддерживаются вещественные числа в диапазоне -1e4932..+1e4932, увеличено количество отображаемых цифр после запятой, улучшена точность округления мантиссы для очень больших и очень маленьких чисел, улучшено форматирование значения экспоненты и выполнены другие действия по оптимизации алгоритма.

Читать статью целиком »
Просмотров: 11153 | Комментариев: 27

Защита кнопок формы от автокликеров

10.02.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей я писал об управлении другим приложением из своей программы, в частности о возможности эмулировать нажатия на кнопки. Ненадолго переберусь на другую сторону баррикады и расскажу о нехитром способе, которым можно отличить реальные нажатия на кнопки от эмулированных. Заключается он в том, что при обработке клика проверяются экранные координаты, где это событие произошло. Если они находятся в пределах границ кнопки, то все нормально, иначе клик считается эмулированным. Координаты события можно получить при помощи функции GetMessagePos.
  1. button_clicked:
  2.         ; Получить экранные координаты кнопки
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  4.         invoke  GetWindowRect,eax,pt
  5.  
  6.         ; Получить координаты произошедшего события
  7.         invoke  GetMessagePos
  8.  
  9.         ; Выделить координату Y
  10.         mov     ebx,eax
  11.         shr     ebx,16
  12.         mov     [y],ebx
  13.  
  14.         ; Выделить координату X
  15.         mov     ebx,eax
  16.         and     ebx,0FFFFh
  17.         mov     [x],ebx
  18.  
  19.         ; Проверка, чтобы событие произошло в пределах кнопки
  20.         mov     eax,[y]
  21.         cmp     eax,[pt.top]
  22.         jb      clicked_by_robot
  23.         cmp     eax,[pt.bottom]
  24.         ja      clicked_by_robot
  25.  
  26.         mov     eax,[x]
  27.         cmp     eax,[pt.left]
  28.         jb      clicked_by_robot
  29.         cmp     eax,[pt.right]
  30.         ja      clicked_by_robot
  31.  
  32. clicked_by_human:
  33.         ; Кнопка нажата человеком
  34.         ...
  35.  
  36. clicked_by_robot:
  37.         ; Кнопка нажата автоматически
  38.         ...
Недостаток такого способа в том, что при работе с кнопками и полями формы с клавиатуры, координаты события все равно будут передаваться на основании положения курсора мыши. Эту проблему можно решить через субклассированный обработчик, в котором придется подавлять нажатия с клавиатуры. Ну и не забывайте о том, что никто не мешает так же программно передвинуть курсор на кнопку и "кликнуть" на ней, так что это защита только от самых простейших автокликеров. А адептам Темной стороны Силы будет полезно знать о такой возможности защиты, хотя на практике я ничего подобного не встречал.

Читать статью целиком »
Просмотров: 5712 | Комментариев: 17

Обработка нажатия на BUTTON разными кнопками мыши

03.01.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обычно элементы управления типа BUTTON в окне приложения реагируют только на обычное нажатие. При клике левой кнопкой мыши на кнопке или при нажатии на клавиатуре клавиши пробел, окну отправляется сообщение WM_COMMAND с параметром BN_CLICKED и идентификатором нажатой кнопки. На этом все. Но иногда надо сделать так, чтобы кнопки реагировали на клик не только левой кнопки мыши, а, например, правой кнопки или колесика. Этого можно добиться через субклассирование обработчика кнопки, ведь по сути она является самостоятельным окном. При инициализации основного окна повесим субклассированный обработчик на нужную нам кнопку:
  1.         ; Субклассировать кнопку
  2.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  3.         mov     ebx,eax
  4.         ; Установить наш собственный обработчик
  5.         invoke  SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
  6.         ; Сохранить хэндл предыдущего обработчика
  7.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
Еще нам понадобятся идентификатор сообщения, которое будет отправляться из обработчика родительскому окну и текстовые строчки, при помощи которых родительское окно будет реагировать на это сообщение.
  1. ; Пользовательское сообщение от обработчика кнопки
  2. WM_BUTTON_CLICK = WM_USER + 275
  3.  
  4. szMsg1  db     'Left mouse Button',0
  5. szMsg2  db     'Right mouse Button',0
  6. szMsg3  db     'Middle mouse Button',0
Общую структуру субклассированного обработчика я повторять здесь не буду, на сайте выложена уже не одна статья, где он используется. Но теперь нам надо определиться со списком сообщений, которые он должен обрабатывать. Обычная кнопка срабатывает от клавиатуры и от мышки, значит нам надо обрабатывать как минимум сообщения WM_KEYDOWN и WM_LBUTTONDOWN. А раз мы хотим отлавливать нажатия и других кнопок мыши, то к этому списку добавляются WM_MBUTTONDOWN и WM_RBUTTONDOWN.

Читать статью целиком »
Просмотров: 8978 | Комментариев: 3

Вывод разноцветного текста в консоли

26.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter

Вывод разноцветного текста в консоли

Давно не обращался к теме консольных приложений, надо бы восполнить этот недостаток. С обычным консольным вводом-выводом вопросов возникнуть не должно, тут ничего сложного нет. А вот какие-нибудь необычные действия с консолью, надеюсь, будут интересными. В оконных приложениях можно менять цвета отдельных элементов, что-то похожее можно делать и в консоли.

Читать статью целиком »
Просмотров: 14335 | Комментариев: 10

prev 01 ... 47 48 49 50 51 52 53 ... 68 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.2 сек. / MySQL: 2 (0.0075 сек.) / Память: 4.5 Mb
Наверх