吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3720|回复: 19
收起左侧

[.NET逆向] 某财务软件dnspy分析

  [复制链接]
yangboyd 发表于 2024-4-12 08:49
本帖最后由 yangboyd 于 2024-4-20 19:10 编辑

某财务软件的旧版本(T+16),新版本不适应。
关键函数被加密处理,在内存中解密指令串并产生DynamicMethod调用,这部分代码做了函数名变量名混淆。

1

1



C# 中的 System.Reflection.Emit.DynamicMethod 类允许开发者在运行时动态地生成和执行托管代码。这意味着你可以在程序运行过程中创建一个新的方法,并且能够控制这个方法的IL(中间语言 Intermediate Language)代码,从而实现非常灵活的动态编程能力。

具体来说,DynamicMethod 主要用途包括但不限于:

动态代{过}{滤}理:创建运行时代{过}{滤}理类以拦截方法调用,实现AOP(面向切面编程)的功能。
性能优化:在特定场景下,根据运行时条件生成优化过的代码,避免使用反射带来的性能损失。
动态编译表达式:类似于 LINQ Expression Trees,可以用来构建并执行复杂的表达式或逻辑,尤其是在需要高效执行的情况下。
兼容性层:在不同版本的.NET框架之间提供一种编写通用代码的方式,特别是在处理一些运行时特性不一致的情况时。
轻量级脚本引擎:作为简易的脚本环境的一部分,可以动态地执行用户定义的方法。
使用 DynamicMethod 创建的方法不需要与任何已存在的类型关联,它可以拥有指定的返回类型和参数列表,并可以选择绑定到特定的类型闭包(即该方法可以访问其所在模块或类型内的私有成员)。生成的方法可以直接通过 .Invoke() 方法来执行,无需事先编译为一个完整的类型或程序集。

例如,你可以用 DynamicMethod 实现两个对象间属性的快速拷贝,或者动态生成一个符合某种运算规则的方法。然而,这种灵活性也意味着使用时需谨慎,因为不当使用可能会导致运行时错误,同时由于绕过了编译器的静态类型检查,可能引入难以调试的问题。

解密产生的代码会放入字典中存储,下次直接调用。

2

2


这里没用ILGenerator的方式添加ILCode指令,而是直接恢复ILCode指令块字节。
先获得DynamicMethod的DynamicILInfo
DynamicMethod.GetDynamicILInfo()       
Returns a DynamicILInfo object that can be used to generate a method body from metadata tokens, scopes, and Microsoft intermediate language (MSIL) streams.

再调用DynamicILInfo.SetCode()设置代码字节数组
Sets the code body of the associated dynamic method.
public void SetCode (byte[]? code, int maxStackSize);
某处直接调用DynamicILInfo.SetCode恢复代码,省略代码解密部分。

3

3


这是存放动态生成函数的DynamicMethod

4

4


这是从DynamicMethod中恢复出来的被加密的代码,可以对里面用到的函数作Hook,比如GetUsers(),使之返回我们想要的值。

5

5




免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
爱飞的猫 + 7 + 1 写得比较简洁哦 此外可以尝试使用代码框展示代码片段。

查看全部评分

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

3yu3 发表于 2024-4-16 08:26
本帖最后由 3yu3 于 2024-4-16 08:42 编辑

How to get an IL bytearray from a DynamicMethod? 涉及的东西太多了。

如何从DynamicMethod获取IL bytearray?
从DynamicMethod获取IL bytearray的方法如下:
  • 首先,创建一个DynamicMethod对象,指定方法的名称、返回类型和参数类型。例如,创建一个返回整数类型的方法,没有参数:DynamicMethod dynamicMethod = new DynamicMethod("MyMethod", typeof(int), null);
  • 获取DynamicMethod的IL生成器(ILGenerator),用于生成IL指令序列。通过调用DynamicMethod的GetILGenerator方法来获取ILGenerator对象:ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
  • 使用ILGenerator对象来生成IL指令序列。IL指令是一种低级的指令集,用于定义方法的操作。可以使用ILGenerator的各种方法来生成不同的IL指令。例如,使用Emit方法生成一个将整数值1压入堆栈的指令:ilGenerator.Emit(OpCodes.Ldc_I4_1);
  • 完成IL指令的生成后,调用ILGenerator的CreateDelegate方法来创建一个委托,该委托可以被调用以执行动态生成的方法:Func<int> dynamicDelegate = (Func<int>)dynamicMethod.CreateDelegate(typeof(Func<int>));
  • 调用委托以执行动态生成的方法,并获取返回值:int result = dynamicDelegate();
  • 获取IL bytearray的方法是通过使用ILGenerator的GetILAsByteArray方法。这将返回一个表示动态生成的方法的IL指令序列的字节数组:byte[] ilBytes = ilGenerator.GetILAsByteArray();
通过上述步骤,你可以从DynamicMethod获取IL bytearray。请注意,IL bytearray只能用于分析和调试目的,不能直接执行。
janny82 发表于 2024-4-19 09:07
170077000 发表于 2024-4-12 12:23
什么软件也没说  等于没说

某财务软件的旧版本(T+16)   后面的T+16 做财务的就晓得了  用友畅捷通T+16版本
无敌小儿 发表于 2024-4-12 11:28
170077000 发表于 2024-4-12 12:23
什么软件也没说  等于没说
adld 发表于 2024-4-12 14:47
这个软件看着是混淆过了。
ZHOUJIAN75 发表于 2024-4-12 18:44
深,建议最好增加一个 初,中,高 级别。
xtkj 发表于 2024-4-13 08:17
告诉下软件名字。学习一下。
tydzjing 发表于 2024-4-13 12:33
光看这个图,真没看懂啥
xfaxf77 发表于 2024-4-13 15:18
啥意思啊
13557455543 发表于 2024-4-13 15:27
看不懂,太深奥了
ZhanKJ 发表于 2024-4-13 16:21
什么财务软件?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 01:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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