吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1452|回复: 14
收起左侧

[易语言 原创] 哈希模块 (Crypto++ 配合胶水代码)

  [复制链接]
爱飞的猫 发表于 2024-3-12 08:51
本帖最后由 爱飞的猫 于 2024-3-12 08:59 编辑

哈希模块

试着做了个 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 下运行。

免费评分

参与人数 8威望 +1 吾爱币 +35 热心值 +7 收起 理由
西风吹雪 + 1 谢谢@Thanks!
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 + 1 谢谢@Thanks!
cq3344520 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
冥界3大法王 + 4 + 1 难得版主姥爷发贴,得前排围观。
collinchen1218 + 3 + 1 厉害,确实方便不少
610100 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hdxzd12 + 2 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 爱飞的猫 发表于 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
我让它们动态的静态的,.NET的统统集体在一个程序里边出场。是不是有点异想天开了?那调试难度是不是直线上升?

点评

作为单独的 dll 文件存在的话,慢慢调就是。 .net 有暴力 dump 工具,程序跑起来直接转储分析就行了。 真想上难度还得靠加密壳配合 SDK。  详情 回复 发表于 2024-3-13 17:51
lfty89 发表于 2024-3-12 10:18
hdxzd12 发表于 2024-3-12 12:43
比较实用的工具
谢谢分享
collinchen1218 发表于 2024-3-12 19:54
本帖最后由 collinchen1218 于 2024-3-12 20:28 编辑

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

点评

… 重新定义原生? 如果你的意思是“安装好 IDE”就自带,那易语言确实没有自带 SHA256 计算支持。默认安装后就一个 MD5 计算。 如果指的是和 aardio 同样使用系统提供的 API 来实现各类哈希算法的话,已  详情 回复 发表于 2024-3-12 20:24
 楼主| 爱飞的猫 发表于 2024-3-12 20:24
collinchen1218 发表于 2024-3-12 19:54
额,一直觉得我自己用的编程语言太复杂,看到隔壁的易语言连个原生加密都不支持还要模块,突然发现好方便
...

… 重新定义原生?

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



如果指的是和 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呢?

点评

[md]> 既然易语言不支持,那么为什么不用c语言写核心,易语言加界面gui呢? 可以这么干,但如果都不介意用 C/C++ 写代码了,用标准资源做窗体开发的体验更好吧,且报毒现象能改善更多。这种情况不如全用 C++ 写更  详情 回复 发表于 2024-3-12 20:41
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 计算支持。默 ...

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

点评

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

如果你希望在某些文件被更改的时候得到通知,可以考虑使用 ReadDirectoryChangesW 或类似的接口让系统更改时通知你的程序。

“实时索引全盘文件的哈希”性能开销太大,不建议在这个场景下使用。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表