真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

LinuxHIDSagent概要和用戶態(tài)HOOK(一)-創(chuàng)新互聯(lián)

作者:u2400@知道創(chuàng)宇404實(shí)驗(yàn)室
時(shí)間:2019年12月19日

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都做網(wǎng)站、閔行網(wǎng)絡(luò)推廣、成都小程序開發(fā)、閔行網(wǎng)絡(luò)營(yíng)銷、閔行企業(yè)策劃、閔行品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供閔行建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

原文:https://paper.seebug.org/1102/

前言:最近在實(shí)現(xiàn)linux的HIDS agent, 搜索資料時(shí)發(fā)現(xiàn)雖然資料不少, 但是每一篇文章都各自有側(cè)重點(diǎn), 少有循序漸進(jìn), 講的比較全面的中文文章, 在一步步學(xué)習(xí)中踩了不少坑, 在這里將以進(jìn)程信息收集作為切入點(diǎn)就如何實(shí)現(xiàn)一個(gè)HIDS的agent做詳細(xì)說(shuō)明, 希望對(duì)各位師傅有所幫助.

1. 什么是HIDS?

主機(jī)***檢測(cè), 通常分為agent和server兩個(gè)部分

其中agent負(fù)責(zé)收集信息, 并將相關(guān)信息整理后發(fā)送給server.

server通常作為信息中心, 部署由安全人員編寫的規(guī)則(目前HIDS的規(guī)則還沒(méi)有一個(gè)編寫的規(guī)范),收集從各種安全組件獲取的數(shù)據(jù)(這些數(shù)據(jù)也可能來(lái)自waf, NIDS等), 進(jìn)行分析, 根據(jù)規(guī)則判斷主機(jī)行為是否異常, 并對(duì)主機(jī)的異常行為進(jìn)行告警和提示.

HIDS存在的目的在于在管理員管理海量IDC時(shí)不會(huì)被安全事件弄的手忙腳亂, 可以通過(guò)信息中心對(duì)每一臺(tái)主機(jī)的健康狀態(tài)進(jìn)行監(jiān)視.

相關(guān)的開源項(xiàng)目有OSSEC, OSquery等, OSSEC是一個(gè)已經(jīng)構(gòu)建完善的HIDS, 有agent端和server端, 有自帶的規(guī)則, 基礎(chǔ)的rootkit檢測(cè), 敏感文件修改提醒等功能, 并且被包含到了一個(gè)叫做wazuh的開源項(xiàng)目, OSquery是一個(gè)facebook研發(fā)的開源項(xiàng)目, 可以作為一個(gè)agent端對(duì)主機(jī)相關(guān)數(shù)據(jù)進(jìn)行收集, 但是server和規(guī)則需要自己實(shí)現(xiàn).

每一個(gè)公司的HIDS agent都會(huì)根據(jù)自身需要定制, 或多或少的增加一些個(gè)性化的功能, 一個(gè)基礎(chǔ)的HIDS agent一般需要實(shí)現(xiàn)的有:

  • 收集進(jìn)程信息

  • 收集網(wǎng)絡(luò)信息

  • 周期性的收集開放端口

  • 監(jiān)控敏感文件修改

下文將從實(shí)現(xiàn)一個(gè)agent入手, 圍繞agent討論如何實(shí)現(xiàn)一個(gè)HIDS agent的進(jìn)程信息收集模塊

2. agent進(jìn)程監(jiān)控模塊提要

2.1進(jìn)程監(jiān)控的目的

在Linxu操作系統(tǒng)中幾乎所有的運(yùn)維操作和***行為都會(huì)體現(xiàn)到執(zhí)行的命令中, 而命令執(zhí)行的本質(zhì)就是啟動(dòng)進(jìn)程, 所以對(duì)進(jìn)程的監(jiān)控就是對(duì)命令執(zhí)行的監(jiān)控, 這對(duì)運(yùn)維操作升級(jí)和***行為分析都有極大的幫助

2.2 進(jìn)程監(jiān)控模塊應(yīng)當(dāng)獲取的數(shù)據(jù)

