亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ksh_svr.c

?? linux內核調試小工具.可以讀寫指定地址上的數據
?? C
字號:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/net.h>
#include <linux/version.h>
#include <net/sock.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
#include <linux/init.h>
#include <linux/list.h>

#include "ksh_svr.h"

MODULE_AUTHOR("Dupree");


#ifdef FUNCTRACE
#define ENTERFUNCTION   printk("Enter: %s, line %i\n", __func__,__LINE__)
#define LEAVEFUNCTION   printk("Leave: %s, line %i\n", __func__,__LINE__)
#else
#define ENTERFUNCTION   do {} while (0)
#define LEAVEFUNCTION   do {} while (0)
#endif

/*macro*/
#define MAX_SESSION_NUM 8
#define MAX_SOCKET_READ_LEN 1000
#define MAX_SOCKET_WRITE_LEN 8000

struct session_info{
    struct list_head list;
    pid_t session_pid;
    struct socket* sock;
    struct completion thread_exit; 
    wait_queue_head_t wait_queue;
};

/*var*/
static LIST_HEAD(session_list_head);
unsigned int session_sum = 0;
char *sym = "/proc/ksyms";
MODULE_PARM(sym, "s");

struct file *sym_file = NULL;
static DECLARE_MUTEX(exec_sem);

/*func*/
static struct socket *listen_and_bind(const int port);
static struct socket *ksh_svr_accept(struct socket *sock);
void thread_init(struct session_info* psession);
static void read_data(struct socket *sock);
static int new_session(void *arg);
static void send_data(struct socket *sock, char *buffer, int len);

extern int execute_cmd(char *usr_input, char *output);

#if 1 //def DEBUG
void dump_data(char *addr, int length);
#endif



#if 1 //def DEBUG
void dump_data(char *addr, int length)
{
    int i;
    printk("length = %d", length);
    for(i = 0; i < length; i++)
    {
        if((i%16)==0)
        {
            printk("\n%08x: ", (unsigned int)&addr[i]);
        }else if((i%8)==0)
        {
            printk("- ");
        }
        printk("%2.2x ", (unsigned char)addr[i]);
    }
    printk("\n");
}
#endif


void thread_init(struct session_info* psession)
{
    daemonize();
    reparent_to_init();
    spin_lock_irq(&current->sigmask_lock);
    sigfillset(&current->blocked);
    siginitsetinv(&current->blocked, sigmask(SIGKILL) | sigmask(SIGSTOP)|sigmask(SIGTERM));
    recalc_sigpending(current);
    spin_unlock_irq(&current->sigmask_lock);
    
    init_completion(&psession->thread_exit);
    init_waitqueue_head(&psession->wait_queue);
}

/*
 * read data from socket, reference ip_vs_receive()
 */
 
static void read_data(struct socket *sock)
{
    struct msghdr msg;
    struct iovec iov;
    mm_segment_t oldfs;
    int len = 0, output_len = 0;

    char *buffer = (char *)kmalloc(MAX_SOCKET_READ_LEN, GFP_KERNEL);
    
    if(buffer == NULL){
        printk("malloc memory failed\n");
        return;
    }
    
    memset(buffer, 0, MAX_SOCKET_READ_LEN);
	msg.msg_name = 0;
	msg.msg_namelen = 0;
	msg.msg_iov	= &iov;
	msg.msg_iovlen = 1;
	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;
	
	msg.msg_iov->iov_base = buffer;
	msg.msg_iov->iov_len  = (size_t)MAX_SOCKET_READ_LEN;
	
	
	oldfs = get_fs(); 
    set_fs(KERNEL_DS);
    /*len = sock_recvmsg(sock, &msg, 4000, MSG_PEEK);*/
	len = sock_recvmsg(sock, &msg, MAX_SOCKET_READ_LEN, 0);

    if(len >0){
        
	    //dump_data(buffer, len);

	    char *output = (char *)kmalloc(MAX_SOCKET_WRITE_LEN, GFP_KERNEL);
        
        if(output == NULL){
        	set_fs(oldfs);
        	kfree(buffer);            
            return;
        }
        memset(output, 0, MAX_SOCKET_WRITE_LEN);
        /*execute_cmd會訪問一些全局變量*/
        down_interruptible(&exec_sem);
        output_len = execute_cmd(buffer, output);
        //printk("output_len = %d\n", output_len);
        //printk("%s\n", output);
        send_data(sock, output, output_len);
        
        kfree(output);
        up(&exec_sem);
    }
    
	set_fs(oldfs);
	kfree(buffer);
}

