欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

[Other] cmake pycdc工具编译使用(纯小白篇,大师傅自动略过) PYC反编译工具pycdc安装及使用 有大用 有大大用 有大大大用



到  https://visualstudio.microsoft.com/zh-hans/downloads/  下载  并安装  visualstudio 






[Other] pycdc工具编译使用(纯小白篇,大师傅自动略过) 

  [复制链接]            


V01ta                跳转到指定楼层楼主 发表于 2023-11-8 19:42 回帖奖励                
本帖最后由 V01ta 于 2023-11-8 20:20 编辑
                               

PYC反编译工具pycdc安装及使用



因为这次浙江省网络安全省赛的逆向第一题,让我想起了我当初装这个工具的时候网上查找资料发现,那些教程总有些不明不白的地方。所以我写一篇新手向的安装说明。PS:这是我第一次发帖纯小白向,欢迎各位大师傅指正(*^_^*)

                               

0x01下载pycdc



github:https://github.com/zrax/pycdc

                               

0x02下载CMake



下载网址:https://cmake.org/download/

选择对应的版本下载

                                                               


一路next

                                                               

                                                               

                                                               

                               image.png                                
                               

0x03编译pycdc



将解压好的pycdc文件夹放入IDE

按ctrl+shift+p

                                                               

选择CMake:生成,没有的话搜一下就行了。

                                                               

在用GCC的编译器

                                                               

等结束,在这个文件夹下的这两个exe就是你需要的工具

                                                               

                               

0x04 pycdc的使用



直接在用目录下cmd命令

```bash
pycdc.exe test.pyc
```

OK,z这样就结束啦
几张CMake安装的截图借鉴:此处链接

免费评分

  • 参与人数 7                                    吾爱币 +5                                    热心值 +4                                    收起理由                                    
     s1mh0                                    + 1
    我很赞同!
     qazQazQAzQAZ                                    + 1
    谢谢@Thanks!
     yonghu007                                    
    + 1我很赞同!
     Zjx2580                                    + 1
    我很赞同!
     ni8238351                                    + 1+ 1谢谢@Thanks!
     唐小样儿                                    + 1+ 1我很赞同!
     sanzhu                                    
    + 1谢谢@Thanks!

    查看全部评分                        

收藏收藏35 分享淘帖 有用有用2 分享到朋友圈

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

           



回复                

举报                



_Dream            推荐 发表于 2023-11-9 16:35                
有现成编译好的,直接用就行。https://github.com/extremecoders-re/decompyle-builds

免费评分

  • 参与人数 2                                    吾爱币 +2                                    热心值 +1                                    收起理由                                    
     daymissed                                    + 2
    热心回复!
     610100                                    
    + 1热心回复!

    查看全部评分                        

【吾爱破解论坛总版规】 - [让你充分了解吾爱破解论坛行为规则]            



回复 支持 4                

举报                



V01ta            推荐  楼主| 发表于 2023-11-10 10:07 |楼主吾爱破解论坛没有任何官方QQ群,禁止留联系方式,禁止任何商业交易。                
zjz1057 发表于 2023-11-9 23:22
pycdc有什么用呢

对python的pyc文件反编译的,因为有些题目的python版本高于3.9,uncompyle6就会反编译失败,就要用到pycdc了

点评

 云在天改个幻数也能解决大部分问题  详情 回复 发表于 2023-11-11 13:55            
如何升级?如何获得积分?积分对应解释说明!            



回复 支持                

举报                



xixicoco            3# 发表于 2023-11-9 15:58《站点帮助文档》有什么问题来这里看看吧,这里有你想知道的内容!                
很好的教程,完结了吗??
呼吁大家发布原创作品添加吾爱破解论坛标识!            



回复 支持                

举报                



leo1688            4# 发表于 2023-11-9 17:31                
非常好,小白正需要
如何快速判断一个文件是否为病毒!            



回复 支持                

举报                



sanzhu            5# 发表于 2023-11-9 19:49                
非常棒,利好我这样的小白!




回复 支持                

举报                



wuai4444            6# 发表于 2023-11-9 21:08                
感谢分享。。




回复 支持                

举报                



hzqmwne            7# 发表于 2023-11-9 21:55                
学习一下




回复 支持                

举报                



zjz1057            8# 发表于 2023-11-9 23:22                
pycdc有什么用呢




回复 支持                

举报                



deTrident            9# 发表于 2023-11-10 07:39                
我得插个眼,会有用到




回复 支持                

举报                



heart1broken            10# 发表于 2023-11-10 08:57                
插眼,总会用上的




回复 支持            


https://www.52pojie.cn/thread-1854345-1-1.html


Win10下VScode C++环境配置,Cmake与Gtest的简易使用

2022年07月15日 17:052725浏览 · 13喜欢 · 6评论MmmeiTou粉丝:104文章:2

以下内容是根据本人自己的操作与思考写的,因此难免有纰漏与不严谨的地方,不足之处还请指出
望大家多多包涵

系统环境

版本 Windows 10 专业版
版本号 21H2
操作系统内部版本 19044.1766


VScode中C++环境配置

VScode与MinGW的下载

