Check
有一个使用 DLL函数检查激活的应用程序。Check
如果应用程序被激活,则返回 1,否则返回 0。我使用 MS detours lib 进行函数挂钩,创建了简单的应用程序和包含函数(始终返回 1)的简单应用程序和 DLL ,该函数具有与我的版本MyCheck
相同的签名和迂回函数。Check
显然它可以工作并且应用程序被成功破解,所以我需要避免它。
我试图
Check
直接调用函数(通过指定确切的地址),甚至不使用GetProcAddress
,但看起来 detours lib 正在修改函数体本身,而不是导出表。[UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate bool CheckFunctionDelegate(); static void Main(string[] args) { ProcessModule module = Process.GetCurrentProcess().Modules .Cast<ProcessModule>() .First(m => m.ModuleName == "licensing_check.dll"); IntPtr procedurePtr = IntPtr.Add(module.BaseAddress, 0x00003FF0); // Calling validation function by pointer CheckFunctionDelegate checkFunction = (CheckFunctionDelegate) Marshal.GetDelegateForFunctionPointer(procedurePtr, typeof(CheckFunctionDelegate)); if (checkFunction()) { // do some stuff } }
}
然后我尝试读取函数体,我发现绕道后 MD5 校验和与原始校验和不同。所以我试图读取内存中DLL的全部内容并检查它以确认DLL内容没有改变,但它也不起作用。它抛出
AccessViolationException
。Process.EnterDebugMode();
ProcessModule 模块 = Process.GetCurrentProcess().MainModule; 字节[] 数据 = 新字节[module.ModuleMemorySize]; Marshal.Copy(module.BaseAddress, data, 0, module.ModuleMemorySize);
我在这里使用了 MainModule,但它对Process.GetCurrentProcess().Modules
集合中的每个模块都给出了相同的错误。
我将不胜感激,我不一定希望以我描述的一种方式解决它,任何好的解决方案都是可以接受的。
谢谢。