有一个应用程序使用DLL Check
函数检查激活。如果激活应用程序,则Check
返回1,否则返回0。我创建了简单的应用程序和DLL包含函数MyCheck
(总是返回1)具有相同的签名和绕道Check
函数与我的版本使用MS绕道lib进行函数挂钩。显然它可以工作,应用程序被成功破解,所以我需要避免它。
我试图直接调用Check
函数(通过指定确切的地址),甚至没有使用GetProcAddress
,但看起来像绕行lib正在修改函数体本身,而不是导出表。 / p>
[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 module = Process.GetCurrentProcess()。MainModule; byte [] data = new byte [module.ModuleMemorySize]; Marshal.Copy(module.BaseAddress,data,0,module.ModuleMemorySize);
我在这里使用了MainModule,但它为Process.GetCurrentProcess().Modules
集合中的每个模块提供了相同的错误。
我很感激任何帮助,我不一定希望以我描述的方式解决它,任何好的解决方案都是可以接受的。
感谢。