首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
逆向工程
发新帖
1
0
[原创]cython学习
发表于: 2025-12-15 22:03
2188
[原创]cython学习
D0wnBe@t
2025-12-15 22:03
2188
# 是什么 > **Cython** 是一种编程语言,它是 Python 的超集(Superset)。简单来说,它的目标是**让你用写 Python 的语法,获得写 C 语言的性能**。 > 它主要有两个核心用途: 1. **提升运行速度**:通过给变量加上静态类型(Static Typing),将 Python 代码编译成 C 代码,从而大幅提升计算密集型任务的效率(有时能快几十倍甚至上百倍)。 2. **调用 C/C++ 库**:它是 Python 与 C/C++ 交互最方便的桥梁之一,很多高性能库(如 Pandas, NumPy, Scikit-learn)底层都大量使用了 Cython。 ### Cython 的核心原理 当你写好一段 Cython 代码(通常保存为 `.pyx` 文件)后,工作流程如下: 1. **Cython 编译器** 将 `.pyx` 代码翻译成 `.c` 代码。 2. **C 编译器**(如 GCC 或 MSVC)将 `.c` 代码编译成共享库(Windows 上是 `.pyd`,Linux/Mac 上是 `.so`)。 3. **Python 解释器** 可以直接 `import` 这个共享库,就像导入普通 Python 模块一样。 # 如何使用 举个累加的例子 安装cython ```bash pip install cython ``` 新建一个文件夹,然后建立三个文件 - test.pyc ```python # cpdef声明c和python都可以调用 # cdef声明该变量为c类型 cpdef long sum(long n): cdef long i cdef long total = 0 # 纯C级别的循环 for i in range(n): total += i return total ``` - setup.py 告诉python如何把 .pyx 编译成 .pyd 动态库 ```python from setuptools import setup from Cython.Build import cythonize setup( ext_modules = cythonize("test_cy.pyx") ) ``` - main.py 调用动态库 ```python import time import test_cy N = 100000000 print("下面是纯Python的累加计算") print("开始计算0到", N, "的累加") start = time.time() result = sum(range(N)) end = time.time() print(f"耗时: {end - start:.4f} 秒\n\n") print("下面是cython加速的累加计算") print("开始计算0到", N, "的累加") start = time.time() result = test_cy.sum(N) end = time.time() print(f"耗时: {end - start:.4f} 秒") ``` 打开终端,先进行pyx的编译 ```bash python setup.py build_ext --inplace ``` - build_ext:构建扩展模块 - —inplace:生成的编译文件放在当前的目录下 编译成功如下: !<a href="elink@9f1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7e0j5&6y4U0R3&6z5o6N6U0i4K6u0V1k6U0M7@1j5W2)9J5k6o6c8V1x3U0g2Q4x3X3b7&6j5e0t1$3i4K6u0V1y4U0u0V1y4o6V1#2x3e0q4X3y4r3p5K6i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3j5U0u0Q4x3X3b7^5y4U0p5%4i4K6u0V1j5K6S2S2z5o6m8X3z5o6l9I4x3$3j5H3i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7I4y4o6t1H3i4K6t1$3N6i4y4W2M7V1W2V1i4K6y4p5i4K6t1$3j5$3q4U0K9r3g2Q4x3@1c8$3x3R3`.`.">编译成功</a> 生成: !<a href="elink@b95K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7e0u0U0x3h3t1I4y4r3x3J5i4K6u0V1y4U0l9$3j5g2)9J5k6o6c8T1x3X3c8Q4x3X3b7^5x3r3f1@1i4K6u0V1z5o6q4X3x3o6V1H3j5e0p5%4z5r3g2T1i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3z5h3g2Q4x3X3c8T1k6U0V1@1i4K6u0V1k6o6t1@1k6X3q4S2x3U0y4U0y4h3j5$3i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7%4x3o6m8Q4x3U0k6#2M7$3g2J5d9h3c8Q4x3@1c8Q4x3U0k6U0j5h3y4Z5k6g2)9K6c8s2j5J5">生成</a> - 然后运行 main.py即可,结果如下: !<a href="elink@56fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7e0j5J5k6e0p5@1j5$3x3^5i4K6u0V1j5U0V1K6y4#2)9J5k6o6b7K6j5h3q4Q4x3X3c8S2j5$3t1I4i4K6u0V1y4o6g2W2x3e0f1J5x3$3x3J5y4K6g2T1i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3z5o6y4Q4x3X3b7^5x3X3j5&6i4K6u0V1k6r3q4X3z5h3g2U0x3e0j5J5y4e0x3H3i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7I4y4o6t1H3i4K6t1$3N6i4y4W2M7V1W2V1i4K6y4p5i4K6t1$3j5$3q4U0K9r3g2Q4x3@1c8$3x3R3`.`.">运行main.py</a> 可以发现加快了许多 # 调试 参考: https://bbs.kanxue.com/thread-285349.htm ida9.0pro,conda-python3.12 讲解就针对上面的累加代码来调试 ## 写代码调用pyd 先写一个 <a href="elink@daeK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3W2V1j5g2)9J5k6i4m8&6">`ida.py`</a> 来调用pyd模块 ```python import test_cy n = input() print(test_cy.sum(int(n))) ``` 这里增加一个input,一是程序会让我们输入东西,二是方便我们attach这个进程 运行即可,但是先别输入 ## ida attach python进程 先将pyd文件拖到ida反编译,然后: !<a href="elink@1eaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7h3t1H3j5U0x3^5y4K6f1$3i4K6u0V1y4o6R3$3k6W2)9J5k6o6b7H3k6h3k6Q4x3X3c8S2j5$3x3J5i4K6u0V1k6U0u0S2k6r3j5I4x3U0f1I4k6X3f1H3i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3y4e0k6Q4x3X3c8S2x3U0x3%4i4K6u0V1j5K6j5@1j5K6j5J5z5r3x3J5x3K6g2S2i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7&6z5e0m8Q4x3U0k6#2M7$3g2J5d9h3c8Q4x3@1c8Q4x3U0k6U0j5h3y4Z5k6g2)9K6c8s2j5J5">ida</a> 选择运行ida.py的python.exe即可: !<a href="elink@726K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7e0u0U0j5h3k6V1j5U0S2X3i4K6u0V1x3e0W2U0z5g2)9J5k6o6b7^5y4h3u0Q4x3X3c8S2y4e0R3J5i4K6u0V1k6o6j5H3z5r3b7$3y4o6p5^5x3h3j5$3i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3y4r3u0Q4x3X3b7^5y4r3p5^5i4K6u0V1k6o6j5H3z5e0b7@1z5o6c8S2x3U0p5%4i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7I4y4o6t1H3i4K6t1$3N6i4y4W2M7V1W2V1i4K6y4p5i4K6t1$3j5$3q4U0K9r3g2Q4x3@1c8$3x3R3`.`.">attach</a> ## .text下断点 运行肯定是从.text段开始的,我们可以直接在这个段的开头下断点 !<a href="elink@a28K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6A6L8h3q4Y4k6g2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3U0f1K6b7e0M7#2j5U0N6S2k6o6R3#2i4K6u0V1x3r3t1^5k6q4)9J5k6o6b7#2x3h3g2Q4x3X3c8T1z5h3u0X3i4K6u0V1x3U0N6U0k6o6x3K6x3X3k6W2j5e0u0T1i4K6t1#2x3@1q4A6L8h3q4Y4k6g2)9J5k6i4m8F1k6#2)9K6c8Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3E0Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3k6e0k6Q4x3X3c8S2j5h3y4U0i4K6u0V1k6r3y4S2z5e0q4V1y4X3f1#2k6X3b7%4i4K6t1$3M7%4m8S2j5$3g2u0k6q4)9K6c8o6j5#2j5U0f1$3j5K6y4T1i4K6u0V1j5K6M7@1j5W2)9J5k6o6c8T1x3e0g2Q4x3X3b7&6x3r3j5K6i4K6u0V1z5h3f1$3z5e0x3H3x3e0M7K6x3o6q4W2i4K6t1$3N6$3W2V1N6r3S2Q4x3@1b7I4y4o6t1H3i4K6t1$3N6i4y4W2M7V1W2V1i4K6y4p5i4K6t1$3j5$3q4U0K9r3g2Q4x3@1c8$3x3R3`.`.">断点</a> F9后,在终端输入数字,RIP就会跳到这里 !<a href="elink@453K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6L8h3N6Q4x3X3g2F1L8%4c8A6L8$3&6#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8Y4x3K6i4K6u0r3M7s2u0G2k6q4)9J5k6r3k6A6L8r3g2K6i4K6u0V1M7$3g2U0N6i4u0W2i4K6t1#2x3V1j5$3y4h3t1#2y4X3x3K6j5W2)9J5k6r3x3%4y4r3u0Q4x3X3b7@1j5U0p5#2i4K6u0V1z5e0m8X3x3#2)9J5k6o6W2W2y4U0V1K6x3o6p5%4x3K6l9I4k6g2)9J5y4e0u0r3y4r3j5%4x3K6q4W2j5K6N6Q4x3X3b7^5j5K6g2T1i4K6u0V1y4o6f1J5y4q4)9J5k6r3u0S2z5h3q4Q4x3X3c8X3y4U0p5%4k6U0b7#2x3e0x3H3y4U0c8Q4x3U0f1J5c8X3W2E0j5h3N6W2i4K6u0W2M7r3&6Y4i4K6u0r3M7$3W2*7k6g2)9J5c8Y4N6Q4x3@1b7I4y4o6t1H3i4K6y4r3k6i4S2H3i4K6y4p5x3e0M7$3y4e0R3&6x3K6f1J5x3q4)9J5y4Y4y4A6k6#2)9K6c8o6y4x3M7@1c8Q4y4h3k6H3h3h3c8G2k6r3I4s2b7%4y4H3b7X3Z5$3M7X3#2j5f1Y4S2Z5P5U0c8#2c8o6k6Q4y4h3k6d9f1V1f1%4b7h3k6t1g2#2c8u0j5g2k6U0i4K6t1$3K9h3c8Q4x3@1b7J5j5K6W2U0j5e0b7#2k6g2)9J5k6r3p5^5j5e0c8Q4x3X3b7^5x3r3y4X3i4K6u0V1j5X3f1@1j5g2)9J5k6r3f1I4j5h3x3$3y4h3t1$3x3o6p5H3x3g2)9J5y4Y4c8S2j5X3I4W2i4K6y4p5j5X3I4G2j5$3D9`.">调试</a> 随后正常分析,然后调试即可,其实也可以先静态看一看,pyd扩展里面的sum函数具体实现在哪,也可以跳到那里看看,比如这里: !<a href="elink@21bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6L8h3N6Q4x3X3g2F1L8%4c8A6L8$3&6#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8Y4x3K6i4K6u0r3M7s2u0G2k6q4)9J5k6r3k6A6L8r3g2K6i4K6u0V1M7$3g2U0N6i4u0W2i4K6t1#2x3V1j5$3y4h3t1#2y4X3x3K6j5W2)9J5k6r3x3%4y4r3u0Q4x3X3b7@1j5U0p5#2i4K6u0V1z5e0m8X3x3#2)9J5k6o6W2W2y4U0V1K6x3o6p5%4x3K6l9I4k6g2)9J5y4e0u0r3k6e0x3H3x3o6b7#2j5U0u0Q4x3X3b7K6k6o6j5I4i4K6u0V1y4o6V1H3k6W2)9J5k6r3q4S2j5e0q4Q4x3X3b7#2y4o6l9@1y4o6x3@1z5o6x3&6y4U0N6Q4x3U0f1J5c8X3W2E0j5h3N6W2i4K6u0W2M7r3&6Y4i4K6u0r3M7$3W2*7k6g2)9J5c8Y4N6Q4x3@1b7I4y4o6t1H3i4K6y4r3k6i4S2H3i4K6y4p5x3e0M7$3y4e0R3&6x3K6b7^5y4q4)9J5y4Y4y4A6k6#2)9K6c8q4)9J5k6r3u0W2d9K6q4c8i4K6u0V1j5g2)9#2k6X3N6T1M7f1u0D9h3s2u0z5K9r3y4C8K9K6y4g2j5%4A6k6K9f1I4k6K9X3S2@1M7$3E0d9z5s2A6t1e0#2W2e0k6g2q4Q4x3U0k6A6k6q4)9K6c8o6u0U0z5h3y4S2y4o6g2W2i4K6u0V1j5e0S2S2y4q4)9J5k6o6R3H3j5K6m8Q4x3X3b7^5j5K6f1^5i4K6u0V1k6X3t1$3x3U0V1H3x3e0p5@1k6U0M7K6i4K6t1$3N6r3q4T1L8r3g2Q4x3@1c8T1L8r3!0U0K9H3`.`.">继续调试</a> # 例题 两个2024ciscn题目 rand0m , cython 具体可以看我写在notion里面的,写的很详细,这里就不再写一遍了 <mark class="encrypted">973K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6U0P5i4c8Z5L8$3&6Q4x3X3b7J5j5K6W2U0j5e0b7#2k6h3p5^5j5e0b7^5x3r3j5I4j5X3b7H3y4$3j5K6k6r3t1I4x3X3j5&6y4K6V1J5x3R3`.`.</mark>
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#调试逆向
#加密算法
收藏
・
1
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
fcguo
雪 币:
2220
活跃值:
(428)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
10
粉丝
0
关注
私信
fcguo
2
楼
第一眼看到时,还真以为错了呢,现在了解到还有cython语言,感谢。
2025-12-29 11:18
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
D0wnBe@t
1
发帖
0
回帖
0
RANK
关注
私信
他的文章
[原创]cython学习
2188
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部