0
点赞
收藏
分享

微信扫一扫

python编程(反汇编)


    很多同学其实不太了解,在python语言下面其实也是可以反汇编调试的。比如说一般的代码,其实只要添加dis库,就可以看到反汇编代码了。

1、反汇编的方法

    要查看反汇编后的代码,其实很简单,参数为某一个函数名或者类名,

import dis
dis.dis(dead_loop)

2、死循环的反汇编代码

    我们从dead loop开始,看看deadloop的反汇编代码是什么样子的,假设代码是这样的,

def dead_loop():
while True:
print 'hello, world'

    那么,dis.dis(dead_loop)的效果如下所示。内容本身不复杂,大家可以好好读一读,

feixiaoxingdeMacBook-Pro-4:Desktop feixiaoxing$ python test.py 
4 0 SETUP_LOOP 15 (to 18)
>> 3 LOAD_GLOBAL 0 (True)
6 POP_JUMP_IF_FALSE 17

5 9 LOAD_CONST 1 ('hello, world')
12 PRINT_ITEM
13 PRINT_NEWLINE
14 JUMP_ABSOLUTE 3
>> 17 POP_BLOCK
>> 18 LOAD_CONST 0 (None)
21 RETURN_VALUE

3、简单遍历的反汇编代码

    看过了dead loop,我们换一个for循环看看。假设代码是这样的,

def loop():
for i in range(10):
print i

    那么反汇编后呢?

feixiaoxingdeMacBook-Pro-4:Desktop feixiaoxing$ python test.py 
8 0 SETUP_LOOP 25 (to 28)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (10)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 11 (to 27)
16 STORE_FAST 0 (i)

9 19 LOAD_FAST 0 (i)
22 PRINT_ITEM
23 PRINT_NEWLINE
24 JUMP_ABSOLUTE 13
>> 27 POP_BLOCK
>> 28 LOAD_CONST 0 (None)
31 RETURN_VALUE

4、if-else的反汇编代码

    看完了循环代码,我们找一个if-else函数看看,假设代码是这样的,

def choose(data):
if 10 < data:
print 'big'
else:
print 'small'

    有了上面的经验之后,相信choose函数的反汇编代码也不会太难,

feixiaoxingdeMacBook-Pro-4:Desktop feixiaoxing$ python test.py 
12 0 LOAD_CONST 1 (10)
3 LOAD_FAST 0 (data)
6 COMPARE_OP 0 (<)
9 POP_JUMP_IF_FALSE 20

13 12 LOAD_CONST 2 ('big')
15 PRINT_ITEM
16 PRINT_NEWLINE
17 JUMP_FORWARD 5 (to 25)

15 >> 20 LOAD_CONST 3 ('small')
23 PRINT_ITEM
24 PRINT_NEWLINE
>> 25 LOAD_CONST 0 (None)
28 RETURN_VALUE

5、简单类代码

    说了那么多函数,下面我们可以找个类代码看看,

class A():
def __init__(self):
pass
def __del__(self):
pass

    这个类代码是不是很简单。相信汇编代码也不会难到哪里去,

feixiaoxingdeMacBook-Pro-4:Desktop feixiaoxing$ python test.py 
Disassembly of __del__:
21 0 LOAD_CONST 0 (None)
3 RETURN_VALUE

Disassembly of __init__:
19 0 LOAD_CONST 0 (None)
3 RETURN_VALUE

6、继承类的反汇编

    说完了类,我们来看看继承类代码,

class A():
def __init__(self):
pass
def __del__(self):
pass

class B(A):
def __init__(self):
A.__init__(self)

    为了方便,我们挑选了最简单的继承类。大家看看这个继承类的反汇编如何?

feixiaoxingdeMacBook-Pro-4:Desktop feixiaoxing$ python test.py 
Disassembly of __init__:
25 0 LOAD_GLOBAL 0 (A)
3 LOAD_ATTR 1 (__init__)
6 LOAD_FAST 0 (self)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE

7、后面的话

    反汇编不是洪水猛兽,多看看都能学得会、用得好,个人觉得用它来调试、分析还是很有好处的。


举报

相关推荐

0 条评论