Loading... # 日记一个有趣的事件 看我之前的上一篇文章,可以知道,对于python程序的安全研究,是源自于我一个调用API的类chatgpt软件的编写。 既然要用到,API,那么key能否逆向出来呢 而我当初就干了一个很傻的操作,在下面我把用的我自己的API的魔改的软件,发布到github里,虽然说,同通过以上的学习,我考虑到了加密操作。 https://github.com/unique-Elven/HeyChat.git 但是很有意思的是软件的,发布过后没有多少天,我就收到了来自OPENAI的警告,很显然,我的APIkey泄露啦!!!  嘿嘿,通过这次的经历,也是第一次让我感受到了来自技术对抗的趣味性,可以想象,一个来自某国度的大佬,打开了我的程序,进行逆向拿到了我的key,这是一件两个人思维的碰撞的一件事,即使我们素未谋面! # 彩蛋 先补一个昨天的坑,C语言简单的写个程序实现对文件的加解密操作,对外行来说非常的nice够用了 ``` # include <stdio.h> void main(int argc, char* argv[]) { //命令行参数: // argc命令行参数个数 // argv自动存储每一个命令行参数,,,默认第0个是自身地址 int r,ret,ret1; char c; /* char srcFileName[15] = {0}; char dstFileName[15] = {0}; printf("输入你要读取的文件名:"); scanf("%s", srcFileName); printf("输入你要读取的文件名:"); scanf("%s", dstFileName); */ FILE* fpSrc, * fpDst; fpSrc = fopen(argv[1],"rb"); fpDst = fopen("tmp.jiami", "wb"); if (fpSrc == NULL || fpDst == NULL) { printf("文件打开失败!!!"); } while (1) { r = fread(&c, 1, 1, fpSrc); if (!r) break; c ^= 0x66; fwrite(&c, 1, 1, fpDst); } fclose(fpDst); fclose(fpSrc); //删除文件 //printf("%s",argv[1]); ret = remove(argv[1]); /* if (ret == 0) { printf("文件删除成功\n"); } else { printf("错误:不能删除该文件\n"); } */ //改名文件 ret1 = rename("tmp.jiami", argv[1]); /* if (ret1 == 0) { printf("文件改名成功\n"); } else { printf("错误:不能改名该文件\n"); } */ } ``` 然后给可以给编译出来的软件添加一个漂亮的图标 [visual studio 2019如何给应用程序增加图标\_csdnhuizhu的博客-CSDN博客](https://blog.csdn.net/csdnhuizhu/article/details/112271040) ps: 基本的功能算是能实现,但是只能对单个文件进行加密,还不能对目录操作,这是后期可以改进的地方,而且加密算法过于简单,后期也可改别的算法,还没加反调试反反编译手段,直接就被逆了。  # pyd文件的初识 首先看吧,昨晚看了这么一篇文章,[python .pyc .pyd .pyo文件的区别 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/429356020?utm_id=0) 才知道有这么些原理。 [python防止反编译,防逆向教程\_ 哔哩哔哩\_bilibili](https://www.bilibili.com/video/BV1Ke41157gC/?spm_id_from=333.880.my_history.page.click&vd_source=dd5715810863163a43d26ad62935a628) > ps: 丛上视频可知,还一种防破解的小思路,就是打包exe的时候,将主要的函数功能从外部import导入一个新的py文件,然后将新的py文件打包成exe,其实这种方法也是掩耳盗铃,因为在pyinstxtractor的工具反编译出来的文件夹里的PYZ-00.pyz_extracted目录下还是能看到你封装起来的库,应为这个文件就是放一些库的。 既然pyo已经被弃用,昨天已经对pyc做了研究,今天研究pyd 从上视频可知,还有第三种放方法,即使将封装好的库然后再打包成pyd文件,就可以进一步增强性 怎么生成pyd,视频中使用下面这种方式:写个py脚本 [python隐藏源码,生成pyd文件并调用的完整过程\_pyd文件怎么使用-CSDN博客](https://blog.csdn.net/StriveE2/article/details/124122033) ``` # 文件命名steup.py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("AutoUpdate.py")) # 这里填写的就是你的py文件参数,注意在同一目录下 ``` 为什么只生成了一个.c 没pyd.....原来在生成之前或许我们需要先做一个事情,那就是安装vs_buildtools,看上面的csdn教程好的!如此下报错解决:  [Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法-CSDN博客](https://blog.csdn.net/qq_43647590/article/details/130618279) 这就是为什么有些软件安装不要改默认路径,尤其是开发环境,呜呜呜~(但是索性,我用的pyhton3.10已经足够智能了哦耶,不用改源码,只需要安装一下C++环境即可) 要使用的话就直接执行`python setup.py build_ext --inplace`  nice!成功@!!! 2023.11.11过来补个坑:[必须要确保pyd文件里的库在其他python文件中要包含](https://blog.csdn.net/weixin_43414694/article/details/114790913) 紧接着又看了一下下面这位大佬来IDA破解pyd文件了。 [pyd文件的逆向\_哔哩哔哩\_bilibili](https://www.bilibili.com/video/BV1z94y1k7Dj/?spm_id_from=333.337.search-card.all.click&vd_source=dd5715810863163a43d26ad62935a628) > 学到了: > > 1.pyd的版本要和python一致------比如这个pyd是python3.7生成的。只能用python3.7的python来调用。 > ⒉.使用dir和help查看pyd文件的信息 > > print(help(导入的pyd名字)) > > print(dir(导入的pyd名字)) 我看他是再ida定位到关键点后看不懂的函数查看[对象协议 — Python 文档 - 菜鸟教程 (cainiaojiaocheng.com)](https://cainiaojiaocheng.com/Python/docs/2.7/c-api/object)文档即可! 跟着他的思路,我又寻找关键字符串逆出来了我上面自己生成的pyd文件!哎,技术的对抗永远都是道高一尺,魔高一丈 看下面又可以学习到一些经验, [python编译后的pyd爆破 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/357372838) 这位知乎老哥和我走的路很像,但是IDA那段令我学到了一些更底层的原理 > 总结一下: > > 大概所有的pyd都只有这个Pyinit一个导出函数,当这个pyd模块被其他py脚本import时会调用这个导出函数进行模块初始化。里面有一个关键的成员\_\_pyx\_moduledef\_slots,这个成员是一个结构体数组, > > 里面有个关键函数\ > > _\_pyx\_pymod\_exec\_util1负责初始化python脚本里的所有变量,函数,常量等等,把他们都对应到pyobject,然后就只使用这些pyobject了。所以汇编里看流程就很难,因为没有明显的明文了。 > > 定位到 \_\_pyx\_pymod\_exec\_util1后,我们主要的目的是找常量和pyobject的对照表,python脚本里的函数名和汇编函数的对照表,有这2个表,python脚本和汇编的对应关系就明朗了。这里就只能手动往下翻了。 > > 翻到类似调用 PyUnicode\_InternFromString 的地方,大概就是我们要找的常量对照表 > > ---------------aFunHello指向python脚本里的函数名。-------这里的funhello不是指全部的哈,是知乎示例代码的函数名----------下面的_fun_hello也一样 > > -------------_\_pyx\_pf\_5util1\_fun\_hello就是对应的汇编函数。--------------------------- > > 可以看到,只要找到这个表,就很容易定位我们要找的python脚本函数对应的汇编实现了。 > > 其实我们也可以不必如上这么麻烦。只要在.data段里翻一翻。或者string窗口找到感兴趣的字符串交叉引用也能很快找到这个表。 > > 需要知道的就是, aFunHello下面就是对应的汇编实现函数。 > > 现在终于可以去分析fun\_hello这个python脚本函数对应的汇编函数了。 还有个十几年的大牛:nb [[原创]某个 python IDE 注册过程分析-软件逆向-看雪-安全社区|安全招聘|kanxue.com](https://bbs.kanxue.com/thread-145705.htm) 最后,说起逆向,吾爱--不得不提啦!目前感觉最佳的解决方案就是魔改定制python解释器! [手把手教你定制python解释器,保护你的python源代码 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn](https://www.52pojie.cn/thread-1514691-1-1.html) 果然技术拼的还是谁玩的更底层呀! 最后修改:2024 年 12 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 3 如果觉得我的文章对你有用,请随意赞赏