追逐本源,放弃浮华
EarthWorm

Termite

Friends

RSS

新写的几个Python模块

02 May 2017 TAGS : [ 技术相关 Python 数据分析 ]

模块功能

最近工作中经常遇到

数据比对
hex 数值输出

这些功能很简单,但已有的解决方案普遍很笨重,不适合快速验证结论的场景。

所以简单整理了一下近期的需求,写了几个基础模块,并放在github上,用的时候 curl/wget 一下即可直接用了,这样会舒服一些。

制表模块

为了续命

很多时刻,我只想得到一个这样的表格,以便找到程序中的 Bug 或者对比一坨新数据:

+-------+-----------------+-----------------+--------+
|       |      title1     |      title2     | title3 |
+-------+-----------------+-----------------+--------+
| item1 |       Hello 1*1 | Hello 1*2 AAAAA |     20 |
| item2 | Hello 2*1 BBBBB |       Hello 2*2 |    500 |
+-------+-----------------+-----------------+--------+

原始的重量级做法是配置一个简单的 Django 服务器,写一段配套代码,去展示。 而轻量一些的做法是将每一次的处理结果拷贝到 excel 表格中用表格去做统计分析。

如果每天都面对不同纬度的数据,每一次分析都要用无数次实验才能得到合理结果,你就会有想死的冲动了(不开玩笑,最近一直在研读《死亡美学》这本书,收获颇丰)。

最终我只好写个模块为自己续命,tablemap 肩上的重担很重呀。

如何获取

输入以下命令即可获得到最新版的模块。

wget https://raw.githubusercontent.com/rootkiter/easycode/master/tablemap.py

在文件的 __main__ 函数中有使用样例,方便记忆,也可以参考下面的说明来使用。

一个简单的样例

同把“大象装冰箱”一样简单的三步,创建一个表格 / 把内容装进去 / 输出表格,完活。

代码样例:

##  创建一个表格
from tablemap import *
tbmap = tablemap()
##  添加元素
tbmap.additem("title1",'item1',"Hello 1*1")
tbmap.additem("title2",'item1',"Hello 1*2 AAAAA")
tbmap.additem("title3",'item1','20')
tbmap.additem("title1",'item2',"Hello 2*1 BBBBB")
tbmap.additem("title2",'item2',"Hello 2*2")
tbmap.additem("title3",'item2','500')
##  表格输出
print tbmap.printMap()

通常来讲,步骤1步骤3 是死代码, 拿过来直接用即可,无需更改,只需要把精力放在填表即可,以上代码的运行结果效果图如下:

$ python test.py 
+-------+-----------------+-----------------+--------+
|       |      title1     |      title2     | title3 |
+-------+-----------------+-----------------+--------+
| item1 |       Hello 1*1 | Hello 1*2 AAAAA |     20 |
| item2 | Hello 2*1 BBBBB |       Hello 2*2 |    500 |
+-------+-----------------+-----------------+--------+

“列名部分”居中,“内容部分”右对齐,每一列的大小也由模块自动计算调整。 在第2步中,每一次指定了表格的一个内容元素,以及其对应的行名和列名,模块自动完成填表过程,对于未定义过的行列名,模块也可以自动处理,无需人为干预。

指定列展示

如果只想挑选某几列的内容进行内容展示,可以通过向 printMap() 传参的方式来控制。当我只需要对比 title1,title3 两列的结果时,调用方法如下:

##  Only title1, title3
print tbmap.printMap( ['title1','title3'] )

此时即可得到如下忽略 title2 的输出结果:

$ python test.py 
+-------+-----------------+--------+
|       |      title1     | title3 |
+-------+-----------------+--------+
| item1 |       Hello 1*1 |     20 |
| item2 | Hello 2*1 BBBBB |    500 |
+-------+-----------------+--------+

指定列展示顺序

列顺序还可以通过调整参数顺序来指定:

##  调整列顺序
print tbmap.printMap( ['title2','title3','title1'] )
+-------+-----------------+--------+-----------------+
|       |      title2     | title3 |      title1     |
+-------+-----------------+--------+-----------------+
| item1 | Hello 1*2 AAAAA |     20 |       Hello 1*1 |
| item2 |       Hello 2*2 |    500 | Hello 2*1 BBBBB |
+-------+-----------------+--------+-----------------+

对齐样式

观察列表内容不难发现,title3 这一列在右对齐下有比较好的展示效果, 而余下的两列展示效果欠佳,调整为右对齐会获得比较直观的结果,左对齐可以通过添加减号的方式来指定,样例如下:

##  将title1 列设置为左对齐,其他列不变
print tbmap.printMap( ['title2','title3','-title1'] )
$ python test.py 
+-------+-----------------+--------+-----------------+
|       |      title2     | title3 |     title1      |
+-------+-----------------+--------+-----------------+
| item1 | Hello 1*2 AAAAA |     20 | Hello 1*1       |
| item2 |       Hello 2*2 |    500 | Hello 2*1 BBBBB |
+-------+-----------------+--------+-----------------+

为表格命名

当表格数量过多时,需要对表格进行一个命名,以便区分表格, 在输出前为表格指定一个名字即可完成这一目标,代码样例如下:

##  为表格指定名字
tbmap.setTitle("Test Table")
print tbmap.printMap()
$ python test.py 
+----------------------------------------------------+
|                    *Test Table*                    |
+-------+-----------------+-----------------+--------+
|       |      title1     |      title2     | title3 |
+-------+-----------------+-----------------+--------+
| item1 |       Hello 1*1 | Hello 1*2 AAAAA |     20 |
| item2 | Hello 2*1 BBBBB |       Hello 2*2 |    500 |
+-------+-----------------+-----------------+--------+

十六进制输出

在逆向统计中,要经常验证提取出的数据内容,hexdump可以在大部分情况获得比较好的执行结果, 但总有一些情况,我希望能从代码中直接展示出来,hexmap就是这样一个模块,用法如下:

模块获取

wget https://raw.githubusercontent.com/rootkiter/easycode/master/hexmap.py

模块使用

from hexmap import *
Adata = "ABCDEFGHIJK\x11\x22\x33\x44\x55\x66"
print str(hexmap(Adata))

执行结果

$ python test.py
0x0000    41 42 43 44 45 46 47 48  49 4a 4b 11 22 33 44 55    ABCDEFGHIJK*"3DU
0x0010    66                                                  f               
-----> packet size :hex(0x11),ord(17) <-------

其他

在项目库中还有一个多线程参数更新的小模块,模块很小,只完成了随时更新线程的功能,感兴趣可以去看一下主函数中的样例,这里就不再细说了。

春暖花开,又到了博客长草的季节,今天碰巧是“国际除草日”,例行除草(没错,就是在一本正经地胡说八道)。

上周刚刚取得工具链搭建的阶段性胜利,目前 IoT 样本逆向工具链中的几个关键点都成功占坑,在后面的工作中要实际测试效果了。

如果碰巧效果比较符合预期,可能还会挑选几个低耦合的模块在这里介绍下。从已知资料来看这套工具的设计思路大概是前无古人的,其整体目标性很明确,且模块间功能互补,希望它们能辅助一波 IoT 的僵尸网络追踪。

TAGS : [ 技术相关 Python 数据分析 ]