3

CheckDLL関数を使用してアクティベーションをチェックするアプリケーションがあります。Checkアプリケーションがアクティブ化されている場合は1を返し、それ以外の場合は0を返します。関数フックにMS迂回ライブラリを使用してMyCheck、同じ署名と迂回関数を使用して、関数(常に1を返す)を含む単純なアプリケーションとDLLを作成します。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 module = Process.GetCurrentProcess()。MainModule; byte [] data = new byte [module.ModuleMemorySize]; Marshal.Copy(module.BaseAddress、data、0、module.ModuleMemorySize);

ここではMainModuleを使用しましたが、Process.GetCurrentProcess().Modulesコレクション内の各モジュールで同じエラーが発生します。

私はこれについて助けていただければ幸いです。私が説明する方法の1つでそれを解決することを必ずしも期待しているわけではありません。どんな良い解決策も受け入れられます。

ありがとう。

4

0 に答える 0