Python程序的安全逆向(关于我的OPENAI的APIkey是如何被盗的)

简介: 本文介绍了如何使用C语言编写一个简单的文件加解密程序,并讨论了如何为编译后的软件添加图标。此外,文章还探讨了Python的.pyc、.pyd等文件的原理,以及如何生成和使用.pyd文件来增强代码的安全性。通过视频和教程,作者详细讲解了生成.pyd文件的过程,并分享了逆向分析.pyd文件的方法。最后,文章提到可以通过定制Python解释器来进一步保护源代码。

日记一个有趣的事件

看我之前的上一篇文章,可以知道,对于python程序的安全研究,是源自于我一个调用API的类chatgpt软件的编写。
既然要用到,API,那么key能否逆向出来呢
而我当初就干了一个很傻的操作,在下面我把用的我自己的API的魔改的软件,发布到github里,虽然说,同通过以上的学习,我考虑到了加密操作。
https://github.com/unique-Elven/HeyChat.git

但是很有意思的是软件的,发布过后没有多少天,我就收到了来自OPENAI的警告,很显然,我的APIkey泄露啦!!!
image.png

嘿嘿,通过这次的经历,也是第一次让我感受到了来自技术对抗的趣味性,可以想象,一个来自某国度的大佬,打开了我的程序,进行逆向拿到了我的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博客

ps: 基本的功能算是能实现,但是只能对单个文件进行加密,还不能对目录操作,这是后期可以改进的地方,而且加密算法过于简单,后期也可改别的算法,还没加反调试反反编译手段,直接就被逆了。

python-logo-4k-i6.jpg

pyd文件的初识

首先看吧,昨晚看了这么一篇文章,python .pyc .pyd .pyo文件的区别 - 知乎 (zhihu.com)

才知道有这么些原理。

[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博客

# 文件命名steup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("AutoUpdate.py")) # 这里填写的就是你的py文件参数,注意在同一目录下

为什么只生成了一个.c 没pyd.....原来在生成之前或许我们需要先做一个事情,那就是安装vs_buildtools,看上面的csdn教程好的!如此下报错解决:

image.png

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法-CSDN博客

这就是为什么有些软件安装不要改默认路径,尤其是开发环境,呜呜呜~(但是索性,我用的pyhton3.10已经足够智能了哦耶,不用改源码,只需要安装一下C++环境即可)

要使用的话就直接执行python setup.py build_ext --inplace

image.png

nice!成功@!!!

2023.11.11过来补个坑:必须要确保pyd文件里的库在其他python文件中要包含

紧接着又看了一下下面这位大佬来IDA破解pyd文件了。

pyd文件的逆向_哔哩哔哩_bilibili

学到了:

1.pyd的版本要和python一致------比如这个pyd是python3.7生成的。只能用python3.7的python来调用。
⒉.使用dir和help查看pyd文件的信息

print(help(导入的pyd名字))

print(dir(导入的pyd名字))

我看他是再ida定位到关键点后看不懂的函数查看对象协议 — Python 文档 - 菜鸟教程 (cainiaojiaocheng.com)文档即可!

跟着他的思路,我又寻找关键字符串逆出来了我上面自己生成的pyd文件!哎,技术的对抗永远都是道高一尺,魔高一丈

看下面又可以学习到一些经验,

python编译后的pyd爆破 - 知乎 (zhihu.com)

这位知乎老哥和我走的路很像,但是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

最后,说起逆向,吾爱--不得不提啦!目前感觉最佳的解决方案就是魔改定制python解释器!

手把手教你定制python解释器,保护你的python源代码 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

果然技术拼的还是谁玩的更底层呀!

相关文章
|
6天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
8天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
8081 19
|
12天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4381 10
资料合集|Flink Forward Asia 2024 上海站
|
20天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
12天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
8天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
1月前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
104583 10
|
7天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
642 40
|
5天前
|
弹性计算 运维 监控
阿里云云服务诊断工具:合作伙伴架构师的深度洞察与优化建议
作为阿里云的合作伙伴架构师,我深入体验了其云服务诊断工具,该工具通过实时监控与历史趋势分析,自动化检查并提供详细的诊断报告,极大提升了运维效率和系统稳定性,特别在处理ECS实例资源不可用等问题时表现突出。此外,它支持预防性维护,帮助识别潜在问题,减少业务中断。尽管如此,仍建议增强诊断效能、扩大云产品覆盖范围、提供自定义诊断选项、加强教育与培训资源、集成第三方工具,以进一步提升用户体验。
631 243
|
2天前
|
弹性计算 运维 监控
云服务测评 | 基于云服务诊断全方位监管云产品
本文介绍了阿里云的云服务诊断功能,包括健康状态和诊断两大核心功能。作者通过个人账号体验了该服务,指出其在监控云资源状态和快速排查异常方面的优势,同时也提出了一些改进建议,如增加告警配置入口和扩大诊断范围等。