Python 汇编字节码-PyCode新

Python 汇编字节码-PyCode新,python,Python,以下代码将字节码输出为字符串。我想替换一些字节码行,重新组装并执行它。我需要像字节码assember这样的东西吗?或者我可以用PyCode New这样做吗 输出 ********** code ********** type: <type 'str'>

以下代码将字节码输出为字符串。我想替换一些字节码行,重新组装并执行它。我需要像字节码assember这样的东西吗?或者我可以用PyCode New这样做吗

输出

**********      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