防止绕行功能。避免开裂

时间:2012-11-07 19:26:11

标签: c# .net winapi cracking detours

有一个应用程序使用DL​​L Check函数检查激活。如果激活应用程序,则Check返回1,否则返回0。我创建了简单的应用程序和DLL包含函数MyCheck(总是返回1)具有相同的签名和绕道Check函数与我的版本使用MS绕道lib进行函数挂钩。显然它可以工作,应用程序被成功破解,所以我需要避免它。

  1. 我试图直接调用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
        }
    }
    

    }

  2. 然后我尝试读取功能体,我看到绕道后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);

  3. 我在这里使用了MainModule,但它为Process.GetCurrentProcess().Modules集合中的每个模块提供了相同的错误。

    我很感激任何帮助,我不一定希望以我描述的方式解决它,任何好的解决方案都是可以接受的。

    感谢。

0 个答案:

没有答案