很多同学其实不太了解,在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、后面的话
反汇编不是洪水猛兽,多看看都能学得会、用得好,个人觉得用它来调试、分析还是很有好处的。