static void send_data(struct socket *sock, char *buffer, int len)
{
    struct msghdr msg;
    struct iovec iov;
    mm_segment_t oldfs;

    if(buffer == NULL){
        printk("buffer == NULL\n");
        return;
    }
    
    
	msg.msg_name = 0;
	msg.msg_namelen = 0;
	msg.msg_iov	= &iov;
	msg.msg_iovlen = 1;
	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;
	
	msg.msg_iov->iov_base = buffer;
	msg.msg_iov->iov_len  = len;
	
	
	oldfs = get_fs(); 
    set_fs(KERNEL_DS);
    
    len = sock_sendmsg(sock, &msg, len);
    //printk("server say send msg len = %d\n", len);
	set_fs(oldfs);
}

static int new_session(void *arg)
{
    struct session_info *psession = (struct session_info *)arg;
    struct socket *sock = psession->sock;
    struct sock *sk = sock->sk;
    
    ENTERFUNCTION;
    sprintf(current->comm, "ksh_session%d", current->pid);
    thread_init(psession);
    
    while(1){
        /*If this is no data, then sleep*/
        if(!skb_queue_empty(&sk->receive_queue)){
            read_data(psession->sock);
        }

        interruptible_sleep_on_timeout(&psession->wait_queue, 1*HZ);

        if (sock->sk->state == TCP_CLOSE){
            break;
		} 
        
        if(signal_pending(current)){
            break;
        }
    }

    LEAVEFUNCTION;
    
    session_sum--;
    sock_release(sock);
    
    list_del(&psession->list);
    complete_and_exit(&psession->thread_exit, 0);     
    kfree(psession);

    printk("%s exit\n", current->comm);
   
    return 0;       
}

static int main_daemon(void *arg)
{
    struct socket *sock = NULL;
    struct socket *new_sock = NULL;
    struct session_info *psession = (struct session_info *)arg;
    int err = 0;
    
    sprintf(current->comm, "ksh_daemon");
    thread_init(psession); 
    
    sock = listen_and_bind(KSH_SVR_PORT);
    if(sock == NULL){
        printk("listen on port %d failed\n", KSH_SVR_PORT);
        goto failed;
    }
       
    while(1){
        
        new_sock = ksh_svr_accept(sock);
        
        /*go to sleep*/
        if(new_sock == NULL){
            interruptible_sleep_on_timeout(&psession->wait_queue, 1*HZ);
        }
        
        if(signal_pending(current)){
            printk("thread %s receive a signal\n", current->comm);
            break;
        }

        if(new_sock != NULL){
            
            if(session_sum < MAX_SESSION_NUM){
                struct session_info *psi = (struct session_info *)kmalloc(sizeof(struct session_info), GFP_KERNEL);

                if(psi == NULL){
                    printk("[%s]kmalloc memory for session %d failed\n", __func__, session_sum);
                    break;
                }
                
                memset(psi, 0, sizeof(struct session_info));
                psi->sock = new_sock;
                list_add(&psi->list, &session_list_head);
                psi->session_pid = kernel_thread(new_session, psi, CLONE_FS | CLONE_FILES);

                printk("Someone connected, spawn new task[%d]\n", psi->session_pid);
                session_sum++;
            }else{
                sock_release(new_sock);
                printk("Too many connects\n");
            }
        }

    }

    /*close socket*/
    err = sock->ops->shutdown(sock, 2);
    if(err){
        printk(KERN_ERR"Close sock failed!!\n");
    }
    sock_release(sock);

failed:
    
    list_del(&psession->list);
    complete_and_exit(&psession->thread_exit, 0);
    kfree(psession);  
    return 0;
}

static struct socket *ksh_svr_accept(struct socket *sock)
{
    int error = 0;
    struct socket *new_sock = NULL;

#if 0 /*直接使用阻塞的accept*/
    if(sock->sk->tp_pinfo.af_tcp.accept_queue == NULL){
        return NULL;
    }
#endif

    new_sock = sock_alloc();
    if (new_sock == NULL){
        printk("sock_alloc failed!\n");
        return NULL;
    }
    
    new_sock->type = sock->type;
    new_sock->ops = sock->ops;
    
    /*	00 - read-only
     *	01 - write-only
     *	10 - read-write
     */
    /*確保accept會被阻塞 O_RDONLY , NOT O_NONBLOCK*/
    error = sock->ops->accept(sock, new_sock, O_RDONLY);  /*read only*/
    
    if(error == 0){
        return new_sock;
    }else{
        sock_release(new_sock);
        return NULL;
    }    
}