既然要獲取信息那就先要明確需要什么, 如果不知道需要什么信息, 那實(shí)現(xiàn)便無(wú)從談起, 即便硬著頭皮先實(shí)現(xiàn)一個(gè)能獲取pid等基礎(chǔ)信息的HIDS, 后期也會(huì)因?yàn)槿鄙僖?guī)劃而頻繁改動(dòng)接口, 白白耗費(fèi)人力, 這里參考《互聯(lián)網(wǎng)企業(yè)安全高級(jí)指南》給出一個(gè)獲取信息的基礎(chǔ)列表, 在后面會(huì)補(bǔ)全這張表的的獲取方式

數(shù)據(jù)名稱含義
path可執(zhí)行文件的路徑
ppath父進(jìn)程可執(zhí)行文件路徑
ENV環(huán)境變量
cmdline進(jìn)程啟動(dòng)命令
pcmdline父進(jìn)程啟動(dòng)命令
pid進(jìn)程id
ppid父進(jìn)程id
pgid進(jìn)程組id
sid進(jìn)程會(huì)話id
uid啟動(dòng)進(jìn)程用戶的uid
euid啟動(dòng)進(jìn)程用戶的euid
gid啟動(dòng)進(jìn)程用戶的用戶組id
egid啟動(dòng)進(jìn)程用戶的egid
mode可執(zhí)行文件的權(quán)限
owner_uid文件所有者的uid
owner_gid文件所有者的gid
create_time文件創(chuàng)建時(shí)間
modify_time最近的文件修改時(shí)間
pstart_time進(jìn)程開始運(yùn)行的時(shí)間
prun_time父進(jìn)程已經(jīng)運(yùn)行的時(shí)間
sys_time當(dāng)前系統(tǒng)時(shí)間
fd文件描述符

2.3 進(jìn)程監(jiān)控的方式

進(jìn)程監(jiān)控, 通常使用hook技術(shù), 而這些hook大概分為兩類:

應(yīng)用級(jí)(工作在r3, 常見的就是劫持libc庫(kù), 通常簡(jiǎn)單但是可能被繞過(guò) - 內(nèi)核級(jí)(工作在r0或者r1, 內(nèi)核級(jí)hook通常和系統(tǒng)調(diào)用VFS有關(guān), 較為復(fù)雜, 且在不同的發(fā)行版, 不同的內(nèi)核版本間均可能產(chǎn)生兼容性問(wèn)題, hook出現(xiàn)嚴(yán)重的錯(cuò)誤時(shí)可能導(dǎo)致kenrel panic, 相對(duì)的無(wú)法從原理上被繞過(guò)

首先從簡(jiǎn)單的應(yīng)用級(jí)hook說(shuō)起

3. HIDS 應(yīng)用級(jí)hook

3.1 劫持libc庫(kù)

庫(kù)用于打包函數(shù), 被打包過(guò)后的函數(shù)可以直接使用, 其中l(wèi)inux分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù), 其中動(dòng)態(tài)庫(kù)是在加載應(yīng)用程序時(shí)才被加載, 而程序?qū)τ趧?dòng)態(tài)庫(kù)有加載順序, 可以通過(guò)修改?/etc/ld.so.preload?來(lái)手動(dòng)優(yōu)先加載一個(gè)動(dòng)態(tài)鏈接庫(kù), 在這個(gè)動(dòng)態(tài)鏈接庫(kù)中可以在程序調(diào)用原函數(shù)之前就把原來(lái)的函數(shù)先換掉, 然后在自己的函數(shù)中執(zhí)行了自己的邏輯之后再去調(diào)用原來(lái)的函數(shù)返回原來(lái)的函數(shù)應(yīng)當(dāng)返回的結(jié)果.

想要詳細(xì)了解的同學(xué), 參考這篇文章

劫持libc庫(kù)有以下幾個(gè)步驟:

3.1.1 編譯一個(gè)動(dòng)態(tài)鏈接庫(kù)

