免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5823 | 回复: 8
打印 上一主题 下一主题

求助,数据的类型不一致 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-06 16:53 |只看该作者 |倒序浏览
my_debugger_defines.py
  1. #coding=utf-8
  2. '''
  3. Created on 2011-6-5

  4. @author: L-K
  5. '''

  6. from ctypes import *

  7. # 为ctypes变量创建符合匈牙利命名风格的匿名,这样可以使代码更接近Win32风格
  8. WORD    = c_ushort
  9. DWORD   = POINTER(c_ubyte)
  10. LPBYTE  = POINTER(c_char)
  11. HANDLE  = c_void_p

  12. # 常值定义
  13. DEBUG_PROCESS       = 0x00000001
  14. CREATE_NEW_CONSOLE  = 0x00000010

  15. # 定义函数CreateProcessA()所需结构体
  16. # CreateProcessA()函数介绍在P25
  17. class STARTUPINFO(Structure):
  18.     _fields_ = [
  19.         ("cb",              DWORD),     # 结构体本身的大小
  20.         ("lpReserved",      LPBYTE),
  21.         ("lpDesktop",       LPBYTE),
  22.         ("lpTitle",         LPBYTE),
  23.         ("dwX",             DWORD),
  24.         ("dwY",             DWORD),
  25.         ("dwXSize",         DWORD),
  26.         ("dwYSize",         DWORD),
  27.         ("dwXCountChars",   DWORD),
  28.         ("dwYCountChars",   DWORD),
  29.         ("dwFillAttribute", DWORD),
  30.         ("dwFlags",         DWORD),
  31.         ("wShowWindow",     WORD),
  32.         ("cbReserved2",     WORD),
  33.         ("lpReserved2",     LPBYTE),
  34.         ("hStdInput",       HANDLE),
  35.         ("hStdOutput",      HANDLE),
  36.         ("hStdError",       HANDLE),
  37.         ]
  38. class PROCESS_INFORMATION(Structure):
  39.     _fields_ = [
  40.         ("hProcess",        HANDLE),
  41.         ("hThread",         HANDLE),
  42.         ("dwProcessId",     DWORD),
  43.         ("dwThreadId",      DWORD),
  44.         ]
复制代码
my_debugger.py:
  1. #coding=utf-8
  2. '''
  3. Created on 2011-6-5

  4. @author: L-K
  5. '''
  6. from ctypes import *
  7. from my_debugger_defines import *

  8. kernel32 = windll.kernel32

  9. class debugger():
  10.     def __init__(self):
  11.         pass
  12.    
  13.     def load(self, path_to_exe):
  14.         # 参数dwCreationFlags种的标志位控制着进程的创建方式。你若希望新创建的进程独占一个新的控制台窗口,而不是与父进程共用一个控制台,你可以加上标志位CREATE_NEW_CONSOLE
  15.         creation_flags = DEBUG_PROCESS
  16.         
  17.         # 实例化之前的结构体
  18.         startupinfo         = STARTUPINFO()
  19.         process_information = PROCESS_INFORMATION()
  20.         
  21.         # 在以下两个成员变量的共同作用下,新建进程将在一个单独的窗体中被显示,你可以通过改变结构体STARTUPINFO中各成员变量的值来控制debugg进程的行为
  22.         startupinfo.dwFlags     = 0x1
  23.         startupinfo.wShowWindow = 0x0
  24.         
  25.         # 设置结构体STARTUPINFO中的成员变量cb的值,用以表示结构体本身的大小
  26.         startupinfo.cb = sizeof(startupinfo)
  27.         
  28.         if kernel32.CreateProcessA(path_to_exe, None, creation_flags, None, None, byref(startupinfo), byref(process_information)):
  29.             print "[*] We have successfully launched the process!"
  30.             print "[*] PID: %d" % process_information.dwProcessID
  31.         else:
  32.             print "[*] Error: 0x%08x." % kernel32.GetLastError()
复制代码
my_test.py:
  1. #coding=utf-8
  2. '''
  3. Created on 2011-6-5

  4. @author: L-K
  5. '''
  6. import my_debugger

  7. debugger = my_debugger.debugger()

  8. debugger.load("C:\\WINDOWS\\system32\\calc.exe")
复制代码
这是个简单的调试器的初步,就是通过CreatProcess函数执行一个程序作为调试器进程的子进程,打印出子进程的PID然后就退出。

执行后出现错误:
  1. Traceback (most recent call last):
  2.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_test.py", line 11, in <module>
  3.     debugger.load("C:\\WINDOWS\\system32\\calc.exe")
  4.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_debugger.py", line 28, in load
  5.     startupinfo.dwFlags     = 0x1
  6. TypeError: expected LP_c_ubyte instance, got int
复制代码
求解,哪里错了。

刚接触python不久,不了解。

请问这个东西是这个函数特有的还是这个模块特有的,在Python参考手册能查到不?我暂时没查到。

论坛徽章:
0
2 [报告]
发表于 2011-06-06 16:56 |只看该作者
还有第一个源码中的:
  1.         ("lpReserved",      LPBYTE),

  2.         ("lpDesktop",       LPBYTE),

  3.         ("lpTitle",         LPBYTE),
