哈希模块 (Crypto++ 配合胶水代码)
本帖最后由 爱飞的猫 于 2024-3-12 08:59 编辑## 哈希模块
试着做了个 DLL to ShellCode 的实验性项目,除了兼容性不太行,塞这种纯算法类的东西倒是挺方便的。相比之前[手动抠汇编](https://www.52pojie.cn/thread-1840664-1-1.html)的解决方案的体验好多了。再搭配自己整的一个配套的易语言胶水代码生成器,构建完后自动生成配套的代码文字,最后复制粘贴到一起即可(※ 本文不提供)。
以前听说有人做过 txt 转易语言代码的,要是集成起来就更方便了,一键出 .e 文件。
回到正题。这个模块本质上就是用 C++ 引入 (https://github.com/weidai11/cryptopp) 然后导出对应的接口来静态编译,最后把胶水代码放到易语言里面方便使用。
现在用起来就是无第三方 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 文件,欢迎投稿到论坛的[『脱壳破解区』](https://www.52pojie.cn/forum-5-1.html)。
## 碎碎念
- MinGW 静态编译出来的文件咋这么大…
- MSVC 好很多,但是即便是空的 C++ DLL + 静态链接也要 200K…
- 易语言用起来果然还是各种不爽…
> 爱飞的猫 ◆ 吾爱破解
> 于 2024 春
---
支持的哈希算法一览:
```cpp
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 并释放资源。
.参数 哈希类型, 整数型, , 哈希类型,参考 [#哈希类型_] 常量。
.参数 密钥, 字节集, 参考, 用于认证的密钥。调用方应在调用结束后擦除密钥内的数据。
.局部变量 _临时_导出表, 整数型
_临时_导出表 = __ELangCrypto_导出表
置入代码 ({ 139, 69, 252, 201, 255, 96, 40 })
' | 8B45FC | mov eax , dword ; 拿到导出表地址
' | C9 | leave ; 退出当前函数
' | FF6028 | jmp dword ; 跳转到正确的函数 (将所有参数转接到 C++ 导出的函数内)
返回 (0)' 未使用的值
```
支持各类数据类型,什么字节集、可空、都不在话下:
```cpp
// 易语言的“容器”结构体
struct Container {
uint32_t type_id;// 1: 字节集
uint32_t size; // 字节集: 字节数量
uint8_t data; // 具体的数据,大小随意。
};
// 可空类型其实就是在多了个 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 })
返回 (“”)' 未使用的值
```
易语言模块导出接口如下:
![](https://imgsrc.baidu.com/forum/pic/item/c83d70cf3bc79f3d3a89680afca1cd11728b29a4.png)
---
实测在 XP 下能正常使用 SHA256 计算超过 4G 的文件:
![](https://imgsrc.baidu.com/forum/pic/item/6159252dd42a283460d1ba311db5c9ea15cebf91.png)
※ 不推荐使用 XP 操作系统,这个截图只是证明它可以在 XP 下运行。 本帖最后由 爱飞的猫 于 2024-3-12 20:45 编辑
collinchen1218 发表于 2024-3-12 20:25
确实,因为社区力量不行,我想换go了。
还有,我想知道,既然易语言不支持,那么为什么不用c语言写核心 ...
> 既然易语言不支持,那么为什么不用c语言写核心,易语言加界面gui呢?
可以这么干,但如果都不介意用 C/C++ 写代码了,用标准资源做窗体开发的体验更好吧,且报毒现象能改善更多。这种情况不如全用 C++ 写更方便了。
> 因为社区力量不行,我想换go了。
用起来舒服就好。不过我不清楚用 go-lang 做 GUI 方不方便、无障碍(Accessibility)支持到哪个地步。
C# 和 Java (含 Kotlin 等衍生语言) 可能对桌面应用程序开发的支持更好,如果还没决定好的话可以考虑一下。缺点就是运行时比较大。
---
> 我不必去思考如何去使用sha256加密,因为作者已经把桥搭好
这就是本贴干的事情了,搭个桥~
不过社区足够活跃的话,也会有人分享对应的“桥”,只要引入后用就行。都是前人栽树、后人乘凉的情况。
易语言自带的支持库东西不是很多,还是靠社区提供各类稀奇古怪的第三方模块/支持库来填充功能。 @爱飞的猫
难得版主姥爷发贴,得前排围观。
比方说,我用Delphi编译了一个64位的DLL ,或者是一个32位。。。DLL
我让那个32位的EXE ,或64位的EXE 来调用,能成立吗?
若是能成立是不是可以弄个混合大串联,Delphi的程序里边有自己,还有易语言,还有其他各种杂合进来的其他语言的DLL{:301_975:}
我让它们动态的静态的,.NET的统统集体在一个程序里边出场。是不是有点异想天开了?那调试难度是不是直线上升? 不错!!!! 比较实用的工具
谢谢分享 本帖最后由 collinchen1218 于 2024-3-12 20:28 编辑
额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个加密都没有还要第三方模块,突然发现好方便,但是还是插件,只是作者自己写的
import crypt;
crypt.sha256(str) collinchen1218 发表于 2024-3-12 19:54
额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个原生加密都不支持还要模块,突然发现好方便
...
… 重新定义原生?
如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默认安装后就一个 MD5 计算。
https://imgsrc.baidu.com/forum/pic/item/faf2b2119313b07eaa5ea5324ad7912397dd8c2d.png
如果指的是和 aardio 同样使用系统提供的 API 来实现各类哈希算法的话,已经有人分享过模块/源码了。
PS:不要引战嗷。就我自己的观点来看,真方便还得看 C# / Java / JavaScript,自带一大堆有用没用的东西、社区的第三方包也丰富。 本帖最后由 collinchen1218 于 2024-3-12 20:27 编辑
爱飞的猫 发表于 2024-3-12 20:24
… 重新定义原生?
如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默 ...
确实,因为社区力量不行,我想换go了。
还有,我想知道,既然易语言不支持,那么为什么不用c语言写核心,易语言加界面gui呢? collinchen1218 发表于 2024-3-12 19:54
额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个加密都没有还要第三方模块,突然发现好方便, ...
当然,可能描述问题,我只是想说,我用的那款,我不必去思考如何去使用sha256加密,因为作者已经把桥搭好了,方便了使用者 爱飞的猫 发表于 2024-3-12 20:24
… 重新定义原生?
如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默 ...
这个东西能不能配合全盘监控一起使用??? 20230713G001133 发表于 2024-3-12 21:23
这个东西能不能配合全盘监控一起使用???
如果你希望在某些文件被更改的时候得到通知,可以考虑使用 [`ReadDirectoryChangesW`](https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-readdirectorychangesw) 或类似的接口让系统更改时通知你的程序。
“实时索引全盘文件的哈希”性能开销太大,不建议在这个场景下使用。
页:
[1]
2