yangboyd 发表于 2024-4-12 08:49

某财务软件dnspy分析

本帖最后由 yangboyd 于 2024-4-20 19:10 编辑

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




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

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

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

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


这里没用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恢复代码,省略代码解密部分。


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


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




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

什么财务软件?
页: [1] 2
查看完整版本: 某财务软件dnspy分析