首页 > 其他分享 >Learn learn Cython

Learn learn Cython

时间:2024-12-16 21:11:49浏览次数:4  
标签:__ Cython name self learn cy Learn import pyd

[SCTF ez_cython]

  1. 简单分析需要调用一个cy库,找到文件"cy.cp38-win_amd64.pyd"

    • pyd文件生成:

      • 编写pyx文件

        \#test.pyx
        def say_hello_world(name):
        print("Hello world" % name)
        
      • 编写setup

        \#setup.py
        from distutils.core import setup
        from Cython.Build import cythonize
        setup(name='Hello world app', ext_modules=cythonize("test.pyx"))
        
      • 生成pyd文件终端执行

        python3 .\setup.py build_ext --inplace
        
    • 终端执行报错

         error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
      
      • 分析目的:目的就是安装一个Visual Studio Build Tools,他可以在不需要完整Visual Studio IDE的情况下获得编译和构建环境.
        这时候就有一个问题,我又不是没有python或者c的编译环境,为什么会这样?
      • 原因: 笔者安装的是Mingw环境,而报错安装所需要的环境是MSVC.而安装MSVC的最好方法就是使用Visual Studio Build Tools.,并且在Windows上,Python 官方发行版是使用 MSVC 编译的,所以setup.py编译拓展模块(c)一般需要MSVC.
    • 最后生成文件test.cp311-win_amd64.pyd

  2. 拿到"cy.cp38-win_amd64.pyd"后可以进行操作分析内容

    • 将.pyd文件放在当前工作目录便可以import,或者将.pyd文件放在lib/site-packages.如果无法运行,可能是缺少库导致的,或者版本不匹配(检测库的时候会显示python版本,更改版本即可)

        import pefile
      
        pe = pefile.PE("your_file.pyd")
        for entry in pe.DIRECTORY_ENTRY_IMPORT:
        print(entry.dll.decode("utf-8"))
      
    • 代码(IDE),而终端不需要加print(),因为解释器,按步骤解释会将内容输出

        import cy
      
        help(cy)
        a = cy.QOOQOOQOOQOOOQ() //cy.QOOQOOQOOQOOOQ()表示生成一个instance,而cy.QOOQOOQOOQOOOQ则是一个将a当作引用
        print(dir(a))
        print(a.get_key())
      
    • 当dir(cy.QOOQOOQOOQOOOQ)时会有输出,函数名都存在,但是好像缺少了变量
      img

  3. 通过注入cy类,获取运算过程

     import cy
    
     class Symbol:
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return self.name
    
        def __rshift__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} >> {other.name})")
            else:
                expression = Symbol(f"({self.name} >> {other})")
            return expression
    
        def __lshift__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} << {other.name})")
            else:
                expression = Symbol(f"({self.name} << {other})")
            return expression
    
        def __rxor__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} ^ {other.name})")
            else:
                expression = Symbol(f"({self.name} ^ {other})")
            return expression
    
        def __xor__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} ^ {other.name})")
            else:
                expression = Symbol(f"({self.name} ^ {other})")
            return expression
    
        def __add__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} + {other.name})")
            else:
                expression = Symbol(f"({self.name} + {other})")
            return expression
    
        def __and__(self, other):
            if isinstance(other, Symbol):
                expression = Symbol(f"({self.name} & {other.name})")
            else:
                expression = Symbol(f"({self.name} & {other})")
            return expression
    
     class AList:
        def __init__(self, nums):
            self.nums = [Symbol(str(num)) for num in nums]
    
        def __getitem__(self, key):
            return self.nums[key]
    
        def copy(self):
            return AList(self.nums)
    
        def __len__(self):
            return len(self.nums)
    
        def __setitem__(self, key, value):
            print(f"new_{self.nums[key]} = {value}")
            self.nums[key] = Symbol(f"new_{self.nums[key].name}")
    
        def __eq__(self, other):
            print(f"{self.nums} == {other}")
            return self.nums == other
    
     inp = AList([f"a[{i}]" for i in range(32)])
     res = cy.sub14514(inp)
    
     if __name__ == '__main__':
        print(res)
    
    • 分析(........)