复制代码
也是错的,应该是:
  1.         ("lpReserved",      LPTSTR),
  2.         ("lpDesktop",       LPTSTR),  
  3.         ("lpTitle",         LPTSTR),
复制代码
我百度又谷歌了,后面那个字段应该是LPTSTR,书上也是这样的,没错,但是执行后说:
  1. Traceback (most recent call last):
  2.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_test.py", line 7, in <module>
  3.     import my_debugger
  4.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_debugger.py", line 8, in <module>
  5.     from my_debugger_defines import *
  6.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_debugger_defines.py", line 22, in <module>
  7.     class STARTUPINFO(Structure):
  8.   File "C:\Users\lucifer\eclipse\GrayHatPython\src\my_debugger_defines.py", line 25, in STARTUPINFO
  9.     ("lpReserved",      LPTSTR),
  10. NameError: name 'LPTSTR' is not defined
复制代码
我用的是Python2.5,书上的就是这个版本的,还有用了eclipse+pydev在win7下写这个东西。

论坛徽章:
0
3 [报告]
发表于 2011-06-06 19:16 |只看该作者
回复 1# 小锐同学1
DWORD   = POINTER(c_ubyte)
.....
startupinfo.dwFlags     = 0x1
...
小锐同学1 发表于 2011-06-06 16:53
[url=http://bbs.chinaunix.net/redirect.php?
goto=findpost&pid=15723665&ptid=2329248][img]
[/img][/url]

startupinfo.dwFlags  = DWORD(c_ubyte(0x1))。
其实win的一些数据类型 ctypes已经定义好了,
不需要自己搞 from ctypes.wintypes import DWORD,这样你就可以写startupinfo.dwFlags  = 0x1了。

论坛徽章:
0
4 [报告]
发表于 2011-06-07 10:03 |只看该作者
回复 3# 106033177


    还是不行呢。

我把那两句话改成:
  1.         # 在以下两个成员变量的共同作用下,新建进程将在一个单独的窗体中被显示,你可以通过改变结构体STARTUPINFO中各成员变量的值来控制debugg进程的行为
  2.         startupinfo.dwFlags  = DWORD(c_ubyte(0x1))
  3.         startupinfo.wShowWindow = DWORD(c_ubyte(0x0))
复制代码
但是依旧出错了:
  1. Traceback (most recent call last):
  2.   File "C:\Users\lucifer\eclipse\GrayHatPython2\src\my_test.py", line 11, in <module>
  3.     debugger.load("C:\\WINDOWS\\system32\\calc.exe")
  4.   File "C:\Users\lucifer\eclipse\GrayHatPython2\src\my_debugger.py", line 27, in load
  5.     startupinfo.dwFlags  = DWORD(c_ubyte(0x1))
  6. TypeError: int expected instead of c_ubyte instance
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-06-07 10:41 |只看该作者
最佳的方式是在Linux下运行python,window下总是报错,而且错误还找不到,我试过n次了

论坛徽章:
0
6 [报告]
发表于 2011-06-07 10:57 |只看该作者
本帖最后由 小锐同学1 于 2011-06-07 10:59 编辑

之后再尝试:
  1.         # 在以下两个成员变量的共同作用下,新建进程将在一个单独的窗体中被显示,你可以通过改变结构体STARTUPINFO中各成员变量的值来控制debugg进程的行为
  2.         startupinfo.dwFlags  = DWORD(0x1)
  3.         startupinfo.wShowWindow = DWORD(0x0)
复制代码
或者
  1.         # 在以下两个成员变量的共同作用下,新建进程将在一个单独的窗体中被显示,你可以通过改变结构体STARTUPINFO中各成员变量的值来控制debugg进程的行为
  2.         startupinfo.dwFlags  = c_ulong(0x1)
  3.         startupinfo.wShowWindow = c_ulong(0x0)
复制代码
都提示:
  1. Traceback (most recent call last):
  2.   File "C:\Users\lucifer\eclipse\GrayHatPython2\src\my_test.py", line 11, in <module>
  3.     debugger.load("C:\\WINDOWS\\system32\\calc.exe")
  4.   File "C:\Users\lucifer\eclipse\GrayHatPython2\src\my_debugger.py", line 32, in load
  5.     startupinfo.wShowWindow = DWORD(0x0)
  6. TypeError: incompatible types, c_ulong instance instead of c_ushort instance
复制代码
其实我不知道我改的东西到底是什么意思,我只是凭以前敲代码的感觉去改的。

论坛徽章:
0
7 [报告]
发表于 2011-06-07 10:58 |只看该作者
回复 5# wuyinting


    哥,这下被你吓到了

我买的这本书是windows平台的逆向工程,用python语言来搞的。

论坛徽章:
0
8 [报告]
发表于 2011-06-07 16:02 |只看该作者
回复 1# 小锐同学1
gray hat?
类型定义应该是这样的
WORD    = c_ushort
DWORD   = c_ulong
LPBYTE=POINTER(c_ubyte)
LPSTR  = POINTER(c_char)
HANDLE  = c_void_p

论坛徽章:
0
9 [报告]
发表于 2011-06-07 16:52 |只看该作者
回复 8# 106033177


    哥,你的回复让我无地自容。

我错了。

我不该犯这么低级的错误。

抱歉,浪费你的时间了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP