2008-05-22

——————
关于系统调用劫持
如果一个木马要隐藏起来,不被系统管理员发现。截获系统调用似乎是必须的。大部分情况
下,通过修改系统调用表来实现系统调用的劫持。
下面是一个典型的截获系统调用的模块:
模块一:
#include
#include
#include
阅读全文 »

Posted @ Linux 星期四,2008-05-22 11:45 | 评论 (0) |

2008-05-08

——————
//// 转 superstar_gu 的百度空间//http://hi.baidu.com/superstar_gu/blog/item/2772124e3e7f150bb3de0535.html
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)
———————————————
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
阅读全文 »

Posted @ Linux 星期四,2008-05-08 06:40 | 评论 (2) |

2007-11-06

——————
朱熹之 2007-1-4 09:09 Linux 2.6版内核中通过模块获取sys_call_table地址的方法
转自我的blog:
http://blog.chinaunix.net/u/27624/showart_226262.html
本文主要介绍在Linux 2.6版的内核中实现基地址修改的方法。所有代码我都在基于2.6.19版内核的Fedora Core 6上进行了测试。
Linux 2.6版的内核出于安全的考虑没有将系统调用列表基地址的符号sys_call_table导出,但要对系统调用进行替换,却必须要获取该地址,于是就有了这篇文章。
我在这里采用的基本思路是这样的,因为系统调用都是通过0×80中断来进行的,故可以通过查找0×80中断的处理程序来获得sys_call_table的地址。其基本步骤是,首先获取中断描述符表的地址,再从中查找0×80中断的服务例程,再搜索该例程的内存空间,以从其中获取sys_call_table的地址。其代码如下:
#include
#include
阅读全文 »

Posted @ Linux 星期二,2007-11-06 09:41 | 评论 (0) |

2007-10-21

——————
如果在入侵事件调查中,传统的工具完全失效了,你该怎么办?当我在对付入侵者已经加载的内核模块时,就陷入了这种困境。由于从用户空间升级到了内核空间,LKM方式的入侵改变了以往使用的入侵响应的技术。一旦内核空间遭破坏,影响将覆盖到整个用户空间,这样入侵者无须改动系统程序就能控制他们的行为。而用户即使将可信的工具包上传到被入侵的主机,这些工具也不再可信。下面我将揭示恶意的内核模块如何工作,并且给出一些我开发的对付此类入侵的工具。
LKM概述
LKM的存在对系统管理员是个福音,对入侵检测却是个噩梦。LKM最初被设计用来无须重新启动而改变运行中的内核,从而提供一些动态功能。动态内核提供了对诸如新文件系统类型和网卡等设备的额外支持。此外,由于内核模块能够访问内核的所有调用和存储区,它能不受控制地改动整个操作系统的各个部位,因而所有调用和内存常驻的结构都有被恶意内核模块修改的危险。
LKM的一个臭名昭著的例子是knark。一旦knark编译并加载到入侵主机,将改变系统调用表从而改变操作系统的行为。系统调用表常驻在内核空间,基本上是提供给用户级别程序访问操作系统的入口。大多数Unix系统在手册的第二部分给出syscalls的正式定义。一旦内核作为用户空间运行,OS将把命令行上运行的所有命令和调用映像到系统调用表中。因此当knark改变系统调用表时也就改变了用户命令的执行。knark改动了以下的重要系统调用。
* getdents – 获得目标路径的目录项内容(即文件和子目录)。通过修改这个调用,knark实现对用户程序隐藏文件和目录。
* kill – 向进程发送信号,通常是杀掉进程。修改过的调用将使用无用的信号31,触发设置进程为”hidden”状态。当进程在hidden状态时,它在/proc中的纪录被删除,从而实现了对ps命令隐身。信号32被用来解除隐藏状态。
* read – 读取目标文件的内容。knark通过修改此调用实现对netstat隐藏入侵者的连接。
* ioctl – 改变文件和设备的状态。通过修改此调用,knark能够隐藏网卡的混杂位,同时在调用中插入了隐藏文件的函数。
阅读全文 »

Posted @ Linux 星期天,2007-10-21 20:56 | 评论 (0) |

2007-10-18

——————
本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。
  个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.
  第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。
  如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过http://download.chinaunix.net/search/?key=&q=kernel&frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。
  Debian下可以很方便的通过Debian源下载:
  首先查找一下可下载的内核源代码:
  # apt-cache search linux-source
  其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了:
阅读全文 »

Posted @ Linux 星期四,2007-10-18 11:16 | 评论 (0) |

2007-10-02

——————
与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。
非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处:
非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。
必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
阅读全文 »

Posted @ 知识如海 星期二,2007-10-02 17:35 | 评论 (1) |

2007-09-16

——————
写史上最强最短的武侠小说
小说要求:
1、要同时涉及3大门派 ,即峨嵋、少林、武当。
2、要包含江湖门派间多年恩怨情仇,又要打破世俗伦理。
3、同时情节还要扣人心悬,大有血雨腥风呼之欲来。令人极为期待该小说之续集,同时留下n多悬念,给人极大的扩写余地。
4、越短越好。
第2天,有人来投稿,全文只有十个字:
秃驴,竟敢跟贫道抢师太 !
阅读全文 »

Posted @ 生活如风 星期天,2007-09-16 10:32 | 评论 (0) |

2007-08-28

——————
Q 如何处理ComboBox中的回车键?避免退出程序?
A 在一般的EDIT中采用的方法是处理PretranlateMessage(),执行代码
CWnd *pWnd = GetFocus();
if(pWnd != NULL)
{
if(pWnd == GetDlgItem(IDC_EDIT1)
{
…//IDC_EDIT1具有焦点
阅读全文 »

Posted @ 知识如海 星期二,2007-08-28 17:41 | 评论 (0) |