在《PyAsm-在python中嵌入汇编》我只是对PyAsm做了介绍,但是官方只有python24的安装包,虽然提供了源码,不过需要装 vs2003才能安装。另外,在文章里提到了一个小bug,这几天有空就研究了一下PyAsm的源码,终于找到了bug的位置,直接通过pyasm写大段 代码时,x86asm.py中的dispatchStatement是处理pyasm中大段汇编的代码,其中调用了AddInstruction来处理汇 编指令,但在AddInstruction没有添加过程头,所以就导致bug。我改了一下,把AddInstruction换成了AI,AI跟 AddInstruction一样的功能,只不过AI在第一次被调用的时候会添加过程头。
另外,还有一个问题就是INT3 和INT 3的区别。INT3是CC断点,而INT 3 则是3号中断,不一样。但是作者在处理指令的时候似乎还没想到什么好的办法来匹配INT3这中包含数字的指令。所以,如果要使用CC断点,只好修改一下代 码,只能用INTC替代INT3,另外我也注意到代码中的INT0实际上是INTO(字母O)。
在Python25中使用还需要修改一处位置,下边的patch给出了,将python24改成python25即可。
最后,关于excmem模块,自己编译一下就OK了。然后把pyasm文件夹拷贝到$PYTHON/Lib/site-packages/目录中即可。
好了,终于了却了心愿,希望修改没有引入其他的bug。
=== modified file 'x86asm.py'
--- x86asm.py 2008-12-08 08:33:16 +0000
+++ x86asm.py 2008-12-08 08:36:40 +0000
@@ -483,7 +483,7 @@
def dispatchStatement(self,s):
- self.AddInstruction(s)
+ self.AI(s)
def DispatchString(self,s):
s = s.strip()
@@ -557,4 +557,4 @@
a.AI("MOV y,12")
a.EP()
- a.Compile()
/ No newline at end of file
+ a.Compile()
=== modified file 'x86cpToMemory.py'
--- x86cpToMemory.py 2008-12-08 08:33:16 +0000
+++ x86cpToMemory.py 2008-12-08 08:34:44 +0000
@@ -12,7 +12,7 @@
if sys.platform == 'win32':
import win32api, pywintypes
from sys import dllhandle
- python24Handle = win32api.GetModuleHandle("python24")
+ python24Handle = win32api.GetModuleHandle("python25")
def runtimeResolve(funcName):
try:
=== modified file 'x86inst.py'
--- x86inst.py 2008-12-08 08:33:16 +0000
+++ x86inst.py 2008-12-08 08:42:34 +0000
@@ -702,7 +702,7 @@
i("3B /r", "CMP r16,r/m16", "Compare r/m16 with r16.")
i("3B /r", "CMP r32,r/m32", "Compare r/m32 with r32.")
-#i("CC", "INT 3", "Interrupt 3 - trap to debugger.")
+i("CC", "INTC", "Interrupt 3 - trap to debugger.")
i("CD ib", "INT imm8", "Interrupt vector number specified by immediate byte.")
i("CE", "INTO", "Interrupt 4 - if overflow flag is 1.")
1 # -*- coding:utf-8 -*-
2 # file: testsum.py
3 # by: bluebanboom 0(0
4 # mail: bluebanboom@gmail.com ~
5 # date: 2008-12-08
6 # note:
7 from pyasm import pyasm
8 def main():
9 pyasm(globals(),r"""
10 !CHARS hello_str 'Hello world!/n/0'
11 !CHARS in_fmt 'ii/0'
12 !CHARS out_fmt 'i/0'
13
14 !PROC sum PYTHON
15 !ARG self
16 !ARG args
17 !LOCAL x
18 !LOCAL y
19 LEA EAX, x
20 PUSH EAX
21 LEA EAX, y
22 PUSH EAX
23 PUSH in_fmt
24 PUSH args
25 CALL PyArg_ParseTuple
26 ADD ESP, 0xC
27 MOV EAX, x
28 MOV EBX, y
29 ADD EAX, EBX
30 PUSH EAX
31 PUSH out_fmt
32 CALL Py_BuildValue
33 ADD ESP, 0x8
34 !ENDPROC
35 """)
36 print sum(5, 2)
37 print sum(2, 2)
38
39 if __name__ == "__main__":
40 main()
41
关于PyAsm在Windows下的安装使用及bug修复
最新推荐文章于 2024-06-09 09:35:06 发布