如何结交.NET和IDA Pro朋友(关于C#和C ++友谊)



问候,



首先,关于问题/任务:

IDA Pro下开始为Retro Platform编写另一个调试器插件(秘密:它将是SNES)之后,我遇到了以下需要成为朋友的集合:



  1. 仿真器内核用C ++编写,并编译为DLL
  2. 仿真器GUI用C#编写,并使用内核DLL来控制仿真。
  3. IDA Pro, , C++ DLL ( C++)


- IDA ( , , ..) , IDA .



( ), :



1) LoadLibrary("emu_core.dll"), GetProcAddress(core, "Pause") pause(), , , .



: — ( , GUI )! , , , , DLL-, , , UI, .



, DLL- IDA, . .



2) - -, , — GUI, RPC-.



, :



  • IDA (, , reset), .. , , , .
  • . , , , , RPC .




COM. , , RPC . , , WinAPI (.. C/C++) — C#.



.. GUI , . COM-.



:



1) , COM, [ComVisible(true)]. , - , ( , , )



2) , , ( IDA). ( ComVisible):



[Guid("7710855F-D37B-464B-B645-972BAB2706D4")]  // Visual Studio    GUID-  
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface IDebugApi


3) , DebugCOM:



[Guid("6AF9F5DD-6626-4E35-BEF4-29A73E18A739")]
[ComVisible(true)]
public class DebugCOM : IDebugApi


4) ( ) (Class Library), . DebugCOM.dll



5) tlbexp.exe Visual Studio ( Developer Command Prompt) DLL TLB. , ..



:



tlbexp DebugCOM.dll /out:DebugCOM.tlb


COM, :



Assembly exported to 'DebugCOM.tlb'


, . :



TlbExp
TlbExp : warning TX801311B0 : Type library exporter warning processing 'AddressInfo.Type, DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'InteropBreakpoint.MemoryType, DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.GetMemorySize(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.GetMemoryValue(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.SetMemoryValue(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.SetMemoryValues(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.SetMemoryState(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.GetMemoryState(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.GetMemoryAccessCounts(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.
TlbExp : warning TX801311B0 : Type library exporter warning processing 'IDebugApi.GetMemoryAccessCounts2(type), DebugCOM'. Warning: Non COM visible value type 'SnesMemoryType' is being referenced either from the type currently being exported or from one of its base types.


, SnesMemoryType ComVisible(true). .



6) TLB- (File->View TypeLib...) ComView. :



c:\Windows\Microsoft.NET\Framework\v4.0.30319\ComView.exe


IDL:





File->Save as... IDL-.



7) IDL- C++ , , , DebugCOM:







8) IDL- Compile Ctrl+F7. , : DebugCOM_h.h DebugCOM_i.c. ( ), .





, C# , . C/C++. C#.



9) - .h .c , , . :



COM C++
#include <atlbase.h>
#include <iostream>

#include "DebugCOM_h.h"
#include "DebugCOM_i.c"

int main(int argc, char* argv[]) {
    HRESULT hr;

    hr = ::CoInitializeEx(0, COINITBASE_MULTITHREADED);
    if (FAILED(hr))
    {
        std::cout << "CoInitializeEx failure: " << std::hex << std::showbase << hr << std::endl;
        return EXIT_FAILURE;
    }

    CLSID CLSID_server;
    hr = ::CLSIDFromString(L"{6AF9F5DD-6626-4E35-BEF4-29A73E18A739}", &CLSID_server);
    if (FAILED(hr))
    {
        std::cout << "CLSIDFromString failure: " << std::hex << std::showbase << hr << std::endl;
        return EXIT_FAILURE;
    }

    CComPtr<IDebugApi> server;

    hr = ::CoCreateInstance(CLSID_server, nullptr, CLSCTX_LOCAL_SERVER, __uuidof(IDebugApi), (void**)&server);
    if (FAILED(hr))
    {
        std::cout << "CoCreateInstance failure: " << std::hex << std::showbase << hr << std::endl;
        return EXIT_FAILURE;
    }

    DebugState state = {};
    hr = server->GetState(&state);
    if (FAILED(hr))
    {
        std::cout << "GetState failure: " << std::hex << std::showbase << hr << std::endl;
        return EXIT_FAILURE;
    }

    std::cout << "PC Address: " << std::hex << std::showbase << state.Cpu.PC << std::endl;

    ::CoUninitialize();

    return EXIT_SUCCESS;

    return 0;
}


COM.



COM-



:



  1. Inprocess
  2. Out-of-process


  • , COM , . , COM GUI, IDA.

    COM DLL.



  • , COM- . , , , -. .. , COM .





, out-of-process COM. , GitHub " " : https://github.com/dotnet/samples/tree/master/core/extensions/OutOfProcCOM. .





结果,我设法使用Windows工具使IDA Pro和.NET Framework应用程序成为朋友,而不必大惊小怪地使用自己的RPC协议。另外,我解决了仅拥有一个仿真器内核副本并在多个应用程序之间共享其状态的问题。




All Articles