标签:__,Cython,name,self,learn,cy,Learn,import,pyd
From: https://www.cnblogs.com/Un1corn/p/18452017

相关文章

  • CVPR离群值检测论文ID-like Prompt Learning for Few-Shot Out-of-Distribution Detec
    标题期刊年份关键词项目地址ID-likePromptLearningforFew-ShotOut-of-DistributionDetectionCVPR2024OOD检测、Few-Shot学习、CLIP、ID-like样本项目地址概览今天我们来分享一篇来自CVPR2024的论文:ID-likePromptLearningforFew-ShotOut-of-Di......
  • [论文阅读] Radical Analysis Network for Zero-Shot Learning in Printed Chinese Ch
    Pretitle:RadicalAnalysisNetworkforZero-ShotLearninginPrintedChineseCharacterRecognitionaccepted:ICME2018paper:https://arxiv.org/abs/1711.01889code:https://github.com/JianshuZhang/RAN(onlyIDSdictionary)ref:RANforPrintedChineseCh......
  • git分支的在线学习learning Git Branching
    git分支的在线学习learningGitBranching这是个叫做LearningGitBranching的项目,是我一定要推荐的:正如对话框中的自我介绍,这确实也是我至今发现的最好的Git动画教程,没有之一。我用Git就会add.,clone,push,pull,commit几个命令,其他的命令完全不会,Git就是一个下载......
  • 人工智能(强化学习)—— Why is Soft Q Learning not an Actor Critic method? —— SQL
    原文:https://ai.stackexchange.com/questions/39545/why-is-soft-q-learning-not-an-actor-critic-methodI'vebeenreadingthesetwopapersfromHaarnojaet.al.:SoftActor-Critic:Off-PolicyMaximumEntropyDeepReinforcementLearningwithaStochastic......
  • Cython二进制逆向系列(二)变量与数据结构
    Cython二进制逆向系列(二)变量与数据结构  在这篇文章里,我们会讨论Cython是如何存储变量(整数、小数、字符串、布尔值)以及数据结构(列表、元组、集合、字典)。Cython对变量存储的方式与Python相似,但在Cython中,可以使用C类型的变量来显著提高性能。此外,由于Cython仍然依托于Py......
  • CS-UY 4563 - Introduction to Machine Learning
    FinalProjectCS-UY4563-IntroductiontoMachineLearningOverviewPartnerwithonestudentandselectamachinelearningproblemofyourchoice.Applythemachinelearningtechniquesyou’velearnedduringthecoursetoyourchosenproblem.Present......
  • Tensorized Unaligned Multi-view Clustering with Multi-scale Representation Learn
    TensorizedUnalignedMulti-viewClusteringwithMulti-scaleRepresentationLearning张量化未对齐多视图聚类与多尺度表示学习JintianJiKDD2024北京交通大学李浥东通信作者没有看的很懂,大概意思是这样:问题的核心是找到一种方法,能够在多个视图之间建立......
  • 【Ray tracing with NeRF】Learnable Wireless Digital Twins: Reconstructing Elect
    LearnableWirelessDigitalTwins:ReconstructingElectromagneticFieldwithNeuralRepresentations###1.Overview2.MLmodelfortheEMpropertyandtheinteractionbehaviour2.1NeuralObject\[\mathbf{e}=\widetilde{g}_{\mathscr{E},o}\left......
  • 强化学习:基于课程学习的强化学习算法 —— 《Combining Reward Shaping and Curriculu
    地址:https://www.tesble.com/10.1109/ICTC.2018.8539438我们在四种不同的奖励函数和终止条件下对行走者进行了训练,以评估结合奖励塑形和课程学习的效果。具体如下。1)距离稀疏奖励:行走者到达目标时给予1个奖励,否则为0。2)距离课程奖励:给予行走者的奖励与行走者距离稀疏奖励......
  • scikit-learn中的Pipeline:构建高效、可维护的机器学习流程
    我们使用scikit-learn进行机器学习的模型训练时,用到的数据和算法参数会根据具体的情况相应调整变化,但是,整个模型训练的流程其实大同小异,一般都是加载数据,数据预处理,特征选择,模型训练等几个环节。如果训练的结果不尽如人意,从数据预处理开始,再次重新训练。今天介绍的Pipeline(中文......