哈希模块
试着做了个 DLL to ShellCode 的实验性项目,除了兼容性不太行,塞这种纯算法类的东西倒是挺方便的。相比之前手动抠汇编的解决方案的体验好多了。再搭配自己整的一个配套的易语言胶水代码生成器,构建完后自动生成配套的代码文字,最后复制粘贴到一起即可(※ 本文不提供)。
以前听说有人做过 txt 转易语言代码的,要是集成起来就更方便了,一键出 .e 文件。
回到正题。这个模块本质上就是用 C++ 引入 Crypto++ 然后导出对应的接口来静态编译,最后把胶水代码放到易语言里面方便使用。
现在用起来就是无第三方 DLL 依赖、无 VC++ 运行时依赖、且兼容 XP(话说真的还有人用吗?)。
HMAC 部分是自己照着百科的说明写的,因为 Crypto++ 动态起来比较麻烦… 缺点就是这个实现可能在某些边界情况下存在错误(※ 可参考 src.zip
的代码,欢迎交流)。随便找了几个值来测试还没遇到问题。
对比现有方案
- 不依赖系统 API,因此可以在 XP 下跑 SHA256 等新的哈希算法。
- 相比 OpenSSL 数 M 的 DLL,这个项目对程序体积影响只有 +500K。
- 因为 ShellCode 的性质,可能对加密壳的支援不佳。
文件清单
src.zip
- 基于 Crypto++ 加解密库的 C++ 胶水代码。
ELangCrypto.e
- 模块源码… 不过基本没啥好改的。
哈希模块.ec
- 编译好的模块
哈希模块演示程序.e
- 一个简单的演示程序。
说明.txt
- 你正在阅读的这个文件
关于 Crypto++ 胶水代码的说明
在 VS 2017+ 导入 src.zip 的源码然后编译即可。
注意需要自行想办法链接 Crypto++ 库。
由于我不打算公开 DLL 转易语言 ShellCode 的工具/代码,因此,如果你希望进行魔改或二次开发,你需要自行寻找一个 DLL 内存加载模块/库来替代然后再继续。
当然,如果你有能力逆向分析我的这段 ShellCode 的加载过程并/或重建 DLL 文件,欢迎投稿到论坛的『脱壳破解区』。
碎碎念
- MinGW 静态编译出来的文件咋这么大…
- MSVC 好很多,但是即便是空的 C++ DLL + 静态链接也要 200K…
- 易语言用起来果然还是各种不爽…
爱飞的猫 ◆ 吾爱破解
于 2024 春
支持的哈希算法一览:
enum class hash_id_t : uint32_t {
/** @insecure */ kMD2 = 0,
/** @insecure */ kMD4,
/** @insecure */ kMD5,
/** @insecure */ kSHA1,
kSHA224 = 0x10,
kSHA256,
kSHA384,
kSHA512,
kSHA3_224 = 0x20,
kSHA3_256,
kSHA3_384,
kSHA3_512,
// 类似 SHA3,但是改了几个常量
kKeccak_224 = 0x30,
kKeccak_256,
kKeccak_384,
kKeccak_512,
kSM3 = 0x40,// 国密 SM3
/** @insecure */ kRipeMD_128 = 0x50,
kRipeMD_160,
/** @insecure */ kRipeMD_256,
kRipeMD_320,
kShake_128 = 0x60,
kShake_256,
kTiger = 0x70,
kWhirlpool = 0x80,
};
附:易语言的一些野路子汇编调用
.版本 2
.子程序 HMAC_新建, 整数型, 公开, 建立一个新的 HMAC 计算实例,使用完毕后使用 [HMAC_结束] 来获取对应的 HMAC 并释放资源。
.参数 哈希类型, 整数型, , 哈希类型,参考 [#哈希类型_] 常量。
.参数 密钥, 字节集, 参考, 用于认证的密钥。调用方应在调用结束后擦除密钥内的数据。
.局部变量 _临时_导出表, 整数型
_临时_导出表 = __ELangCrypto_导出表
置入代码 ({ 139, 69, 252, 201, 255, 96, 40 })
' | 8B45FC | mov eax , dword [ebp-04h] ; 拿到导出表地址
' | C9 | leave ; 退出当前函数
' | FF6028 | jmp dword [eax+28h] ; 跳转到正确的函数 (将所有参数转接到 C++ 导出的函数内)
返回 (0) ' 未使用的值
支持各类数据类型,什么字节集、可空、都不在话下:
// 易语言的“容器”结构体
struct Container {
uint32_t type_id;// 1: 字节集
uint32_t size; // 字节集: 字节数量
uint8_t data[0]; // 具体的数据,大小随意。
};
// 可空类型其实就是在多了个 BOOL 类型的参数
#define ELANG_OPTIONAL_ARG(arg_type, arg_name) arg_type arg_name, ELang::Bool arg_name##_optional
// 字节集到十六进制,用了两个可空类型。
ELANG_CRYPTO_EXPORT(char *)
ebin_to_hex(const ELang::Container **pp_input,
ELANG_OPTIONAL_ARG(ELang::Bool, upper),
ELANG_OPTIONAL_ARG(ELang::Bool, add_space));
// 对应的易语言声明
.版本 2
.子程序 字节集到十六进制, 文本型, 公开, 将对应数据转换到十六进制。
.参数 数据, 字节集, 参考, 要转换到十六进制的数据
.参数 大写, 逻辑型, 可空, 是否使用大写
.参数 添加空格, 逻辑型, 可空, 是否在每个字节中间添加空格
.局部变量 _临时_导出表, 整数型
_临时_导出表 = __ELangCrypto_导出表
置入代码 ({ 139, 69, 252, 201, 255, 96, 8 })
返回 (“”) ' 未使用的值
易语言哈希模块.v1.0.7z
(192.79 KB, 下载次数: 17)
易语言模块导出接口如下:
实测在 XP 下能正常使用 SHA256 计算超过 4G 的文件:
※ 不推荐使用 XP 操作系统,这个截图只是证明它可以在 XP 下运行。