爱飞的猫 发表于 2024-3-12 08:51

哈希模块 (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:41

本帖最后由 爱飞的猫 于 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加密,因为作者已经把桥搭好

这就是本贴干的事情了,搭个桥~

不过社区足够活跃的话,也会有人分享对应的“桥”,只要引入后用就行。都是前人栽树、后人乘凉的情况。

易语言自带的支持库东西不是很多,还是靠社区提供各类稀奇古怪的第三方模块/支持库来填充功能。

冥界3大法王 发表于 2024-3-13 10:35

@爱飞的猫
难得版主姥爷发贴,得前排围观。

比方说,我用Delphi编译了一个64位的DLL ,或者是一个32位。。。DLL
我让那个32位的EXE ,或64位的EXE 来调用,能成立吗?
若是能成立是不是可以弄个混合大串联,Delphi的程序里边有自己,还有易语言,还有其他各种杂合进来的其他语言的DLL{:301_975:}
我让它们动态的静态的,.NET的统统集体在一个程序里边出场。是不是有点异想天开了?那调试难度是不是直线上升?

lfty89 发表于 2024-3-12 10:18

不错!!!!

hdxzd12 发表于 2024-3-12 12:43

比较实用的工具
谢谢分享

collinchen1218 发表于 2024-3-12 19:54

本帖最后由 collinchen1218 于 2024-3-12 20:28 编辑

额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个加密都没有还要第三方模块,突然发现好方便,但是还是插件,只是作者自己写的
import crypt;
crypt.sha256(str)

爱飞的猫 发表于 2024-3-12 20:24

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:25

本帖最后由 collinchen1218 于 2024-3-12 20:27 编辑

爱飞的猫 发表于 2024-3-12 20:24
… 重新定义原生?

如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默 ...
确实,因为社区力量不行,我想换go了。
还有,我想知道,既然易语言不支持,那么为什么不用c语言写核心,易语言加界面gui呢?

collinchen1218 发表于 2024-3-12 20:31

collinchen1218 发表于 2024-3-12 19:54
额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个加密都没有还要第三方模块,突然发现好方便, ...

当然,可能描述问题,我只是想说,我用的那款,我不必去思考如何去使用sha256加密,因为作者已经把桥搭好了,方便了使用者

hdxzd12 发表于 2024-3-12 21:23

爱飞的猫 发表于 2024-3-12 20:24
… 重新定义原生?

如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默 ...

这个东西能不能配合全盘监控一起使用???

爱飞的猫 发表于 2024-3-12 21:48

20230713G001133 发表于 2024-3-12 21:23
这个东西能不能配合全盘监控一起使用???
如果你希望在某些文件被更改的时候得到通知,可以考虑使用 [`ReadDirectoryChangesW`](https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-readdirectorychangesw) 或类似的接口让系统更改时通知你的程序。

“实时索引全盘文件的哈希”性能开销太大,不建议在这个场景下使用。
页: [1] 2
查看完整版本: 哈希模块 (Crypto++ 配合胶水代码)