逆向学习之pyc分析

2017-12-09  本文已影响0人  苏州暮雨

pyc是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高,而且还可以实现源码隐藏,以及一定程度上的反编译。比如,Python3.3编译生成的.pyc文件,Python3.4就别想着去运行啦!一般来说import 别的 py 文件时,那个 py 文件会被存一份 pyc 加速下次装载。

pyc反编译恢复到python代码,通过uncompyle6包就可以实现,在线的反编译工具也靠很方便,pyo文件也属于py编译的中间文件,所以也可以通过以上方式实现反编译,但是需要注意的是:有些时候需要满足后缀名是满足pyd,pyc,pyd的。但现在反编译得到的python的代码中一般不是完整的,或增加防护,或者有一些加密修改,又或者利用一些函数复杂嵌套,例如lambda函数的嵌套使用,使得python的代码变得比较难读。

lambda是一个匿名函数,表示一种运算,lambda [ arg1 [arg2, arg3, … argN] ] : expression

例如:

map(lambda x : x*x, [y for y in range(10)])

lambda后写的事函数变量x以及对x的操作,逗号之后表示x取值的方式。另外一种写法类似与如下表示,使用括号来分割各个部分:

map( (lambda (x)(x*x)) (list 2 3 4) )

还有类似与下图的式子,定义了一个参数为x的函数g,返回值是一个lambda函数,在lambda函数里,对x和y的大小进行比较并返回一个布尔值。使用((g  (2))3)就可以实现返回3与2比较的布尔结果。

嵌套lambda还可以写成(lambdaN:(lambdax:N>x))(2)(3)类似的函数,第一个2是N的表示,3是x。

lambda : [ (fout.write(sssss), (fout.close(), None)[1])[1] for None in [open('key.enc', 'wb+')] ][0]

上面的语句中使用for None in XXX,相当于fout=open('key.enc', 'wb+')。

(getattr(__old, '__ior__', (lambda other: NotImplemented))value

上面的语句则是使用getattr函数来实现或运算的函数功能。

另外在一些lambda函数中也可能使用数组来表示一个变量的名字对应使用变量的内容,如:

__l['data'][__l['i']]表示的是data[i]的值,其中__l是符号表的集合。编译过程中会将一些变量存在符号表中,通过符号表索引到对应的地址和值。__l['i'][0]就是对应的值。

但是这些还不够,尝试分析一下:((lambda x: x(x)),)((lambda y: (f,)((lambda : y(y)()))))函数是在干什么。。。。还是不会。

上一篇下一篇

猜你喜欢

热点阅读