pythonlinux反编译so
① python文件后缀是什么
python文件后缀总结:
(1).py:这通常是您编写的输入源代码。
(2).py3:Python3脚本(Python3脚本通常以.py而不是.py3结尾,很少使用)。
(3).pyc:这是编译好的字节码。如果导入一个模块,python将生成一个*.pyc包含字节码的文件,以便再次导入它更容易(也更快)。
.pyc二进制文件可以反编译成.py文件,反编译软件叫Easy Python Decompiler。
(4).pyo:这是在优化(-O)时创建的*.pyc文件,从Python3.5开始,Python将只使用.pyc而不是.pyo和.pyc。
(5).pyd:这基本上是一个Windows DLL文件。
(6).pyi:MyPy存根,存根文件(PEP 484)。
(7).pyw:用pythonw.exe执行的Windows的Python脚本。
(8).pyx:将Cython src转换为C/C++。
(9).pyz:Python脚本归档(PEP 441)(这是一个包含标准Python脚本头之后的二进制形式的压缩Python脚本(ZIP)的脚本)。
(10).pywz:用于MS-Windows的Python脚本归档(PEP 441)(这是一个包含标准Python脚本头之后的二进制形式的压缩 Python脚本(ZIP)的脚本)。
(11).py [cod]:.gitignore中的通配符表示该文件可能是.pyc,.pyo或.pyd。
(12).rpy:包含应用程序或框架特定功能的RPython脚本或Python脚本。
(13).pyde:处理使用的Python脚本。
(14).pyp:Py4D Python插件。
(15).pyt:Python声明文件。
众多python培训视频,尽在python学习网,欢迎在线学习!
② 使用python语言如何保密源代码以防止逆向工程
大家都很忙,谁有时间看你的的烂代码!
如果真的怕泄露,别用python.
我以前做过这类事情,而且当时更严格,需要打包部署到客户的服务只在有效期内有效,超过有效期必须更新证书才行。
Python代码用任何方法都没法保证保密性,这个时候你可以考虑用一个工具“nuitka”,这个工具会把你的python源代码映射为c++然后编译为二进制,因此对方是无论如何得不到你的源代码的。
代价就是nuitka这个工具并不完美,有一些限制并不能100%完美的转换所有python代码。
1.用Cython编译python成 Windows的pyd文件或linux的so文件,二进制文件相对安全性较高。
2.用源码混淆器把代码搞的又臭又长。。。混淆完了再用Cython编译为二进制。。。这样静态反编译逆向难度也不小。
3.同其他语言程序一样,可以对调试状态进行检测,当处于调试状态时退出程序或进入混乱代码耗费逆向工程人员心神。
4.分享一个跨平台反调试手段,检测函数运行时间,加断点会导致函数运行时间变长,也可感知正在被调试。
Python是提倡开源的,既然选择Python还是拥抱开源才好~ 都开源还担心逆向工程嘛
没有不能逆的软件。
只要汇编语言过关,逆向工程都是可以实现的,不要有其它想法。
你唯一可以做的,就是不让别人用python读取源代码而已。那样实现起来比较简单。
python 适合开发服务器程序,或者自己科研使用的程序,如果是 作为用户程序,安装到 pc 或手机上,还是 其它 c++ 或java 比较合适
1)可以把需要保护的部分用c语言实现,从而编译成so等文件,这样逆向的成本会比较高,可以防止直接打开python文件看到代码逻辑。
2)so文件通过ida等工具也是可以反汇编的,可以通过对c语言进行代码混淆,花指令等操作,提高通过ida等反汇编工具的分析难度。
3)不存在绝对无法逆向的技术手段,因此只能是看具体需求,选择具体的防逆向的技术手段。
有工具类似py2exe转成可执行程序,隐藏全部源代码,虽然bytecode还是可以反编译,但是难度大多了
1. 最稳的就是你改cpython加载代码的过程,改zip包读取最稳。
2. 借助一些加密工具在编译pyc之前进行一定的混淆,可以防君子,自我安慰一下。
商用一般都是用第一种办法,小打小闹用第二种。
可以考虑使用pymod工具,使用pymod pack 将模块加密打包,发布的时候一个模块就一个文件。
先睹为快,看看一个项目发布的时候,只有几个文件,
main.py 项目程序入口
setting.py 项目配置
apps 项目模块
plusins 项目插件目录
创建项目 pymod create demo1
cd demo1
创建模块 pymod add mod1
启动pycharm 开始编写功能模块
一个模块默认由三个文件组成
__init__.py 、 handlers.py 、param_schemas.py
业务逻辑主要在handlers.py中编写
__init__.py
from pymod.blueprint import Blueprint api = Blueprint("/mod1") from .handlers import *
param_schemas.py
schema_sfz = { "type": "object", "required": ["sfz", "nl"], "properties": { "sfz": { "type": "string", "minLength": 18, "maxLength": 18, "description": "身份证明号码" }, "nl": { "type": "integer", "minimum": 0, "maximum": 150, "description": "年龄" } } }
handlers.py
from . import api from pymod.ext import RequestHandler, params_validate,TrueResponse,FalseResponse from .param_schemas import schema_sfz from pymod.plugins import sfz_check @api.add_route('/hello') class Hello(RequestHandler): def get(self): self.write('Hello World') @params_validate(schema_sfz) def post(self): sfz = self.get_json_arg("sfz") nl =self.get_json_arg("nl") # self.write(TrueResponse(sfz=sfz, nl=nl)) if sfz_check.check_sfzmhm(sfz): self.write(TrueResponse(hint="身份证明号码验证通过")) else: self.write(FalseResponse(hint="身份证明号码验证失败"))
三、项目部署
程序调试 修改setting.py
# 开发模式下 运行的模块名称必须填写
moles = ["mod1"] moles_config ={ "mod1": { "deny_ip": "", "allow_ip": "*" } }
启动程序 python main.py
调试没有问题,进入发布模式
在项目目录下
pymod pack mod1
在target目录下生成mod1.mod文件,将其复制到apps目录中
修改setting.py
# 开发模式下 运行的模块名称必须填写
moles = []
再次运行 python main.py 测试
一切OK,系统就可以发布了。
说不能保密的,是没有研究过python的机制的。我做个一个项目,所有源代码自定义加密,运行时解密。
③ 本人在学linux c编程,想再学一门脚本技术,是先学习python好,还是先学shell好呢,注意是在linux下的。
1 linux下编程必须要懂shell ,建议先把shell学好
2 学好shell 脚本,linux的 的一些命令操作就变得简单易行了
3 shell脚本比较容易好学,学好好python就也显得更容易
④ python和linux到底有关系
python和linux两者间没什么关系,python是一门程序设计语言,linux是一个操作系统,向上支持应用软件的运行,向下控制硬件,是软件和硬件的过渡层。Python语言可以在Linux系统下学习和开发。
比如,如果是想用Python开发网站(现今流行的、成熟的Python Web框架)就需要使用到Linux平台;如果想使用Python爬虫爬取数据,在Linux系统上也要更方便一些;还有就是想学习网络安全渗透测试,在Linux上编写Python自动化测试脚本也很有必要。
(4)pythonlinux反编译so扩展阅读:
可以通过python对linux进行操作,利用python操纵linux的命令为:
1、import os
#返回操作系统类型,值为posix,是linux操作系统,值为nt,是window操作系统
2、print os.name
#返回操作系统的详细信息
3、print os.uname()
#系统的环境变量
4、print os.environ
print os.environ.get('PATH')
#判断是否为绝对路径(不会判断文件或者目录是否存在)
5、print os.path.isabs('/tmp/westos')
print os.path.isabs('hello')
#生成绝对路径
⑤ python loandlibrary加载so 错误
$ python -V
python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
ldd是列出动态库依赖关系:
$ ldd /usr/local/bin/python3.6linux-vdso.so.1 = (0x00007fffecbba000)libpython3.6m.so.1.0 = not foundlibpthread.so.0 = /usr/lib64/libpthread.so.0 (0x00007fe1400ff000)libdl.so.2 = /usr/lib64/libdl.so.2 (0x00007fe13fefb000)libutil.so.1 = /usr/lib64/libutil.so.1 (0x00007fe13fcf8000)libm.so.6 = /usr/lib64/libm.so.6 (0x00007fe13f9f6000)libc.so.6 = /usr/lib64/libc.so.6 (0x00007fe13f628000)/lib64/ld-linux-x86-64.so.2 (0x00007fe14031b000)
查找动态库:
$ find / -name 'libpython3.6m.so.1.0'/root/Python-3.6.9/libpython3.6m.so.1.0/usr/local/lib/libpython3.6m.so.1.0
(2)将libpython3.6m.so.1.0文件路径的目录添加到/etc/ld.so.conf :
$ vim /etc/ld.so.conf 文件末尾新添加一行,/usr/local/lib/
(3)保存,使得修改生效:
$ ldconfig
ps:下面看下python中使用动态库的方法
首先,创建一个简单的动态库
编程生成dll.so: gcc -fPIC -O2 -shared dll.c -o dll.so
C文件:dll.c 如下
#include stdio.hstruct param { int a; int b; char c; float f; int arr[3]; }; void print0(struct param arg){ printf("in print:\n"); printf("a: %d\n", arg.a); printf("b: %d\n", arg.b); printf("c: %c\n", arg.c); printf("f: %f\n", arg.f); printf("arr: %d %d %d\n", arg.arr[0], arg.arr[1], arg.arr[2]);}void print2(struct param *arg){ printf("in print2 :\n"); printf("a: %d\n", arg-a); printf("b: %d\n", arg-b); printf("c: %c\n", arg-c); printf("f: %f\n", arg-f); printf("arr: %d %d %d\n", arg-arr[0], arg-arr[1], arg-arr[2]);}void print3(int a){ printf("in print3:\n"); printf("a: %d\n", a);}
python定义传给动态库的结构体
from ctypes import *class ss(Structure): _fields_ = [ ("a", c_int), ("b", c_int), ("c", c_char), ("f", c_float), ("arr", c_int*3), //定义数组 ]
python 使用dll.so实例
#加载动态库fileName = "/home/primax/Desktop/Work/Test/python/dll.so"lib = cdll.LoadLibrary(fileName)#定义变量param = ss()#给结构体赋值param.a = 1param.b = 2param.c = 'a'param.f = 1.2345param.arr[0] = 0param.arr[1] = 1param.arr[2] = 2lib.print0(param)lib.print3(2)#传指针 pointer取指针lib.print2(pointer(param))
总结
到此这篇关于浅析python 动态库m.so.1.0错误问题的文章就介绍到这了,更多相关python m.so.1.0内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
相关资源:浅析python动态库m.so.1.0错误问题_libpython3.6m.so.1.0-其它...
⑥ 使用Cython、pyinstaller防止反编译
本例在centos7测试通过
1、首先安装pyinstaller 及Cython
pip install pyinstaller
pip installer Cython
2、本例中文件结构:
.其中config.cfg为配置文件,datacheck.py为入口文件,file_config.py、method.py为需要引入文件。
├── config.cfg
├── datacheck.py
├── file_config.py
├── method.py
3、编辑build_pyd.py文件,内容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name='datacheck',
ext_moles=cythonize(["method.py", "file_config.py"])
)
注意 ext_moles只填写引入文件,主运行文件不能写。
编辑后文件结构如下:
├── build_pyd.py
├── config.cfg
├── datacheck.py
├── file_config.py
├── method.py
4、生成so链接文件(如在windows则为pyd文件,未测试)
# python3 build_pyd.py build_ext --inplace
正常情况下会引入文件会生成so文件,文件结构如下:
.
├── build
│ └── temp.linux-x86_64-3.7
│ ├── file_config.o
│ └── method.o
├── build_pyd.py
├── datacheck.py
├── file_config.c
├── file_config.cpython-37m-x86_64-linux-gnu.so
├── file_config.py
├── method.c
├── method.cpython-37m-x86_64-linux-gnu.so
└── method.py
可以新建tmp目录,将datacheck.py及新生成的两个so文件拷贝,并针两个so文件 cpython-gnu去掉。tmp下文件结构如下:
├── datacheck.py
├── file_config.so
└── method.so
5、运行pyinstaller,生成二进制文件
# pythinsatller -F datacheck.py
加-F指生成单个文件。
6、修改datacheck.spec文件
在hiddenimports=加入引入的文件,如不加入,运行程序的时候会有如下提示:
Traceback (most recent call last):
File "datacheck.py", line 7, in <mole>
File "file_config.py", line 1, in init file_config
MoleNotFoundError: No mole named 'method'
7、再次运行pyinstaller,生成新的二进制文件
# pyinstaller datacheck.spec
8、拷贝dist目录下的二进制文件,使用原来的cfg文件,即可单独运行。
⑦ python怎么调用安卓的.so文件
调用不了的,CPU架构都不一样,一个是x86指令集,一个是arm指令集,怎么调?
就算是指令集一样的,你windows的程序也调用不了Linux的so库。
⑧ windows10和Linux python精度不一样
是的。
windows10和Linuxpython如果硬要说区别的话仿旁咐,启颤linux系统上大多数都自带python,还备纯有linux上都是通过命令行来安装的,windows都是通过安装包来安装的。