目录流程初始化总结加壳阶段用户使用加壳器时运行阶段加壳后的程序被执行时一句话总结三者的关系Stub 壳代码Stub 壳代码加壳器流程初始化总结加壳阶段用户使用加壳器时12.GrkProDlg.cpp→ 用户点击“文件加壳”按钮 → 调用 Pack(m_ExeFilePath, 0x45)Pack.cpp 中的 Pack() 函数核心调度者调用 InitPE() 初始化 PE 信息调用 XorCode() 对原程序代码段加密LoadLibrary(LStub.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()动态解析各种 APILoadLibraryA、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结构异或加密 --- 壳代码加密获取区段数据清空绑定导入表修复重定位新增区段加壳打包函数
windows 加壳工具代码实现01 - 整体项目流程梳理
目录流程初始化总结加壳阶段用户使用加壳器时运行阶段加壳后的程序被执行时一句话总结三者的关系Stub 壳代码Stub 壳代码加壳器流程初始化总结加壳阶段用户使用加壳器时12.GrkProDlg.cpp→ 用户点击“文件加壳”按钮 → 调用 Pack(m_ExeFilePath, 0x45)Pack.cpp 中的 Pack() 函数核心调度者调用 InitPE() 初始化 PE 信息调用 XorCode() 对原程序代码段加密LoadLibrary(LStub.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()动态解析各种 APILoadLibraryA、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结构异或加密 --- 壳代码加密获取区段数据清空绑定导入表修复重定位新增区段加壳打包函数