static struct socket *listen_and_bind(const int port)
{
	struct socket *sock;
	struct sockaddr_in sin;
	int error;
		
	error = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
	if (error < 0)
    { 
	     printk(KERN_ERR "create ksh svr socket error!!\n");
	     return NULL;
    }
	
	sin.sin_family	     = AF_INET;
	sin.sin_addr.s_addr  = INADDR_ANY;
	sin.sin_port         = htons((unsigned short)port);
	
	error = sock->ops->bind(sock, (struct sockaddr*)&sin, sizeof(sin));
	if (error < 0)
	{
		printk(KERN_ERR " Error binding socket, using port %i. error = %d\n", port, -error);
		return NULL;	
	}

	sock->sk->reuse   = 1;

	error = sock->ops->listen(sock, MAX_SESSION_NUM);	
	if (error != 0)
	{
		printk(KERN_ERR "Error listening on socket \n");
		return NULL;
    }
    printk("listen and bind to port %d successful\n", port);
	return sock;
            
}


static int __init ksh_dev_init(void)
{
    struct session_info *psi = NULL;

    sym_file = filp_open(sym, O_RDONLY, 0);
    if(IS_ERR(sym_file)){
        printk("open symbol file:%s failed\n", sym);
        return -1;
    }
    
    psi = (struct session_info *)kmalloc(sizeof(struct session_info), GFP_KERNEL);
    if(psi == NULL){
        printk("[%s]kmalloc memory failed\n", __func__);
        return -1;
    }
    list_add(&psi->list, &session_list_head);
    psi->session_pid = kernel_thread(main_daemon, psi, CLONE_FS | CLONE_FILES);

    printk("symbol file = %s\n", sym);
    return 0;
}

static void __exit ksh_dev_exit(void)
{
    int ret;
    struct list_head *p, *n;
    struct session_info *psi;
    
    /*kill all session*/
    list_for_each_safe(p, n, &session_list_head){
    
        psi = list_entry(p, struct session_info, list);
        if(psi->session_pid > 0){
            ret = kill_proc(psi->session_pid, SIGTERM, 1);
            if(ret){
                printk("unable to send signal to pid %d\n", psi->session_pid);
            }else{
                wait_for_completion(&psi->thread_exit);
                /*printk("sesion pid[%d] exit\n", psi->session_pid);*/
            }
        }       
    }
    printk("ksh module removed successful\n");
    
    filp_close(sym_file, NULL);
    return;
}

