Skip to main content

NET程序保护常见问题

1.保护程序时,实时日志有时为何会有block at 0x000X not encrypt by same rva

答:这是主动输出的日志,是.net虚拟化时,一些小函数体内容一样,被方法元数据分配了同一个rva,因为编译后的IL指令相同,所以编译优化后不同的函数指向相同的地址,基本都是很小很简单的方法,这种函数会跳过。

2.为什么有的.net程序拖入到加壳工具中不显示名称混淆选项?

答:引用web接口,system.web,加壳工具检测到此类函数的时候直接给过滤掉,所以不显示名称混淆选项。

3.C#运行自动触发崩溃后的堆栈信息,使用代码加密后,异常信息为什么会改变?

答:代码加密、代码虚拟化会改变调用栈,原因加密方法的IL代码运行时通过.NET动态方法技术反射调用方法,由于使用了动态方法,所以方法调用堆栈会增加几项;

如果获取堆栈信息的代码是取了固定的几层信息,那么该函数加密运行后,获取堆栈信息的位置就不对了,所以导致获取堆栈信息异常,若堆栈信息中显示乱码,是因为我们的loader中的方法做了名称混淆,故而显示乱码,属于正常现象。

代码混淆、压缩和JIT加密不会改变调用栈,打印的异常信息会正常显示。

4.net函数虚拟化不支持的情况有哪些?

1) 函数含有 out 参数的调用者以及被调用者暂时不支持;2)ld***a 和st***a 目前主要就是这种地址操作暂时不支持;(ldarga/ldloca/ldind/stind/ldflda/ldsflda/ldelema/refanyval/ckfinite/mkrefany/arglist/localloc/unaligned/volatile/tail/constrained/cpblk/initblk/no/refanytype/readonly)包括以上地址的操作暂时不支持;3) 有的调用指令可能也不支持特定的方法类型(byref),但是这个只能在运行的时候看出来,会抛异常 NotSupportedException,vm not support for method: xxx;

5.JIT加密功能 能防止字符串和函数名不在内存中显示出来么?

答:不能,函数名只能依靠名称混淆。

6.C#程序,类上可以加标签么?

答:可以,命名空间不能加标签。