python可以使用ctypes库调用c++编译的so库函数
0x01 c/c++编译为so库文件
编译C文件
gcc -o libpycallfoo.so -shared -fPIC rsa.c
编译C++文件
g++ -o libcallfoo.so -shared -fPIC rsa.cpp
对于cpp文件需要用extern "C"{} 把main括起来 ,否则有可能报错
1 extern "C"{ 2 int foo(int len,char *p,char* ret) 3 { 4 __int64 a1 = 0x36; 5 __int64 a2 = 0x100; 6 __int64 a3 = 0xb5547; 7 8 int j; 9 char xz[100]={}; 10 memcpy(xz,p,len); 11 printf("your input is %s,len xz=%d ",xz,strlen(xz)); 12 13 int* pResult = new int[100];//密文 14 int i; 15 for(i = 0; i < strlen(xz); i++) 16 { 17 int result1 = rsa_mod(xz[i],0,0x101,0,0xb5547,0); 18 pResult[i] = swapEndian(result1); 19 //printf("0x%04X ",pResult[i]); 20 } 21 memcpy((char *)ret,(char *)pResult,4*strlen(xz)); 22 return 0; 23 } 24 }
0x02 ctypes调用so
入参使用ctypes.c_char_p创建,出参需要使用ctypes.create_string_buffer创建内存,否则so中的内存在用完就释放了,无法传出来
1 import ctypes 2 3 def callfoo(str_in): 4 #print 'input: %s' %str_in 5 #调用库 6 input = ctypes.c_char_p() #对应c指针类型 char *p 7 input.value=str_in #字符串赋值 8 ll = ctypes.cdll.LoadLibrary 9 lib = ll("./libcallfoo.so") #调用so 10 p=ctypes.create_string_buffer(4*len(str_in)) #申请出参的内存大小 11 lib.foo(len(str_in), input, p) 12 print p.raw #出参的访问方式 13