module_init(ksh_dev_init);
module_exit(ksh_dev_exit); 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产一区二区| 欧美一级日韩不卡播放免费| 中文字幕一区二区三区在线播放 | 午夜欧美在线一二页| 欧美日韩成人激情| 久久丁香综合五月国产三级网站| 精品国产免费久久| 国产一区在线看| 国产精品理伦片| 欧美性高清videossexo| 日本大胆欧美人术艺术动态 | 久久久精品综合| 成人精品高清在线| 亚洲综合999| 日韩欧美区一区二| 成人美女在线视频| 亚洲二区在线视频| 久久夜色精品国产欧美乱极品| 成人sese在线| 日韩电影在线看| 欧美国产日韩精品免费观看| 在线精品国精品国产尤物884a| 天堂久久一区二区三区| 国产午夜精品一区二区三区嫩草| 日本韩国精品在线| 激情综合一区二区三区| 亚洲人成网站在线| 日韩欧美国产一二三区| 一本一道久久a久久精品 | 欧美成人高清电影在线| 成人一区二区三区在线观看| 偷拍与自拍一区| 中文字幕精品三区| 在线综合视频播放| av色综合久久天堂av综合| 美女性感视频久久| 亚洲精品视频一区| 国产亚洲婷婷免费| 91精品国产全国免费观看| 成人动漫在线一区| 麻豆91免费看| 亚洲综合久久久| 日本欧美韩国一区三区| 亚洲精品乱码久久久久久黑人| 欧美mv和日韩mv的网站| 欧美色男人天堂| 高清成人在线观看| 久久99精品久久久| 天堂va蜜桃一区二区三区| 国产精品电影一区二区| 久久久久久久久久久久电影 | 欧美tickling挠脚心丨vk| 欧美影院精品一区| 99精品黄色片免费大全| 国产不卡一区视频| 久久国产麻豆精品| 五月天丁香久久| 亚洲午夜在线视频| 18成人在线观看| 国产精品每日更新在线播放网址| 久久综合中文字幕| 日韩亚洲欧美成人一区| 9191成人精品久久| 欧美日韩成人综合| 欧美日韩高清一区二区三区| 91在线视频在线| 99re这里只有精品6| www.欧美日韩| 成人av网址在线| 99精品国产91久久久久久| 99在线视频精品| 99久久精品一区| 99久久国产综合精品女不卡| 成人手机在线视频| 成人精品免费视频| 波多野结衣一区二区三区 | 蜜桃av一区二区三区| 五月婷婷综合在线| 五月婷婷久久丁香| 麻豆精品一区二区三区| 免费成人深夜小野草| 青椒成人免费视频| 精品一区二区三区在线播放视频 | 99精品偷自拍| 色综合久久99| 欧美日韩高清一区二区三区| 欧美蜜桃一区二区三区| 欧美一级片在线观看| 精品美女一区二区三区| 久久美女艺术照精彩视频福利播放 | 婷婷一区二区三区| 蜜臀av一区二区在线观看| 国精产品一区一区三区mba视频 | 69堂亚洲精品首页| 日韩一级视频免费观看在线| 日韩天堂在线观看| 国产性天天综合网| 一区二区中文视频| 亚洲www啪成人一区二区麻豆| 丝袜a∨在线一区二区三区不卡| 麻豆成人免费电影| 国产成人精品免费在线| 色婷婷av久久久久久久| 7777精品伊人久久久大香线蕉的 | 国产日韩三级在线| 亚洲男同性视频| 免费高清不卡av| 成人不卡免费av| 3atv在线一区二区三区| 欧美激情一区二区三区在线| 亚洲综合图片区| 激情综合网天天干| 91蜜桃网址入口| 日韩一区二区麻豆国产| 国产精品女主播在线观看| 午夜久久久影院| 国产成人自拍网| 欧美日韩国产精品成人| 久久久不卡网国产精品二区 | 欧美日本韩国一区二区三区视频 | 日韩欧美激情四射| 中文字幕色av一区二区三区| 日韩激情av在线| 99久久久精品免费观看国产蜜| 91精品婷婷国产综合久久竹菊| 中文字幕精品一区二区精品绿巨人 | 懂色av中文一区二区三区| 欧美日韩中字一区| 国产精品欧美久久久久一区二区| 亚洲电影在线播放| 不卡视频在线看| 亚洲精品一区二区精华| 亚洲成人黄色小说| 97精品久久久午夜一区二区三区| 日韩午夜三级在线| 一区二区三区日韩精品| 国产成人aaaa| 精品国产乱码久久久久久夜甘婷婷| 亚洲人亚洲人成电影网站色| 国产精品69毛片高清亚洲| 3atv在线一区二区三区| 一区二区日韩av| 99精品国产一区二区三区不卡 | 欧美国产一区视频在线观看| 另类专区欧美蜜桃臀第一页| 欧美视频自拍偷拍| ...xxx性欧美| 国产成人啪免费观看软件| 欧美成人午夜电影| 日韩国产精品久久久久久亚洲| 91久久精品一区二区二区| 亚洲国产成人私人影院tom | 同产精品九九九| 欧美性猛交xxxxxx富婆| 亚洲伦理在线免费看| www.激情成人| 中文字幕亚洲一区二区va在线| 国产91综合网| 久久久久国产精品人| 国内偷窥港台综合视频在线播放| 日韩一区二区三区在线观看| 石原莉奈在线亚洲三区| 欧美日韩久久一区二区| 亚洲国产aⅴ成人精品无吗| 在线观看网站黄不卡| 亚洲欧美日韩中文播放 | 日韩精品亚洲一区二区三区免费| 欧美在线不卡一区| 亚洲成人免费视| 欧美日韩不卡一区二区| 免费在线观看一区二区三区| 日韩女同互慰一区二区| 激情综合一区二区三区| 欧美精品一区二区三区视频| 国产精品一级在线| 国产精品色呦呦| 91九色最新地址| 亚洲午夜精品网| 欧美精品色综合| 久久91精品国产91久久小草| 精品国产百合女同互慰| 国产凹凸在线观看一区二区| 国产精品美女久久久久av爽李琼 | 日韩免费高清av| 国产一区日韩二区欧美三区| 国产日韩av一区二区| 99久久精品免费| 亚洲成人自拍网| 精品久久久久久久久久久久久久久 | 不卡的av在线播放| 亚洲欧美日韩一区二区| 欧美日韩电影在线播放| 美女一区二区视频| 国产精品久久久久影院亚瑟| 在线精品视频一区二区| 久久99国产精品免费| 18欧美亚洲精品| 日韩一区二区免费在线观看| 丰满岳乱妇一区二区三区| 亚洲国产日韩a在线播放|