关于 使用 GPT 自动生成反调试代码详解
一、核心目标
我们将构建一个“AI驱动的反调试注入器”:
-
每次运行都自动调用 GPT 生成新的反调试逻辑
-
把这段逻辑插入到目标代码(Python / JavaScript)入口点
-
通过
base64
+eval
等方式混淆执行逻辑 -
输出一个经过反调试保护的程序版本
二、原理拆解
阶段 | 说明 |
---|---|
Prompt 设计 | 用自然语言写好提示词,引导 GPT 生成反调试逻辑 |
API 调用 | 自动调用 OpenAI API 获取代码 |
代码注入 | 把反调试代码插入主代码逻辑前(如 main() 之前) |
混淆处理 | 对这段代码 base64 编码 + 异或扰动 |
输出构建 | 写入新文件,如 main_protected.py |
三、准备工作
安装依赖
pip install openai
如果没有 GPT 账号,可以改为使用 OpenSource 模型(如 Ollama + CodeLlama),此文默认用 OpenAI GPT-4。
创建项目结构
project/
├── main.py # 原始逻辑
├── builder.py # 自动构建工具
└── prompts/├── python1.txt # Prompt 模板1└── python2.txt # Prompt 模板2
四、Prompt 设计示例
在 prompts/python1.txt
中写入如下内容:
你是一个高级安全专家,帮我写一段 Python 反调试代码,要求:
1. 检查是否存在调试器(sys、ctypes、os 任意使用)
2. 混淆变量名、字符串(可以用 chr、拼接、异或等)
3. 一旦发现调试器,立刻退出或进入死循环
4. 总逻辑不要超过 10 行代码
五、自动构建脚本:builder.py
创建一个自动化工具,每次运行时都:
-
随机选择一个 prompt
-
调用 GPT 接口生成反调试代码
-
加密它(用 base64)
-
插入到主程序前
-
输出一个
main_protected.py
builder.py 完整代码:
import openai # 导入 OpenAI 的 Python SDK,用于调用 GPT 接口
import random # 导入 random 模块,用于从多个 prompt 文件中随机选择一个
import base64 # 导入 base64 模块,用于编码/解码反调试代码openai.api_key = "你的OpenAI API密钥" # 设置 OpenAI 的 API 密钥def load_prompt(): # 定义函数用于加载提示词内容prompts = ["prompts/python1.txt", "prompts/python2.txt"] # 可选的提示词文本文件路径列表with open(random.choice(prompts), "r", encoding="utf-8") as f: # 随机选择一个提示词文件并打开return f.read() # 读取文件内容并返回def get_antidebug_code(prompt): # 定义函数,用于从 GPT 模型生成反调试代码response = openai.ChatCompletion.create( # 调用 OpenAI Chat 接口生成内容model="gpt-4", # 指定使用 GPT-4 模型messages=[{"role": "user", "content": prompt}], # 使用用户提供的 prompt 作为对话输入temperature=0.8 # 设置生成随机性,0.8 较高,生成内容更加多样)return response['choices'][0]['message']['content'] # 提取生成的反调试代码内容并返回def encrypt_code(code): # 定义函数,将反调试代码加密(编码)为 base64 格式encoded = base64.b64encode(code.encode()).decode() # 将代码字符串编码成 base64 格式wrapper = f""" # 构造一个 Python 代码块,用 base64 解码后执行反调试代码
import base64
exec(base64.b64decode("{encoded}").decode())
"""return wrapper # 返回封装后的反调试代码字符串def inject_code(): # 定义主逻辑函数,将反调试代码注入到主程序中with open("main.py", "r", encoding="utf-8") as f: # 打开主程序 main.py 读取原始逻辑代码main_code = f.read() # 读取 main.py 的全部内容prompt = load_prompt() # 加载一个随机的提示词antidebug = get_antidebug_code(prompt) # 使用 GPT 生成反调试代码protected = encrypt_code(antidebug) # 将反调试代码 base64 编码并封装为可执行代码with open("main_protected.py", "w", encoding="utf-8") as f: # 打开输出文件 main_protected.pyf.write(protected + "\n\n" + main_code) # 将加密反调试段放在前面,然后是原始主程序代码print("[] 已生成 main_protected.py") # 输出提示,说明生成成功if __name__ == "__main__": # 如果当前脚本作为主程序运行inject_code() # 执行注入函数,完成反调试保护逻辑
六、示例生成结果
假设 GPT 返回如下反调试逻辑:
import sys, ctypes
if sys.gettrace() or ctypes.windll.kernel32.IsDebuggerPresent():while True: pass
会被 base64 编码并插入为:
import base64
exec(base64.b64decode("aW1wb3J0IHN5cyxjdHlwZXMKaWYgc3lzLmdldHRyYWNlKCkgb3IgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5Jc0RlYnVnZ2VyUHJlc2VudCgpOgogICAgd2hpbGUgVHJ1ZTogcGFzcwo=").decode())# 原始逻辑
print("hello world")
七、改进建议
功能 | 做法 |
---|---|
异或加密代码段 | ''.join(chr(ord(c)^13) for c in code) ,运行时还原 |
多语言支持 | 添加 JS、Java prompt,多语言插入逻辑 |
多位置插入 | 除了 main() 前,还可以插到函数体内、模块初始化处 |
多段生成 | prompt 控制 GPT 返回多个函数组合,提高复杂度 |
模型本地化 | 使用 Ollama + LLaMA2/CodeLlama,无需联网调用 |