一個(gè)簡(jiǎn)單的hook execve的動(dòng)態(tài)鏈接庫(kù)如下.
邏輯非常簡(jiǎn)單

  1. 自定義一個(gè)函數(shù)命名為execve, 接受參數(shù)的類型要和原來(lái)的execve相同

  2. 執(zhí)行自己的邏輯

#define?_GNU_SOURCE #include? #include? typedef?ssize_t?(*execve_func_t)(const?char*?filename,?char*?const?argv[],?char*?const?envp[]); static?execve_func_t?old_execve?=?NULL; int?execve(const?char*?filename,?char*?const?argv[],?char*?const?envp[])?{ ????????//從這里開始是自己的邏輯,?即進(jìn)程調(diào)用execve函數(shù)時(shí)你要做什么 ????printf("Running?hook\n"); ????//下面是尋找和調(diào)用原本的execve函數(shù),?并返回調(diào)用結(jié)果 ????old_execve?=?dlsym(RTLD_NEXT,?"execve"); ????return?old_execve(filename,?argv,?envp); }

通過(guò)gcc編譯為so文件.

gcc?-shared?-fPIC?-o?libmodule.so?module.c

3.1.2 修改ld.so.preload

ld.so.preload是LD_PRELOAD環(huán)境變量的配置文件, 通過(guò)修改該文件的內(nèi)容為指定的動(dòng)態(tài)鏈接庫(kù)文件路徑,

注意只有root才可以修改ld.so.preload, 除非默認(rèn)的權(quán)限被改動(dòng)了

自定義一個(gè)execve函數(shù)如下:

extern?char?**environ; int?execve(const?char*?filename,?char*?const?argv[],?char*?const?envp[])?{ ????for?(int?i?=?0;?*(environ?+?i)?;?i++) ????{ ????????printf("%s\n",?*(environ?+?i)); ????} ????printf("PID:%d\n",?getpid()); ????old_execve?=?dlsym(RTLD_NEXT,?"execve"); ????return?old_execve(filename,?argv,?envp); }

可以輸出當(dāng)前進(jìn)程的Pid和所有的環(huán)境變量, 編譯后修改ld.so.preload, 重啟shell, 運(yùn)行l(wèi)s命令結(jié)果如下
Linux HIDS agent 概要和用戶態(tài) HOOK(一)

3.1.3 libc hook的優(yōu)缺點(diǎn)

優(yōu)點(diǎn): 性能較好, 比較穩(wěn)定, 相對(duì)于LKM更加簡(jiǎn)單, 適配性也很高, 通常對(duì)抗web層面的***.

缺點(diǎn): 對(duì)于靜態(tài)編譯的程序束手無(wú)策, 存在一定被繞過(guò)的風(fēng)險(xiǎn).

3.1.4 hook與信息獲取

設(shè)立hook, 是為了建立監(jiān)控點(diǎn), 獲取進(jìn)程的相關(guān)信息, 但是如果hook的部分寫的過(guò)大過(guò)多, 會(huì)導(dǎo)致影響正常的業(yè)務(wù)的運(yùn)行效率, 這是業(yè)務(wù)所不能接受的, 在通常的HIDS中會(huì)將可以不在hook處獲取的信息放在agent中獲取, 這樣信息獲取和業(yè)務(wù)邏輯并發(fā)執(zhí)行, 降低對(duì)業(yè)務(wù)的影響.

4 信息補(bǔ)全與獲取

如果對(duì)信息的準(zhǔn)確性要求不是很高, 同時(shí)希望盡一切可能的不影響部署在HIDS主機(jī)上的正常業(yè)務(wù)那么可以選擇hook只獲取PID和環(huán)境變量等必要的數(shù)據(jù), 然后將這些東西交給agent, 由agent繼續(xù)獲取進(jìn)程的其他相關(guān)信息, 也就是說(shuō)獲取進(jìn)程其他信息的同時(shí), 進(jìn)程就已經(jīng)繼續(xù)運(yùn)行了, 而不需要等待agent獲取完整的信息表.

/proc/[pid]/stat

