最近看到Shellcode文章,手癢把它改相容64bit Ubuntu及32bit cygwin 了。
由此下載原始碼修改過smc.py
Ubuntu 11.10 (GNU/Linux 3.0.0-12-virtual x86_64)
使用Python 2.7.2+,進行測試
Linux pylab 3.0.0-12-virtual #20-Ubuntu SMP Fri Oct 7 18:19:02 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux # python smc.py linux2_add64(99, 1) = 100 |
Linux xubuntu 2.6.35-32-generic #65-Ubuntu SMP i686 GNU/Linux
使用Python 2.6.6,進行測試
$ python smc.py linux2_add32(99, 1) = 100 |
Windows XP+cygwin+gcc(4.5.3) + python 2.7.2
使用dump_machine_code.sh, ASM 的結果:
add.o: file format pe-i386 Disassembly of section .text: 00000000 <_add>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 45 0c mov 0xc(%ebp),%eax 6: 03 45 08 add 0x8(%ebp),%eax 9: 5d pop %ebp a: c3 ret b: 90 nop |
$ python smc.py cygwin_add32(99, 1) = 100 |
載入平台相依的libc
if sys.platform == "cygwin":
libc = cdll.LoadLibrary("/bin/cygwin1.dll")
else:
libc = CDLL('libc.so.6')
判斷32或64位元的方法之一
import sys from math import log def is64bit(): return log(sys.maxsize, 2) == 63 |
小結
這技巧可以使用smc主程式,隨意在執行時修改程式碼的方法,也提供一條路讓python直接與硬體溝通。
如這是一個24小時不能停機的程式,意味著筆者可利用這方法做出不需要重新執行python主程式來動態載入修改過的函式庫。
當然這種方法也會影響Python 跨平台的可攜性,
解決方法只能為各種所需執行平台編繹對應的版本(若其平台安裝有gcc,則可以在執行檢查有無對應的platform_func.o 檔案,動態產生並載入它,類似pyc的做法)。
沒有留言:
張貼留言