目录
流程初始化总结
加壳阶段(用户使用加壳器时)
运行阶段(加壳后的程序被执行时)
一句话总结三者的关系
Stub 壳代码
Stub 壳代码
加壳器
流程初始化总结
加壳阶段(用户使用加壳器时)
12.GrkProDlg.cpp→ 用户点击“文件加壳”按钮 → 调用 Pack(m_ExeFilePath, 0x45)
Pack.cpp 中的 Pack() 函数(核心调度者)
调用 InitPE() 初始化 PE 信息
调用 XorCode() 对原程序代码段加密
LoadLibrary(L"Stub.dll") 加载壳模板
把关键参数(ImageBase、OEP、加密密钥、加密起始地址等)填入 g_stcParam
提取 Stub.dll 的代码段内容
调用 FixReloc() 修复壳代码的重定位
调用 AddSection() 把壳代码写入目标文件新增的区段
修改 PE 头中的入口点(OEP)指向壳代码
生成新的加壳文件 xxx_GrkPatk.exe
注意:
此时 Stub.dll只是被用来当“代码模板”,并不是让它运行,而是把它的机器码扣出来用。
运行阶段(加壳后的程序被执行时)
用户运行加壳后的 xxx_GrkPatk.exe
系统根据修改后的AddressOfEntryPoint,直接跳转到新区段的 Start() 函数(来自 Stub.cpp)
执行 Stub.cpp 中的 Start():
动态解析各种 API(LoadLibraryA、VirtualProtect、MessageBoxA 等)
弹出 “是否解密打开原有程序” 对话框
用户点“是”后:
对之前被加密的代码段进行异或解密
修改内存保护属性
跳转到原始程序的 OEP
原程序正常启动运行
一句话总结三者的关系
12.GrkProDlg.cpp:界面,用户操作入口,负责调用加壳功能。
Stub.cpp:壳的灵魂,定义了加壳后程序启动时要执行的保护代码,最终被打包进目标 exe。
Stub.dll:壳的载体/模板,Pack.cpp 通过加载它来“复制”壳代码,然后注入到被加壳的程序中。
调用逻辑链条:界面 (12.GrkProDlg.cpp) → Pack() 函数 → 加载 Stub.dll → 提取 Stub.cpp 编译后的机器码 → 注入目标程序
Stub 壳代码
壳代码解密跳转到原始程序的OEP程序入口点中
Stub.h 壳代码头文件生成全局变量并且生成提供给壳的cpp文件使用
Stub.cpp 壳代码生成全局结构变量
Stub.cpp 壳代码生成对应的函数 Getkernel32.dll GEtProcAddress xor 等函数
Stub.cpp Start初始化函数
将生成的Stub.cpp放入到壳代码中
Stub 壳代码
MFC 功能按钮增加
加壳器
加壳器主要功能就是加加密壳的功能给原始程序代码块区段进行加密操作
加壳器也就是对PE结构进行代码块的加密操作
初始化PE结构
异或加密 --- > 壳代码加密
获取区段数据
清空绑定导入表
修复重定位
新增区段
加壳打包函数