某财务软件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: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只能用于分析和调试目的,不能直接执行。 170077000 发表于 2024-4-12 12:23
什么软件也没说等于没说
某财务软件的旧版本(T+16) 后面的T+16 做财务的就晓得了用友畅捷通T+16版本 太深奥了 什么软件也没说等于没说 这个软件看着是混淆过了。 深,建议最好增加一个 初,中,高 级别。 告诉下软件名字。学习一下。 光看这个图,真没看懂啥 啥意思啊 看不懂,太深奥了 什么财务软件?
页:
[1]
2