3

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

  1. 我试图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
        }
    }
    

    }

  2. 然后我尝试读取函数体,我发现绕道后 MD5 校验和与原始校验和不同。所以我试图读取内存中DLL的全部内容并检查它以确认DLL内容没有改变,但它也不起作用。它抛出AccessViolationException

    Process.EnterDebugMode();

    ProcessModule 模块 = Process.GetCurrentProcess().MainModule; 字节[] 数据 = 新字节[module.ModuleMemorySize]; Marshal.Copy(module.BaseAddress, data, 0, module.ModuleMemorySize);

我在这里使用了 MainModule,但它对Process.GetCurrentProcess().Modules集合中的每个模块都给出了相同的错误。

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

谢谢。

4

0 回答 0