Python 汇编字节码-PyCode新
以下代码将字节码输出为字符串。我想替换一些字节码行,重新组装并执行它。我需要像字节码assember这样的东西吗?或者我可以用PyCode New这样做吗 输出Python 汇编字节码-PyCode新,python,Python,以下代码将字节码输出为字符串。我想替换一些字节码行,重新组装并执行它。我需要像字节码assember这样的东西吗?或者我可以用PyCode New这样做吗 输出 ********** code ********** type: <type 'str'>
********** code **********
type: <type 'str'>
def test(a,b):
return a*b
test(2,3)
********** compiles into the bytecode **********
type: <type 'code'>
1 0 LOAD_CONST 0 (<code object test at 0x101d1ca30, file "<string>", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (test)
3 9 LOAD_NAME 0 (test)
12 LOAD_CONST 1 (2)
15 LOAD_CONST 2 (3)
18 CALL_FUNCTION 2
21 POP_TOP
22 LOAD_CONST 3 (None)
25 RETURN_VALUE 3
********** bytecode **********
'd\x00\x00\x84\x00\x00Z\x00\x00e\x00\x00d\x01\x00d\x02\x00\x83\x02\x00\x01d\x03\x00S'
**********代码**********
类型:
def测试(a、b):
返回a*b
测试(2,3)
**********编译成字节码*******
类型:
1 0加载常量0(<0x101d1ca30处的代码对象测试,文件“字符串”,第1行>)
3生成函数0
6存储单元名称0(测试)
3 9加载单元名称0(测试)
12荷载常数1(2)
15荷载常数2(3)
18调用函数2
21件流行上衣
22负载常数3(无)
25返回值3
**********字节码**********
'd\x00\x00\x84\x00\x00Z\x00\x00e\x00\x00d\x01\x00d\x02\x00\x83\x02\x00\x01d\x03\x00S'
代码
导入dis
导入系统
进口检验
引进新产品
班级编剧:
定义初始化(自):
self.s=“”
def写入(自身、文本):
#打印“:”,文本
self.s+=文本
#保存stdout
origstdout=sys.stdout
w=编写器()
sys.stdout=w
s=“def测试(a,b):\n\t返回a*b\n测试(2,3)”
c=编译,,“执行”
#dis调用标准输出,所以输出是w
字节码=dis.dis(c)
sys.stdout=origstdout
def h(x):
打印'*'*10+'\t'+x+'\t'+'*'*10+'\n'*1
h(‘代码’)
打印“类型:”+str(类型))
打印s+“\n”
h('编译成字节码')
打印“类型:”+str(类型(c))
打印w.s
h(‘字节码’)
打印报告(c.co_代码)
Byteplay是python代码对象的一个很好的包装器。它有自己的代码类。代码对象是特定于CPython且更复杂的。要开始,最好先玩byteplay
from byteplay import *
def foo():
x = 10
print 'inside ',x
return 42
c = Code.from_code(foo.func_code)
print c.code
ret = foo()
print 'outside: ',ret
c.code[10] = (LOAD_CONST,1000)
foo.func_code = c.to_code()
print '*'*20
print c.code
ret = foo()
print 'outside: ',ret
产生
4 1 LOAD_CONST 10
2 STORE_FAST x
5 4 LOAD_CONST 'inside '
5 PRINT_ITEM
6 LOAD_FAST x
7 PRINT_ITEM
8 PRINT_NEWLINE
6 10 LOAD_CONST 42
11 RETURN_VALUE
inside 10
outside: 42
********************
4 1 LOAD_CONST 10
2 STORE_FAST x
5 4 LOAD_CONST 'inside '
5 PRINT_ITEM
6 LOAD_FAST x
7 PRINT_ITEM
8 PRINT_NEWLINE
6 10 LOAD_CONST 1000
11 RETURN_VALUE
inside 10
outside: 1000
我也看到过其他答案,比如人们在根本不使用PyCode的情况下修改字节码,这可能会对您有所帮助。注意esp的
add_self()
功能。
4 1 LOAD_CONST 10
2 STORE_FAST x
5 4 LOAD_CONST 'inside '
5 PRINT_ITEM
6 LOAD_FAST x
7 PRINT_ITEM
8 PRINT_NEWLINE
6 10 LOAD_CONST 42
11 RETURN_VALUE
inside 10
outside: 42
********************
4 1 LOAD_CONST 10
2 STORE_FAST x
5 4 LOAD_CONST 'inside '
5 PRINT_ITEM
6 LOAD_FAST x
7 PRINT_ITEM
8 PRINT_NEWLINE
6 10 LOAD_CONST 1000
11 RETURN_VALUE
inside 10
outside: 1000