title | author | date | CreateTime | categories |
---|---|---|---|---|
C#判断文件是否被混淆 |
lindexi |
2019-09-02 12:57:37 +0800 |
2018-2-13 17:23:3 +0800 |
C# |
可以使用混淆工具对一个DLL 和 exe 进行混淆。 但是如何知道一个文件是否已经混淆了。 在发布之前,需要知道是不是有文件忘了混淆。
要判断文件是否混淆,必须知道常用的混淆手法。
混淆就是因为编写的 C# 代码转换 IL ,可以很容易被反编译,从而知道了源代码,不利于保护软件,不利于防止破解。
所以可以通过混淆来让反编译困难。
但是经过混淆,只可以让好多反编译新手无法破解,对于大神,还是没有作用。
但是本文不讨论这个,还是来说下,常用的混淆。
-
混淆变量名
-
混淆流程
常见的也是混淆变量名,这也是本文的检测方法,对于混淆流程,暂时还没有方法。
简单方法去获得文件是否混淆变量名是反射。
可以通过加载文件,使用动态加载 DLL,然后使用反射判断文件变量名是否存在不可读字符,如果存在,那么文件被混淆。
代码:
class ApplicationProxy : MarshalByRefObject
{
private static readonly string[] ConfuseNameCharacteristics =
{
"u0001",
"u0002",
"u0003",
"u0004",
"u0005",
"u0006",
"u0007",
"u0008",
"u0009",
"u0010",
"u0011",
"u0012",
"u0013",
"u0014",
"u0015",
"u0016",
"u0017",
"u0018",
"u0019"
};
/// <summary>
/// 判断一个文件是否混淆
/// </summary>
/// <param name="file">文件是exe dll</param>
/// <returns></returns>
public ConfuseType CheckFileConfuse(FileInfo file)
{
try
{
var assembly = Assembly.LoadFile(file.FullName);
var types = assembly.GetTypes();
if (
types.Any(
type => ConfuseNameCharacteristics.Any(ch => type.FullName.Contains(ch) || PeeConfuseType(type))))
return ConfuseType.Confused;
return ConfuseType.NotConfused;
}
catch (ReflectionTypeLoadException)
{
return ConfuseType.NotSupported;
}
catch (Exception e)
{
if (e is BadImageFormatException || e is FileLoadException)
return ConfuseType.NotSupported;
throw;
}
}
/// <summary>
/// 判断type的方法是否有混淆
/// </summary>
/// <param name="type"></param>
private bool PeeConfuseType(Type type)
{
return ConfuseNameCharacteristics.Any(temp => type.GetFields().Any(field => field.Name.Contains(temp))) ||
ConfuseNameCharacteristics.Any(
temp => type.GetProperties().Any(property => property.Name.Contains(temp))) ||
ConfuseNameCharacteristics.Any(temp => type.GetMethods().Any(method => method.Name.Contains(temp)));
}
}