Tag: ctypes

ctypes:投射字符串function?

我正在阅读文章在笔测试期间躲避反病毒的提示,并对给定的Python程序感到惊讶: from ctypes import * shellcode = ‘\xfc\xe8\x89\x00\x00….’ memorywithshell = create_string_buffer(shellcode, len(shellcode)) shell = cast(memorywithshell, CFUNCTYPE(c_void_p)) shell() shellcode缩短了。 有人可以解释发生了什么吗? 我熟悉Python和C,我尝试过阅读ctypes模块,但还有两个主要问题: 什么存储在shellcode ? 我知道这与C有关(在文章中它是来自Metasploit的shellcode,并且选择了不同的ASCII符号),但是我无法确定它是否是C源(可能不是)或源自某种编译(哪一个?)。 根据第一个问题,演员阵容中发生了什么?

Python将32位指针地址传递给C函数

我想在Python脚本的共享库中调用我的C函数。 传递指针时出现问题,64位地址似乎被截断为被调用函数内的32位地址。 Python和我的库都是64位。 下面的示例代码演示了该问题。 Python脚本打印传递给C函数的数据的地址。 然后,从被调用的C函数内打印接收的地址。 此外,C函数通过打印本地创建内存的大小和地址来certificate它是64位。 如果以任何其他方式使用指针,则结果是段错误。 的CMakeLists.txt cmake_minimum_required (VERSION 2.6) add_library(plate MODULE plate.c) plate.c #include #include void plate(float *in, float *out, int cnt) { void *ptr = malloc(1024); fprintf(stderr, “passed address: %p\n”, in); fprintf(stderr, “local pointer size: %lu\n local pointer address: %p\n”, sizeof(void *), ptr); free(ptr); } test_plate.py import numpy import scipy import […]

python在哪里查找由ctypes.cdll打开的dll。在Windows上的?

我是无法在互联网上找不到一个简单的答案,所以也许将来有一个因为这个问题! 我正在使用pywiiuse,一个用于Windows上的C wiiuse库的python包装器。 通过在源代码目录中包含dll,header和library,我得到了几个简单的C示例。 但是,我想知道在哪里放dll以便pywiiuse会找到它。 查看源代码显示它按如下方式加载: dll = ctypes.cdll.wiiuse 当我在与测试示例相同的目录中使用dll时,运行示例会产生模块未找到exception。 python在哪里寻找DLL?

Python使用ctypes传递char *数组并填充结果

我正在尝试使用ctypes在python中创建一个char *数组,以传递给库以填充字符串。 我期待4个字符串的长度不超过7个字符。 我的py代码看起来像这样 testlib.py from ctypes import * primesmile = CDLL(“/primesmile/lib.so”) getAllNodeNames = primesmile.getAllNodeNames getAllNodeNames.argtypes = [POINTER(c_char_p)] results = (c_char_p * 4)(addressof(create_string_buffer(7))) err = getAllNodeNames(results) lib.cpp void getAllNodeNames(char **array){ DSL_idArray nodes; //this object returns const char * when iterated over network.GetAllNodeIds(nodes); for(int i = 0; i < (nodes.NumItems()); i++){ strcpy(array[i],nodes[i]); } } 当我尝试运行此代码时,我不断收到分段错误。 我已经从C创建了一个完美的测试但是在Python中我必须正确设置指针数组或其他东西。 […]

什么(~0L)是什么意思?

我正在做一些X11 ctypes编码,我不知道C但需要一些帮助来理解这一点。 在下面的C代码中(可能是C ++我不确定)我们看到(~0L)这是什么意思? 在Javascript和Python中~0表示-1 。 812 int result = GetProperty(window, property_name, 813 (~0L), // (all of them) 814 &type, &format, &num_items, &properties); 谢谢

通过readinto()将二进制数据解析为ctypes结构对象

我正在尝试处理二进制格式,遵循以下示例: http://dabeaz.blogspot.jp/2009/08/python-binary-io-handling.html >>> from ctypes import * >>> class Point(Structure): >>> _fields_ = [ (‘x’,c_double), (‘y’,c_double), (‘z’,c_double) ] >>> >>> g = open(“foo”,”rb”) # point structure data >>> q = Point() >>> g.readinto(q) 24 >>> qx 2.0 我已经定义了我的标题的结构,我正在尝试将数据读入我的结构,但我遇到了一些困难。 我的结构是这样的: class BinaryHeader(BigEndianStructure): _fields_ = [ (“sequence_number_4bytes”, c_uint), (“ascii_text_32bytes”, c_char), (“timestamp_4bytes”, c_uint), (“more_funky_numbers_7bytes”, c_uint, 56), (“some_flags_1byte”, c_byte), […]

在Python中调用C函数并返回2个值

我试图弄清楚如何从我在python中调用的C函数返回2个值。 我已经在线阅读了材料,并使用struct输出两个变量。 当我在同一个C文件中调用此函数时,我能够输出变量。 但是,当我尝试在python中调用它时,它仍然只返回一个值。 这是我的C代码: struct re_val { double predict_label; double prob_estimates; }; struct re_val c_func(const char* dir, double a, double b, double c, double d ) { double x[] = {a,b,c,d}; printf (“x[0].index: %d \n”, 1); printf (“x[0].value: %f \n”, x[0]); printf (“x[1].index: %d \n”, 2); printf (“x[1].value: %f \n”, x[1]); printf (“x[2].index: %d […]

Python ctypes:在c中调用具有自定义类型的函数

我正在尝试将预先存在的c代码包装在Linux中用于Python。 我对c的经验不多,而且我正在使用ctypes解决这个问题。 我的C函数需要一个带有自定义类型条目的二维数组,我不知道如何在python中重新创建它以将其传递给c函数。 这是我试图调用的函数: void usbBuildGainTableAI_USB1808(libusb_device_handle *udev, Calibration_AIN table[NCHAN_1808][NGAINS_1808]) { int i, j; uint16_t address = 0x7000; // base address of ADC calibration coefficients. for (i = 0; i < NCHAN_1808; i++) { for (j = 0; j < NGAINS_1808; j++) { usbMemAddressW_USB1808(udev, address); usbMemoryR_USB1808(udev, (uint8_t *) &table[i][j].slope, sizeof(float)); address += 4; usbMemAddressW_USB1808(udev, address); usbMemoryR_USB1808(udev, […]

从DLL返回的char 转换为Python字符串

我试图将C样式const char []字符串指针(从DLL返回)转换为Python兼容的字符串类型。 但是当Python27执行时: import ctypes charPtr = ctypes.cast( “HiThere”, ctypes.c_char_p ) print( “charPtr = “, charPtr ) 我们得到: charPtr = c_char_p(‘HiThere’) 也许某些事情无法正确评估。 我的问题是: 应该如何将此charPtr转换为兼容Python的可打印字符串? 是刚才提到的演员操作应该做什么?

用ctypes从python调用c:传递向量

我想使用ctypes从python调用ac函数。 从文档中我不明白如何将指针传递给向量。 我要调用的函数是: double f(int n, double* x) { int i; double p=1; for (i=0; i< n; i ++) p = p * x[i]; return p; } 我用void指针修改了函数,因此它变为f(int, void*) ,内部强制转换为double。 我做了以下事情: def f(x): n = len(x) libc = ‘/path/to/lib.so’ cn = c_int(n) px = pointer(x) cx = c_void_p(px) libc.restype = c_double L = libc.f(cn, cx) […]