/proc是內(nèi)核向用戶態(tài)提供的一組fifo接口, 通過(guò)偽文件目錄的形式調(diào)用接口

每一個(gè)進(jìn)程相關(guān)的信息, 會(huì)被放到以pid命名的文件夾當(dāng)中, ps等命令也是通過(guò)遍歷/proc目錄來(lái)獲取進(jìn)程的相關(guān)信息的.

一個(gè)stat文件內(nèi)容如下所示, 下面self是/proc目錄提供的一個(gè)快捷的查看自己進(jìn)程信息的接口, 每一個(gè)進(jìn)程訪問(wèn)/self時(shí)看到都是自己的信息.

#cat?/proc/self/stat 3119?(cat)?R?29973?3119?19885?34821?3119?4194304?107?0?0?0?0?0?0?0?20?0?1?0?5794695?5562368?176?18446744073709551615?94309027168256?94309027193225?140731267701520?0?0?0?0?0?0?0?0?0?17?0?0?0?0?0?0?94309027212368?94309027213920?94309053399040?140731267704821?140731267704841?140731267704841?140731267706859?0

會(huì)發(fā)現(xiàn)這些數(shù)據(jù)雜亂無(wú)章, 使用空格作為每一個(gè)數(shù)據(jù)的邊界, 沒(méi)有地方說(shuō)明這些數(shù)據(jù)各自表達(dá)什么意思.

一般折騰找到了一篇文章里面給出了一個(gè)列表, 這個(gè)表里面說(shuō)明了每一個(gè)數(shù)據(jù)的數(shù)據(jù)類型和其表達(dá)的含義, 見文章附錄1

最后整理出一個(gè)有52個(gè)數(shù)據(jù)項(xiàng)每個(gè)數(shù)據(jù)項(xiàng)類型各不相同的結(jié)構(gòu)體, 獲取起來(lái)還是有點(diǎn)麻煩, 網(wǎng)上沒(méi)有找到輪子, 所以自己寫了一個(gè)

具體的結(jié)構(gòu)體定義:

struct?proc_stat?{ ????int?pid;?//process?ID.????char*?comm;?//可執(zhí)行文件名稱,?會(huì)用()包圍????char?state;?//進(jìn)程狀態(tài)????int?ppid;???//父進(jìn)程pid????int?pgid; ????int?session;????//sid????int?tty_nr;????? ????int?tpgid; ????unsigned?int?flags; ????long?unsigned?int?minflt; ????long?unsigned?int?cminflt; ????long?unsigned?int?majflt; ????long?unsigned?int?cmajflt; ????long?unsigned?int?utime; ????long?unsigned?int?stime; ????long?int?cutime; ????long?int?cstime; ????long?int?priority; ????long?int?nice; ????long?int?num_threads; ????long?int?itrealvalue; ????long?long?unsigned?int?starttime; ????long?unsigned?int?vsize; ????long?int?rss; ????long?unsigned?int?rsslim; ????long?unsigned?int?startcode; ????long?unsigned?int?endcode; ????long?unsigned?int?startstack; ????long?unsigned?int?kstkesp; ????long?unsigned?int?kstkeip; ????long?unsigned?int?signal;???//The?bitmap?of?pending?signals????long?unsigned?int?blocked; ????long?unsigned?int?sigignore; ????long?unsigned?int?sigcatch; ????long?unsigned?int?wchan; ????long?unsigned?int?nswap; ????long?unsigned?int?cnswap; ????int?exit_signal; ????int?processor; ????unsigned?int?rt_priority; ????unsigned?int?policy; ????long?long?unsigned?int?delayacct_blkio_ticks; ????long?unsigned?int?guest_time; ????long?int?cguest_time; ????long?unsigned?int?start_data;??? ????long?unsigned?int?end_data; ????long?unsigned?int?start_brk;???? ????long?unsigned?int?arg_start;????//參數(shù)起始地址????long?unsigned?int?arg_end;??????//參數(shù)結(jié)束地址????long?unsigned?int?env_start;????//環(huán)境變量在內(nèi)存中的起始地址????long?unsigned?int?env_end;??????//環(huán)境變量的結(jié)束地址????int?exit_code;?//退出狀態(tài)碼};

從文件中讀入并格式化為結(jié)構(gòu)體:

struct?proc_stat?get_proc_stat(int?Pid)?{ ????FILE?*f?=?NULL; ????struct?proc_stat?stat?=?{0}; ????char?tmp[100]?=?"0"; ????stat.comm?=?tmp; ????char?stat_path[20]; ????char*?pstat_path?=?stat_path; ????if?(Pid?!=?-1)?{ ????????sprintf(stat_path,?"/proc/%d/stat",?Pid); ????}?else?{ ????????pstat_path?=?"/proc/self/stat"; ????} ????if?((f?=?fopen(pstat_path,?"r"))?==?NULL)?{ ????????printf("open?file?error"); ????????return?stat; ????} ????fscanf(f,?"%d?",?&stat.pid); ????fscanf(f,?"(%100s?",?stat.comm); ????tmp[strlen(tmp)-1]?=?'\0'; ????fscanf(f,?"%c?",?&stat.state); ????fscanf(f,?"%d?",?&stat.ppid); ????fscanf(f,?"%d?",?&stat.pgid); ????fscanf?( ????????????f, ????????????"%d?%d?%d?%u?%lu?%lu?%lu?%lu?%lu?%lu?%ld?%ld?%ld?%ld?%ld?%ld?%llu?%lu?%ld?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%d?%d?%u?%u?%llu?%lu?%ld?%lu?%lu?%lu?%lu?%lu?%lu?%lu?%d", ????????????&stat.session,?&stat.tty_nr,?&stat.tpgid,?&stat.flags,?&stat.minflt, ????????????&stat.cminflt,?&stat.majflt,?&stat.cmajflt,?&stat.utime,?&stat.stime, ????????????&stat.cutime,?&stat.cstime,?&stat.priority,?&stat.nice,?&stat.num_threads, ????????????&stat.itrealvalue,?&stat.starttime,?&stat.vsize,?&stat.rss,?&stat.rsslim, ????????????&stat.startcode,?&stat.endcode,?&stat.startstack,?&stat.kstkesp,?&stat.kstkeip, ????????????&stat.signal,?&stat.blocked,?&stat.sigignore,?&stat.sigcatch,?&stat.wchan, ????????????&stat.nswap,?&stat.cnswap,?&stat.exit_signal,?&stat.processor,?&stat.rt_priority, ????????????&stat.policy,?&stat.delayacct_blkio_ticks,?&stat.guest_time,?&stat.cguest_time,?&stat.start_data, ????????????&stat.end_data,?&stat.start_brk,?&stat.arg_start,?&stat.arg_end,?&stat.env_start, ????????????&stat.env_end,?&stat.exit_code????); ????fclose(f); ????return?stat;}

和我們需要獲取的數(shù)據(jù)做了一下對(duì)比, 可以獲取以下數(shù)據(jù)

ppid父進(jìn)程id
pgid進(jìn)程組id
sid進(jìn)程會(huì)話id
start_time父進(jìn)程開始運(yùn)行的時(shí)間
run_time父進(jìn)程已經(jīng)運(yùn)行的時(shí)間

/proc/[pid]/exe

通過(guò)/proc/[pid]/exe獲取可執(zhí)行文件的路徑, 這里/proc/[pid]/exe是指向可執(zhí)行文件的軟鏈接, 所以這里通過(guò)readlink函數(shù)獲取軟鏈接指向的地址.

這里在讀取時(shí)需要注意如果readlink讀取的文件已經(jīng)被刪除, 讀取的文件名后會(huì)多一個(gè)?(deleted), 但是agent也不能盲目刪除文件結(jié)尾時(shí)的對(duì)應(yīng)字符串, 所以在寫server規(guī)則時(shí)需要注意這種情況

char?*get_proc_path(int?Pid)?{ ????char?stat_path[20]; ????char*?pstat_path?=?stat_path; ????char?dir[PATH_MAX]?=?{0}; ????char*?pdir?=?dir; ????if?(Pid?!=?-1)?{ ????????sprintf(stat_path,?"/proc/%d/exe",?Pid); ????}?else?{ ????????pstat_path?=?"/proc/self/exe"; ????} ????readlink(pstat_path,?dir,?PATH_MAX); ????return?pdir;}

/proc/[pid]/cmdline

獲取進(jìn)程啟動(dòng)的是啟動(dòng)命令, 可以通過(guò)獲取/proc/[pid]/cmdline的內(nèi)容來(lái)獲得, 這個(gè)獲取里面有兩個(gè)坑點(diǎn)

  1. 由于啟動(dòng)命令長(zhǎng)度不定, 為了避免溢出, 需要先獲取長(zhǎng)度, 在用malloc申請(qǐng)堆空間, 然后再將數(shù)據(jù)讀取進(jìn)變量.

  2. /proc/self/cmdline文件里面所有的空格和回車都會(huì)變成?'\0'也不知道為啥, 所以需要手動(dòng)換源回來(lái), 而且若干個(gè)相連的空格也只會(huì)變成一個(gè)'\0'.

這里獲取長(zhǎng)度的辦法比較蠢, 但是用fseek直接將文件指針移到文件末尾的辦法每次返回的都是0, 也不知道咋辦了, 只能先這樣

long?get_file_length(FILE*?f)?{ ????fseek(f,0L,SEEK_SET); ????char?ch; ????ch?=?(char)getc(f); ????long?i; ????for?(i?=?0;ch?!=?EOF;?i++?)?{ ????????ch?=?(char)getc(f); ????} ????i++; ????fseek(f,0L,SEEK_SET); ????return?i;}

獲取cmdline的內(nèi)容

char*?get_proc_cmdline(int?Pid)?{ ????FILE*?f; ????char?stat_path[100]?=?{0}; ????char*?pstat_path?=?stat_path; ????if?(Pid?!=?-1)?{ ????????sprintf(stat_path,?"/proc/%d/cmdline",?Pid); ????}?else?{ ????????pstat_path?=?"/proc/self/cmdline"; ????} ????if?((f?=?fopen(pstat_path,?"r"))?==?NULL)?{ ????????printf("open?file?error"); ????????return?""; ????} ????char*?pcmdline?=?(char?*)malloc((size_t)get_file_length(f)); ????char?ch; ????ch?=?(char)getc(f); ????for?(int?i?=?0;ch?!=?EOF;?i++?)?{ ????????*(pcmdline?+?i)?=?ch; ????????ch?=?(char)getc(f); ????????if?((int)ch?==?0)?{ ????????????ch?=?'?'; ????????} ????} ????return?pcmdline;}

小結(jié)

這里寫的只是實(shí)現(xiàn)的一種最常見最簡(jiǎn)單的應(yīng)用級(jí)hook的方法具體實(shí)現(xiàn)和代碼已經(jīng)放在了github上, 同時(shí)github上的代碼會(huì)保持更新, 下次的文章會(huì)分享如何使用LKM修改sys_call_table來(lái)hook系統(tǒng)調(diào)用的方式來(lái)實(shí)現(xiàn)HIDS的hook.

參考文章

https://www.freebuf.com/articles/system/54263.html
http://abcdefghijklmnopqrst.xyz/2018/07/30/Linux_INT80/
https://cloud.tencent.com/developer/news/337625
https://github.com/g0dA/linuxStack/blob/master/%E8%BF%9B%E7%A8%8B%E9%9A%90%E8%97%8F%E6%8A%80%E6%9C%AF%E7%9A%84%E6%94%BB%E4%B8%8E%E9%98%B2-%E6%94%BB%E7%AF%87.md

附錄1

這里完整的說(shuō)明了/proc目錄下每一個(gè)文件具體的意義是什么.
http://man7.org/linux/man-pages/man5/proc.5.html

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文標(biāo)題:LinuxHIDSagent概要和用戶態(tài)HOOK(一)-創(chuàng)新互聯(lián)
地址分享:http://weahome.cn/article/dejhip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部