VScode下载(https://code.visualstudio.com)


Vscode的下载与安装比较简单,不赘述


MinGW下载(https://sourceforge.net/projects/mingw-w64/files/)


VScode就是一个编辑器而已,它并不是IDE,没有编译功能。因此需要我们自己下载编译器。这里使用MinGW。


image.png



点进去后下拉找到x86_64-posix-sjlj这个版本然后下载,我刚开始是随便找了个包就下了,但是后面在编译gtest的时候报了多线程的错误,换了这个版本后问题解决了


x86_64是指64位的操作系统,i686是指32位的操作系统;

win32是开发windows系统程序的协议,posix是其他系统的协议(例如Linux、Unix、Mac OS);

异常处理模型 seh(新的,仅支持64位系统),sjlj(稳定的,64位和32位都支持),dwarf(优于sjlj的,仅支持32位系统)

(这段内容是我看了一些文章后偷的)

这篇文章写的比较详细

MingGW 各版本区别及安装说明


(https://blog.csdn.net/qq_29856169/article/details/119380663)


image.png






如果使用浏览器直接下载速度慢的话,可以复制下载链接在迅雷中下载,亲测速度快不少。

我也有看到其它例如从sourceforge镜像站下载等的加速教程,感觉不如迅雷。。。效果


下载好了之后把压缩包解压到你希望放到的目标文件夹中,路径不要有中文(我道听途说的,没试过也不清楚有中文到底会不会出问题,但没中文肯定不会出问题) 

配置环境变量

先简单说明一下配置环境变量的目的,就是为了能够让系统在任意目录下都可以直接输入程序名执行加入到系统环境变量中的目录下的程序,而不用加上这个程序所在的目录前缀

(如果遇到同名程序都配了环境变量好像是会执行环境变量写在前面的那个,不是很确定,有兴趣的朋友可以去求证一下我记得我重装MinGW的时候没删之前的包和环境变量,然后给我折磨了好久)


解压完成后,应该是这样的

image.png




在这里面打开bin文件夹,能够看到里面有很多可执行文件,比如gcc.exe,g++.exe,gdb.exe等等,这就是要添加到环境变量中的路径了

image.png


右击此电脑,选择属性,右上角有个高级系统设置,打开后选中高级-环境变量-在系统变量中找到Path,双击打开或者点编辑打开,新建-把你自己的上面说的那个bin文件夹的完整路径复制后粘贴进去,确定后就配置完成了(用户变量与系统变量的区别这里不赘述了,但如果你只用当前用户来做以下操作的话,配到用户变量的Path里应该也可以 没试过,你可以试试)


image.png

右击win键,打开powershell

image.png


打开后输入gcc -v,有以下输出代表配置成功,最下面一行还会输出当前的版本

如果报错,说明没有配置成功,可以考虑多配置几遍,或者换一篇看

image.png


VScode中插件下载

打开VScode中的拓展,搜索并下载C/C++,CMake,CMake Tools这三个插件。如果你想让VScode界面显示中文,可以下载Chinese插件,其中CMake,CMake Tools这两个插件用于CMake

image.png




在VScode中编译运行C++

编译运行一个C++程序(单文件)

用VScode打开一个新建的文件夹,新建一个名叫Hello.cpp文件


输入以下代码:



#include<iostream>

using namespace std;

int main()

{

    cout<<"Hello World"<<endl;

}

image.png

保存后现在是不可以直接F5或者在上方点击运行的,这是由于.vscode文件夹中的文件还未配置。甚至现在还没有.vscode文件夹。关于这个.vscode文件夹,下文再说


那我们现在要如何编译运行这个cpp文件呢,我们首先从上方任务栏打开一个新的终端

在终端中输入g++ Hello.cpp -o Hello.exe,之后我们便能看到生成了一个名为Hello.exe的可执行文件

在这里插入图片描述


之后再在终端输入./Hello.exe或者./Hello就可以在终端中看到运行结果了

其实这个终端就是前文提到的powershell,所以直接用powershell做一样的事情也是可以的 








在这里插入图片描述






简单解释一下这个流程,就是用g++.exe编译了Hello.cpp这个文件,-o Hello.exe的意思是将编译结果指定为名为Hello.exe的文件并输出到当前文件夹。如果在-o 后面带上完整的路径,就可以输出到指定的文件夹中。例如g++ Hello.cpp -o ../../xxx/name.exe等,其中./../为相对路径,分别代表当前文件夹与父文件夹。使用相对路径前需要明确工作路径,终端中可以直接看到当前工作路径是什么,后续可能会在CMakeLists.txt中使用相对路径,则需要确认工作路径后再使用相对路径


后面的./Hello.exe也很好理解了,就是运行当前文件夹中的Hello.exe文件,其中.exe后缀可以缺省

多文件编译

一般而言,不会将所有的功能实现全部放在包含main函数的单个文件中,有多个源文件或是需要链接库文件时,此时便需要多文件编译。同时要包含头文件的路径,当头文件与引用该头文件的源文件路径相同时可以缺省

多文件编译例子:
假设文件目录结构如下






在这里插入图片描述









其中mylib.h为头文件,mylib.cpp对头文件中声明的函数进行实现,最后在main.cpp文件中调用,main函数位于main.cpp文件中

mylib.h






#ifndef MYLIB_H
#define MYLIB_H
#include<iostream>

std::string ReturnHello();

class MYLib {
 public:
  static std::string ReturnHelloMyLib();

  private :
};
#endif







mylib.cpp






#include<iostream>
#include "mylib.h"
using namespace std;
string ReturnHello(){return "Hello";}
string MYLib::ReturnHelloMyLib(){return "HelloMyLib";}







main.cpp






#include<iostream>
#include"mylib.h"
using namespace std;
int main()
{
    cout<<ReturnHello()<<endl;
    cout<<MYLib::ReturnHelloMyLib()<<endl;
}






假设当前工作路径为main.cpp文件所在路径
在终端中输入如下命令g++ main.cpp ../funcs/mylib.cpp -I ../../include -o ../../bin/hellomylib.exe,会发现根目录的bin文件夹下生成了hellomylib.exe文件,运行后发现结果符合预期。其中-I参数后接包含头文件的目录






在这里插入图片描述






静态库动态库也都可以通过上述方式链接。当然也可以通过-l-L参数进行链接
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
所谓静态、动态是指链接方式不同

静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件(.a文件)。生成用到gcc -cg++ -c命令,打包用到ar命令

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。生成用到gcc -fPIC -sharedg++ -fPIC -shared命令。动态库链接完成后,动态库文件需要放在链接时指定的目录,或是链接完成后生成的可执行文件目录,否则程序无法正确运行

静态库与动态库的生成与链接也可以看一下这篇文章,写的挺详细的
C++静态库与动态库

(https://www.cnblogs.com/skynet/p/3372855.html)

GDB Debug

如果想要使用GDB对二进制可执行文件进行调试,那么在编译时需要加入参数-g,例:g++ -g xxx.cpp -o xxx。网上关于GDB调试的教程有许多,大家可以自己尝试。在这里提到GDB的主要原因是,配置完.vscode文件夹中的json文件后,可以启用GDB调试,并且在VScode中操作

.vscode中json文件的配置

上面的提到的单文件或多文件编译运行其实和VScode没什么关系,你可以在Powershell中做同样的事情,为了使VScode也可以编译运行调试C++程序,便需要配置.vscode文件夹中的json文件了。
先在这里放上官方文档吧
Using GCC with MinGW(https://code.visualstudio.com/docs/cpp/config-mingw)

简单总结一下,需要配置的json文件有3个,分别是:

  1. tasks.json(构建说明)

  2. launch.json(调试器设置)

  3. c_cpp_properties.json(编译器路径和智能感知设置)

其中需要重点配置的文件是前两个。如果你新建的项目没有.vscode文件夹和里面的json文件,只需要点击右上角的小齿轮,之后选择g++.exe 生成和调试活动文件,就会看到生成了.vscode文件夹,里面有launch.json和tasks.json两个文件。c_cpp_properties.json文件可以通过点击上方任务栏的"查看-命令面板"或者快捷键Ctrl+Shift+P打开,选择C/C++:编辑配置(JSON) 生成
其实你可以直接创建一个名为.vscode的文件夹,然后再在里面创建这三个json文件,文件名别打错了就行






在这里插入图片描述
在这里插入图片描述
在这里插入图片描述







配置这些json文件时,会用到预定义变量,具体的解释可以参考官方文档
官方文档中的一些预定义变量(https://code.visualstudio.com/docs/editor/variables-reference

tasks.json
先贴官方文档:https://code.visualstudio.com/docs/editor/tasks
tasks.json文件内容是构建说明,当typeshell时其实可以简单将它想象成在终端中输入指令(拙劣的揣测,并不严谨)
来给大家看看我的tasks.json文件吧,用的还是上面的多文件编译的例子






{
    "tasks": [
        {
            "type": "shell",//定义任务是被作为进程运行还是在 shell 中作为命令运行。
            "label": "C/C++: g++.exe 生成活动文件",//任务的名称
            "command": "g++",//shell命令 g++
            "args": [   //参数
                "-g",
                "main.cpp","../funcs/mylib.cpp","-I","../../include", "-o","../../bin/hellomylib.exe",
                //执行g++ -g main.cpp ../funcs/mylib.cpp -I ../../include -o ../../bin/hellomylib.exe
            ],
            "options": {//其他命令选项
                "cwd": "${workspaceFolder}/src/main"//已执行程序或脚本的当前工作目录。如果省略,则使用代码的当前工作区根。
            },
            "problemMatcher": [
                "$gcc"//使用gcc捕获错误
            ],
            "group": "build",
            "detail": "调试器生成的任务。",
            "dependsOn":["recallwd"],//此任务依赖的其他任务,label为"recallwd",执行在这个任务之前
        },
        {
            "type":"shell",
            "label": "recallwd",
            //"command": "pwd",
            "command": "echo",//shell命令 echo
            "args": [
                "workspaceFolder ${workspaceFolder}","fileDirname ${fileDirname}"//输出一些预定义变量的具体值
            ],
            "options": {
                "cwd": "${fileDirname}"
            }
        }
    ],
    "version": "2.0.0"
}






简单说说几个我觉得重要的点:

  1. type:任务的类型

  2. label:任务的名称

  3. command: 当type为shell时,就是shell命令,例如gcc,g++等

  4. args:参数,每个参数都需要"",隔开," "之间的空格字符不算参数的隔断

  5. cwd:工作目录,要正确指定工作目录

  6. dpendsOn:通过这种方式可以使一个任务在当前任务之前被执行,根据label来定位任务,我在这里使用是为了获取预定义变量的具体值,用以定位正确的工作目录

launch.json
launch.json是调试器设置,点击VScode上方任务栏的“运行-启动调试”或是按F5启动的就是调试器
这是我的launch.json文件






{
    "configurations": [

        {
            "name": "C/C++: g++.exe 生成和调试活动文件",
            "type": "cppdbg",//配置类型
            "request": "launch",
            "program": "${workspaceFolder}/bin/hellomylib.exe",//要调试的程序的路径
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,//是否启用调试控制台,启用的话可以考虑在main函数中加个system("pause")防止控制台直接退出
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\xxxxxxxxx\\mingw64\\bin\\gdb.exe",//这里填你自己的gdb路径,在mingw64的bin文件夹中
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe 生成活动文件"//这是在调试前执行的tasks.json中的任务,通过label定位
        }
    ],
    "version": "2.0.0"
}






简单说说几个我觉得重要的点:

  1. program:填你要调试的程序的路径,如果是通过tasks.json生成的话,就指定到生成目录的程序名

  2. miDebuggerPath:填你自己的gdb路径,在mingw64的bin文件夹中,如果使用\做目录分隔符需要再写一个\作为转义符,使用/则不需要

  3. preLaunchTask:这是在启动调试器前执行的tasks.json中的任务,通过label定位,所以tasks.json中你想执行的task的label需要和此处一致,调试前不需要执行任务可以不写

在launch.json文件中,可以直接点右下角的添加配置,选择c/c++: (gdb)启动,会自动帮你把很多内容补全,只需要修改少数内容即可实现功能






在这里插入图片描述






c_cpp_properties.json
官方文档https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference
最后是c_cpp_properties.json的配置,它的主要功能是配置编辑器的智能感知






{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:\\xxxxxxx\\mingw64\\bin\\gcc.exe",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "windows-gcc-x64",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}






这个文件其实不怎么需要配置,直接生成的就可以用了。可能不生成不配置也没什么影响
需要注意的点应该是compilerPath处需要填你自己的正在使用的编译器的完整路径,不然可能会影响编辑器智能感知

这三个json文件配置完成后,应该就可以在VScode中编译运行调试你的程序了。不行的话就多配置几遍或者看看别的文章吧。建议直接看官方文档


VScode中CMake的使用

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。 ---------百度百科

CMake的下载与安装

下载地址https://cmake.org/download/
根据自己的系统版本进行下载即可
我看它从官网下载的下载链接是连的github的,所以下的慢的话有几种解决办法

  1. UU加速器搜索学术资源进行加速,目前免费

  2. github镜像站,把前面的github.com替换一下再下载,没试过效果,我找到的目前能用的几个
    https://hub.xn–gzu630h.xn–kpry57d/
    https://hub.nuaa.cf/
    https://hub.fastgit.xyz/
    https://hub.fastgit.xyz/
    保不准什么时候就寄了,那就大家自己想想办法吧

  3. 可以从这个网站找合适版本下载https://cmake.org/files/LatestRelease/,直接用浏览器下的话可能也会很慢,但复制下载链接用迅雷下很快。(上面那个下载地址好像不能直接复制下载链接用迅雷下,但这个可以。)

安装比较简单,安装程序可以勾选自动配环境变量的选项,没勾选的话记得配环境变量,配置方法与MinGW是一样的,网上教程也很多,不再赘述

CMake流程

首先介绍一下Makefile

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。----百度百科

我的理解就是把类似于gcc/g++ [-g] xxx.c(pp) [xxx1] [xxx2] [...] [-I] [xxx..] [-L] [xxx...] [-lxxx]...[-o] [xxx]的流程以一种标准通用的格式写出来

有了Makefile后,使用make命令就可以自动编译链接源文件了
CMake是用于生成Makefile的,生成规则写在CMakeLists.txt文件中,通过cmake命令生成Makefile,再通过Makefile编译项目
CMake的构建有两种方式,外部构建内部构建,其实区别就是是否新建一个文件夹然后再在这个文件夹的路径下进行cmake,我一般会使用外部构建,也就是新建一个文件夹再cmake

CMakeLists.txt的编写

先贴上官方文档吧,基本可以解答关于CMake的所有问题 CMake Reference Documentation (https://cmake.org/cmake/help/latest/)
一些其它的说明可以看看wiki是怎么写的:http://wiki.ros.org/catkin/CMakeLists.txt,或是去搜索相关资料,网上的内容还是非常丰富的

CMake是根据CMakeLists.txt来生成Makefile的,CMakeLists.txt的写法相较于直接写Makefile会更简单,同时也可以实现跨平台
关于CMakeLists.txt中的一些命令,先贴官方文档cmake-commands(7)(https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html#project-commands)


CMakeLists.txt中,命令名字是不区分大小写的,而参数和变量是大小写相关的

介绍几个本文接下来例子可能会用到的的命令(个人理解,不严谨,详细释义与格式建议看官方文档)

  • add_executable 用于生成可执行文件

  • add_library 添加库文件

  • add_subdirectory 先执行子文件夹中的CMakeLists.txt后再返回执行当前CMakeLists.txt

  • aux_source_directory 找到一个目录中的所有源文件

  • include_directories 简单来说就是添加一个头文件搜索路径

  • target_link_directories 指定链接器在链接给定目标时应在其中搜索库的路径

  • target_link_libraries 链接库

  • set 给某个变量设置某个值(set的用法很多,建议查看官方文档)

  • find_library 找到某个库,并为其创建普通变量或缓存条目

  • message 在日志中记录指定的消息文本,向外输出消息

  • project 设置项目的名称

  • cmake_minimum_required CMake需要的最小版本

还有一些CMake中的变量,类似于VScode中的预定义变量,cmake-variables(7) (https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html)

一个小tips,我好像没有找到在CMake中直接获取父文件夹路径的方式,相对路径只能用于某些命令中,例如message就无法通过使用转义符输出相对路径。
我搜索了一些相关的内容,找到了方法。就是通过正则表达式来获取父路径。
CMake中可以使用string命令来进行正则匹配string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...),详细请看官方文档
因此可以通过正则表达式的分组,以/为分隔将当前项目路径进行分组,取前面的分组内容即可得到父路径,父父路径等
例如:(这段我自己写了试了应该是没什么问题的,在当前CMakeLists.txt有project时)(后面的变量也可以换成其它CMAKE路径变量或是自定义的路径)(\\是转义符+\)
string(REGEX REPLACE "(.*)/(.*)/(.*)" "\\1" GRANDFATHER_DIR ${PROJECT_SOURCE_DIR})
string(REGEX REPLACE "(.*)/(.*)/(.*)" "\\2" FATHER_NAME ${PROJECT_SOURCE_DIR})
set(FATHER_DIR "${GRANDFATHER_DIR}/${FATHER_NAME}")
message(${FATHER_DIR})
message(${GRANDFATHER_DIR})
message(${FATHER_NAME})
正则我是真的看的头大,这个算比较简单的运用
正则表达式(https://www.runoob.com/regexp/regexp-syntax.html)


   

大家可以看看官方文档中的内容,去查找自己想要的变量,或者去网上搜对应的内容,遇到不清楚的内容记得活用搜索功能,以官方文档为准






在这里插入图片描述






还是拿上面的多文件编译例子来进行一次完整的CMake流程吧
我们先在根目录下新建一个build文件夹,再在根目录、src/funcs与src/main中新建CMakeLists.txt文件,如下图所示






在这里插入图片描述






根目录下的CMakeLists.txt






cmake_minimum_required(VERSION 3.0.0) #需要的CMake最低版本为3.0.0  可以在终端中输入cmake -version查看当前版本
project(HelloVScode)
message(${CMAKE_SOURCE_DIR}) #打印CMAKE_SOURCE_DIR变量的值,这个变量的具体含义可以去查看官方文档
set(ROOT_DIR ${CMAKE_SOURCE_DIR}) #在此项目中,这个值为根目录,因此设置一个用于存储根目录的变量

#在add_subdirectory之前设置的变量可以传递到子目录的CMakeLists.txt中使用

add_subdirectory(src/funcs) #执行子文件夹src/funcs中的CMakeLists.txt
add_subdirectory(src/main) #同上
#先执行src/funcs中的再执行src/main中的,分顺序







src/funcs下的CMakeLists.txt






cmake_minimum_required(VERSION 3.0.0)
project(Mylib)

make_directory(${CMAKE_BINARY_DIR}/lib) #在执行CMake的目录中创建一个lib文件夹,build/lib
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) #将生成的库文件输出到指定路径
#其中关于LIBRARY_OUTPUT_PATH这个变量可以去查看一下官方文档,这是一个旧的库位置变量
#如果设置了ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY, RUNTIME_OUTPUT_DIRECTORY这三个新的变量,将取代这个变量

set(LIB_NAME ${PROJECT_NAME} CACHE STRING "Mylib" FORCE) #设置变量LIB_NAME,并使用这个project的名字为这个变量赋值
#同时将LIB_NAME这个变量加到CMakeCache.txt中,差不多相当于设置了一个全局变量
#同级目录之间的CMakeLists.txt变量不互通,通过这种方式可以实现共享变量

add_library(${LIB_NAME} STATIC mylib.cpp) #生成一个名为LIB_NAME变量的值的库

include_directories(${ROOT_DIR}/include) #包含的头文件搜索路径,ROOT_DIR是来自父文件的变量







src/main下的CMakeLists.txt






cmake_minimum_required(VERSION 3.0.0)
project(Main)
message("\nthis is a message")
message("LIB_NAME is>>>${LIB_NAME}\n") #可以访问之前设置在CMakeLists.txt中的缓冲变量
#此处需要注意顺序,如果是先执行了这个CMakeLists.txt,之后才执行设置该变量的CMakeLists.txt
#而此时CMakeLists.txt还未生成或是还未更新,是访问不到这个缓冲变量或是访问结果不符合预期的

add_executable(hellobycmake main.cpp) #根据源文件生成可执行文件,并为其命名

target_link_libraries(hellobycmake ${LIB_NAME})
#target_link_libraries(hellobycmake Mylib) #如果知道这次cmake流程中生成的库名可以这样写,不分CMakeLists.txt顺序

include_directories(${ROOT_DIR}/include) #头文件路径,ROOT_DIR是来自父文件的变量

make_directory(${CMAKE_BINARY_DIR}/bin) #在执行CMake的目录中创建一个bin文件夹,build/bin
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) #将生成的可执行文件输出到指定路径
#EXECUTABLE_OUTPUT_PATH同样是旧的cmake变量,细节建议查询官方文档


set(CMAKE_BUILD_TYPE "Debug") #构建模式设置为Debug
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") #编译器参数 -g -Wall,这两行指令的目的为使生成的可执行文件包含调试信息,可调试







CMakeLists.txt编写完成后,只需要先cmake生成Makefile文件,再make完成整个编译流程即可
在Windows中,cmake 命令会优先选择msvc编译器,因此需要指定编译器为MinGW,需要添加参数-G "MinGW Makefiles"make指令也需要更改为mingw32-make
因此完整的流程就是先进入build文件夹,cmake .. -G "MinGW Makefiles"mingw32-make

结果如下






在这里插入图片描述






.vscode中json文件的配置

前面已经讲过.vscode中的json文件该如何配置了,所以我就简单把tasks.json与launch.json文件贴出来好了。还不太清楚的话可以多看几遍前面的内容
tasks.json






{
    "tasks": [
        {
            "label": "CMake: 生成活动文件",//任务的名称
            "options": {//其他命令选项
                "cwd": "${workspaceFolder}/build"//已执行程序或脚本的当前工作目录。如果省略,则使用代码的当前工作区根。
            },
            "dependsOn":["make"],//此任务依赖的其他任务,label为"make",执行在这个任务之前
        },
        {
            "type":"shell",
            "label": "cmake",
            "command": "cmake",//cmake .. -G "MinGW Makefiles"
            "args": [
                "..","-G \"MinGW Makefiles\""
            ],
            "options": {
                "cwd": "${workspaceFolder}/build"
            }
        },
        {
            "type":"shell",
            "label": "make",
            "command": "mingw32-make",//mingw32-make
            "args": [
            ],
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "group": "build",
            "dependsOn":["cmake"]

        }
    ],
    "version": "2.0.0"
}







launch.json






{
    "configurations": [

        {
            "name": "C/C++: g++.exe 生成和调试活动文件",
            "type": "cppdbg",//配置类型
            "request": "launch",
            "program": "${workspaceFolder}/build/bin/hellobycmake.exe",//要调试的程序的路径
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,//是否启用调试控制台,启用的话可以考虑在main函数中加个system("pause")防止控制台直接退出
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\studyapp\\mingw64\\bin\\gdb.exe",//这里填你自己的gdb路径,在mingw64的bin文件夹中
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "CMake: 生成活动文件"//这是在调试前执行的tasks.json中的任务,通过label定位
        }
    ],
    "version": "2.0.0"
}






之后就可以在VScode中进行CMake并调试运行了

Gtest

Google C++单元测试框架(简称Gtest),可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。

关于Gtest如何使用的文章网上挺多的,我推荐两篇

GTest 总结(https://blog.csdn.net/qq_36631379/article/details/119387921?spm=1001.2101.3001.6661.1&utm_medium=dis...)

GoogleTest单元测试(https://www.cnblogs.com/jycboy/category/900460.html)

Gtest的下载

https://github.com/google/googletest
国内下的慢或者打不开的话可以用uu加速器,github镜像站等等方法,一些目前可用的镜像站在上面cmake下载那里贴出来了
下载zip,之后解压到你的项目文件夹中即可






在这里插入图片描述






Gtest的简易使用

解压完成后可以看到这个文件夹中是有CMakeLists.txt的,因此只需要在这个googletest-main的文件夹中新建一个build文件夹,之后在这个build文件夹中cmake即可






在这里插入图片描述







在终端输入cmake .. -G "MinGW Makefiles"mingw32-make后,生成了四个库文件,其中在接下来的例子中我们需要用到的为libgtest.a,可能会用到libgtest_main.a。是否用到libgtest_main.a取决于有没有自己写main函数






在这里插入图片描述






下面是gtest使用的简单例子,要测试的函数是返回两个整型数中的最小值
代码如下
mylib.h






#ifndef MYLIB_H
#define MYLIB_H
#include<iostream>

std::string ReturnHello();

class MYLib {
 public:
  static std::string ReturnHelloMyLib();
  static int ReturnMin(int a,int b);

  private :
};
#endif







mylib.cpp






#include<iostream>
#include "mylib.h"
using namespace std;
string ReturnHello(){return "Hello";}
string MYLib::ReturnHelloMyLib(){return "HelloMyLib";}
int MYLib::ReturnMin(int a,int b){
    if(a>=b){return b;}
    else{return a;}
}







main.cpp






#include<iostream>
#include"mylib.h"
#include"gtest/gtest.h"
using namespace std;
int main()
{
    cout<<ReturnHello()<<endl;
    cout<<MYLib::ReturnHelloMyLib()<<endl;
    testing::InitGoogleTest();//初始化gtest
    if(RUN_ALL_TESTS()){}
    //也可以写return RUN_ALL_TESTS();但这样写main函数在调用完gtest后就结束了
}






我们先在src目录中新建一个tests文件夹,在tests文件夹中新建test1.cpp文件,在其中写测试用例

test1.cpp






#include "mylib.h"
#include "gtest/gtest.h"
TEST(Mytestsuite,test01){
    EXPECT_EQ(MYLib::ReturnMin(3,2),2);
    EXPECT_EQ(MYLib::ReturnMin(32,54),32);
    }
TEST(Mytestsuite,test02){
    EXPECT_EQ(MYLib::ReturnMin(3,2),3);
    EXPECT_EQ(MYLib::ReturnMin(32,54),54);
    }







为了避免链接时要输入一大串的文件路径,我们将libgtest.a复制到根目录下的lib文件夹中,没有lib文件夹可以新建一个,gtest.h头文件是放在googletest-main/googletest/include/gtest中的,我们直接把整个gtest文件夹复制到根目录的include中,再进行编译链接,由于头文件的写法是"gtest/gtest.h",所以-I后的参数为根目录下的include目录
上述操作其实都可以不做,能够保证链接时路径的正确即可

目录结构






在这里插入图片描述







在终端中输入g++ main.cpp ../funcs/mylib.cpp ../tests/test1.cpp ../../lib/libgtest.a -I ../../include -o gtest01.exe
运行getst01.exe,可以看到如下结果






在这里插入图片描述







测试结果会打印出来,告诉你哪些成功了,哪些失败了,这样子就算是简单的使用gtest进行了测试

如果没有写main函数,只写了待测函数,链接时将待测函数源码与libgtest.a还有libgtest_main.a进行链接即可
例如:g++ ../funcs/mylib.cpp ../tests/test1.cpp ../../lib/libgtest.a ../../lib/libgtest_main.a -I ../../include -o gtest01.exe

Gtest+CMake

两种方法,第一种是直接找到libgtest.a这个库,include头文件路径,直接链接。第二种是用add_subdirectory将googletest-main文件夹下的CMakeLists.txt加入到根目录下的CMakeLists.txt中,链接时用target_link_libraries(XXX gtest)即可

第一种在src/main中的CMakeLists.txt中修改






cmake_minimum_required(VERSION 3.0.0)
project(Main)
message("\nthis is a message")
message("LIB_NAME is>>>${LIB_NAME}\n") #可以访问之前设置在CMakeLists.txt中的缓冲变量
#此处需要注意顺序,如果是先执行了这个CMakeLists.txt,之后才执行设置该变量的CMakeLists.txt
#而此时CMakeLists.txt还未生成或是还未更新,是访问不到这个缓冲变量或是访问结果不符合预期的

string(REGEX REPLACE "(.*)/(.*)" "\\1" FATHER_DIR ${PROJECT_SOURCE_DIR})#父文件夹路径

add_executable(hellobycmake main.cpp ${FATHER_DIR}/tests/test1.cpp) #根据源文件生成可执行文件,并为其命名

target_link_libraries(hellobycmake ${LIB_NAME})
#target_link_libraries(hellobycmake Mylib) #如果知道这次cmake流程中生成的库名可以这样写,不分CMakeLists.txt顺序

find_library(gtestlib libgtest.a ${ROOT_DIR}/lib)#找到libgtest.a
target_link_libraries(hellobycmake ${gtestlib})#链接libgtest.a

include_directories(${ROOT_DIR}/include) #头文件路径,ROOT_DIR是来自父文件的变量

make_directory(${CMAKE_BINARY_DIR}/bin) #在执行CMake的目录中创建一个bin文件夹,build/bin
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) #将生成的可执行文件输出到指定路径
#EXECUTABLE_OUTPUT_PATH同样是旧的cmake变量,细节建议查询官方文档


set(CMAKE_BUILD_TYPE "Debug") #构建模式设置为Debug
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") #编译器参数 -g -Wall,这两行指令的目的为使生成的可执行文件包含调试信息,可调试







第二种
根目录下的CMakeLists.txt






cmake_minimum_required(VERSION 3.0.0) #需要的CMake最低版本为3.0.0  可以在终端中输入cmake -version查看当前版本
project(HelloVScode)
message(${CMAKE_SOURCE_DIR}) #打印CMAKE_SOURCE_DIR变量的值,这个变量的具体含义可以去查看官方文档
set(ROOT_DIR ${CMAKE_SOURCE_DIR}) #在此项目中,这个值为根目录,因此设置一个用于存储根目录的变量

#在add_subdirectory之前设置的变量可以传递到子目录的CMakeLists.txt中使用

add_subdirectory(src/funcs) #执行子文件夹src/funcs中的CMakeLists.txt
add_subdirectory(src/main) #同上
#先执行src/funcs中的再执行src/main中的,分顺序

add_subdirectory(googletest-main)







src/main中的CMakeLists.txt






cmake_minimum_required(VERSION 3.0.0)
project(Main)
message("\nthis is a message")
message("LIB_NAME is>>>${LIB_NAME}\n") #可以访问之前设置在CMakeLists.txt中的缓冲变量
#此处需要注意顺序,如果是先执行了这个CMakeLists.txt,之后才执行设置该变量的CMakeLists.txt
#而此时CMakeLists.txt还未生成或是还未更新,是访问不到这个缓冲变量或是访问结果不符合预期的

string(REGEX REPLACE "(.*)/(.*)" "\\1" FATHER_DIR ${PROJECT_SOURCE_DIR})#父文件夹路径

add_executable(hellobycmake main.cpp ${FATHER_DIR}/tests/test1.cpp) #根据源文件生成可执行文件,并为其命名

target_link_libraries(hellobycmake ${LIB_NAME})
#target_link_libraries(hellobycmake Mylib) #如果知道这次cmake流程中生成的库名可以这样写,不分CMakeLists.txt顺序

#find_library(gtestlib libgtest.a ${ROOT_DIR}/lib)#找到libgtest.a
#target_link_libraries(hellobycmake ${gtestlib})#链接libgtest.a

target_link_libraries(hellobycmake gtest)#直接这样链接即可

include_directories(${ROOT_DIR}/include) #头文件路径,ROOT_DIR是来自父文件的变量

make_directory(${CMAKE_BINARY_DIR}/bin) #在执行CMake的目录中创建一个bin文件夹,build/bin
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) #将生成的可执行文件输出到指定路径
#EXECUTABLE_OUTPUT_PATH同样是旧的cmake变量,细节建议查询官方文档


set(CMAKE_BUILD_TYPE "Debug") #构建模式设置为Debug
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") #编译器参数 -g -Wall,这两行指令的目的为使生成的可执行文件包含调试信息,可调试







用第二种方法可以不用先在googletest-main文件夹中进行cmake

cmake完之后运行就可以看到结果啦

以上就是本篇的全部内容了,如有不足或错漏还请指出


https://www.bilibili.com/read/cv17586887/  



Python 反编译:pycdc工具的使用

Python 反编译:pycdc工具的使用


本篇文章将教大家如何用pycdc工具将.pyc文件转换为 Python 源代码,适用于 Python 3.9及更高版本。

1.下载工具

可以使用git拉取文件:

git clone https://github.com/zrax/pycdc.git

也可以去Github手动下载安装包:https://github.com/zrax/pycdc 程序的编译需要用到CMakeCMake的安装教程:https://blog.csdn.net/qq_63585949/article/details/127079529 除此之外,还可以下载我编译好的可执行文件,就不用自己编译了:https://download.csdn.net/download/qq_63585949/86724761 如果你是直接下载可执行文件,那你可以跳过下一节的安装部分。

2.安装使用

使用 IDE 打开pycdc文件夹,生成Makefile文件:

编译项目:

build文件夹中会生成编译后的文件,即pycdas.exepycdc.exe

这个pycdc.exe就是我们需要的工具了。 使用方法也很简单,只需要把pycdc.exe.pyc文件置于同一目录下:

终端输入以下指令:

./pycdc 文件名.pyc

终端就会输出对应的 Python 源代码了:

对比原始文件可以看出只是中文变成编码了,代码完全一致:

pycdc工具可以在 Python 3.9 及以上版本取代uncompyle6库来实现反编译。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

来自  https://cloud.tencent.com/developer/article/2163749


Python 反编译:pycdc工具的使用

  1. 下载工具

可以使用 git拉取文件:
git clone https://github.com/zrax/pycdc.git
也可以去 Github手动下载安装包: https://github.com/zrax/pycdc
程序的编译需要用到 CMake, CMake的安装教程: https://blog.csdn.net/qq_63585949/article/details/127079529

除此之外,还可以下载我编译好的可执行文件,就不用自己编译了:https://download.csdn.net/download/qq_63585949/86724761
如果你是直接下载可执行文件,那你可以跳过下一节的安装部分。

2.安装使用

使用 IDE 打开 pycdc文件夹,生成 Makefile文件:
图1

编译项目:
图2

build文件夹中会生成编译后的文件,即pycdas.exepycdc.exe
图3

这个pycdc.exe就是我们需要的工具了。

使用方法也很简单,只需要把pycdc.exe.pyc文件置于同一目录下:
图4

终端输入以下指令:

./pycdc 文件名.pyc
终端就会输出对应的 Python 源代码了:
图5

对比原始文件可以看出只是中文变成编码了,代码完全一致:
图6

pycdc工具可以在 Python 3.9 及以上版本取代uncompyle6库来实现反编译。


https://developer.aliyun.com/article/1069684  

https://blog.csdn.net/weixin_49649700/article/details/129072973

https://blog.csdn.net/m0_64206188/article/details/128359182

https://blog.csdn.net/thisiszdy/article/details/132512142

https://blog.csdn.net/lacoucou/article/details/107410753

https://blog.csdn.net/lacoucou/article/details/107410753





普通分类: