Windows의 c-dll에서 go-dll을로드 할 수 있습니까?

12tall

프로세스에 c-dll을 주입하고 싶습니다. c-dll에서 golang으로 작성된 다른 dll을로드합니다. 내 C 코드는 다음과 같습니다.

loader.dll이로드되면 golang으로 작성된 worker.dll을 자동으로로드합니다.

// loader.c  

#include <windows.h>
#include <stdio.h>
#include <memory.h>

typedef void (*StartWorker)();
HMODULE hWorker = NULL;


BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {

        hWorker = LoadLibrary("D:\\code\\toys\\worker.dll");
        if (hWorker == NULL)
        {
            exit(1);
        }
        
        StartWorker startWorker = (StartWorker)GetProcAddress(hWorker, "StartWorker");
        MessageBox(NULL, "worker starting", TEXT("Warning:"), MB_OK);
        if (startWorker == NULL)
        {
            MessageBox(NULL, "error", TEXT("Warning:"), MB_OK);
            exit(1);
        }
        startWorker();
        MessageBox(NULL, "worker started", TEXT("Warning:"), MB_OK);
        FreeLibrary(hWorker);
        break;
    }
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    default:
        break;
    }
    return TRUE;
}

이동 코드는 다음과 같습니다.

// worker.go

package main

/*
#include <stdlib.h>
#include <windows.h>
*/
import "C"

//export StartWorker
func StartWorker {
    C.MessageBox(nil, C.CString("Hello Worker"), C.CString("Warning:"), 0)
}
func main() {
}

나는 그들을 MinGW-w64. loader.dll이 worker.dll에서 호출하려고 할 때 StartWorker()프로세스가 MessageBox를 표시하지 않았습니다. c에서 worker.dll을 다시 작성하면 모든 것이 잘 작동합니다. 그리고 StartWorker()다음 코드로 호출해도 괜찮습니다 .

#include <windows.h>
#include <stdio.h>
#include <memory.h>

typedef void (*StartWorker)();

int main()
{
    char *dllPath = "D:\\code\\toys\\loader.dll";
    HMODULE hWorker = NULL;
    hWorker = LoadLibrary(dllPath);
    StartWorker startWorker = (StartWorker)GetProcAddress(hWorker, "StartWorker");
    if (startWorker == NULL)
    {
        MessageBox(NULL, "dllPath", TEXT("Warning:"), MB_OK);
        exit(1);
    }
    startWorker();
    MessageBox(NULL, "target", TEXT("Warning:"), MB_OK);
    FreeLibrary(hWorker);
    return 0;
}

go-runtime과 충돌이 있는지 궁금합니다.

12tall

그 질문에 관심있는 모든 사람에게 감사드립니다. 함수를 구현하는 방법을 찾은 것 같습니다. 다음과 같이 새 코드를 작성합니다. 그들은 이제 잘 작동하고 있습니다.

http.go

package main

import "C"
import (
    "fmt"
    "net/http"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
    _, _ = w.Write([]byte("Hello World!"))
}

//export StartHttp
func StartHttp() {
    http.HandleFunc("/", sayHello)

    err := http.ListenAndServe("127.0.0.1:9999", nil)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Listening: http://127.0.0.1:9000")
}

func main() {
    // StartHttp();
}

loader.c

#include <windows.h>
#include <stdio.h>

// https://forum.pellesc.de/index.php?topic=4725.0
#ifdef __GNUC__
HANDLE k __attribute__((section(".shared"), shared)) = NULL;
#endif
#ifdef _MSC_VER
#pragma data_seg(".shared")
HANDLE k = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,RWS")
#endif

typedef void (*StartHttp)();

HMODULE hHttp = NULL;

BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        hHttp = LoadLibrary("http.dll");
        StartHttp startWorker = (StartHttp)GetProcAddress(hHttp, "StartHttp");
        k = startWorker;  
        // do not execute the function here!
        break;
    }

    case DLL_PROCESS_DETACH:
    {
        FreeLibrary(hHttp);
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    default:
        break;
    }
    return TRUE;
}

HANDLE GetHttpStarter()
{
    return k;
}

client.c

#include <windows.h>
#include <stdio.h>
#include <memory.h>

typedef void (*StartHttp)();
typedef HMODULE (*GetHttpStarter)();

int main()
{
    HMODULE hLoader = NULL;

    hLoader = LoadLibrary("loader.dll");
    GetHttpStarter getHttpStarter = (GetHttpStarter)GetProcAddress(hLoader, "GetHttpStarter");
    StartHttp startHttp = (StartHttp)getHttpStarter();
    startHttp();

    printf("^^\n");
    FreeLibrary(hLoader);
    return 0;
}

> go build -buildmode=c-shared -o http.dll .\http.go
> gcc .\loader.c -shared -o loader.dll
> gcc .\client.c -o client.exe
> .\client.exe

내가 수정 한 가장 중요한 것은 단지로드이다 http.dll(go)에서 loader.dll(c)DllMain()실행없이 http.dll(go)의 기능 ', 그리고 공유 메모리에 이러한 기능에게 주소를 저장한다. 그래서 나는 http.dll(go)의 내보내기 기능 GetHttpStarter()호출하여 의 함수 주소를 얻을 수 있습니다 loader.dll(c). 복잡해 보이지만 작동합니다. :)


또한 dll injetion을 테스트 했으므로 결과적으로 http 서비스를 notepad.exe지금 호스팅 할 수 있습니다 .D

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Windows에서 DLL 지연로드 : 찾을 DLL 이름을 동적으로 선택할 수 있습니까? (C ++)

분류에서Dev

C ++ dll 파일을 Lua에로드 할 수 있습니까?

분류에서Dev

Apache Cordova에서 C # Library dll을 호출 할 수 있습니까?

분류에서Dev

Delphi DLL을 PInvoked 및 C #에서 사용할 수 있습니까?

분류에서Dev

C ++ dll이 Python Ctypes에서로드되지 않도록 할 수 있습니까?

분류에서Dev

lua 5.0.2에서 C ++로 작성된 lua 5.3.5 dll을로드 할 수 있습니까?

분류에서Dev

.net은 메모리에서 C ++ / cli dll을 동적으로로드 할 수 있습니까?

분류에서Dev

다른 C ++ DLL의 DLL에서 JNIEXPORT 함수를 어떻게 호출 할 수 있습니까?

분류에서Dev

SYSPRO의 VBscript에서 C # dll을 호출 할 수 없습니다.

분류에서Dev

NSIS는 Windows XP에서 gdiplus.dll을로드 할 수 없습니다.

분류에서Dev

Windows 7 32 비트 PC에서 SQLite DLL을로드 할 수 없습니다.

분류에서Dev

Windows 7의 shell32.dll을 Windows XP로 대체 할 수 있습니까?

분류에서Dev

Windows XP에서 "DLL을로드 할 수 없습니다 ... 지정한 프로 시저를 찾을 수 없습니다."C ++

분류에서Dev

HTML5를 사용하여 Windows Store 앱에서 .net (C #)으로 컴파일 된 dll을 사용할 수 있습니까?

분류에서Dev

내 C # 프로그램에서 dll 파일을 어떻게 사용하고 호출 할 수 있습니까?

분류에서Dev

Linux에서 .Net Core 3.1을 사용하여 C ++ / CLI 코드의 C # DLL을 만들 수 있습니까?

분류에서Dev

C ++의 DLL에서 클래스를 어떻게 인스턴스화 할 수 있습니까?

분류에서Dev

pybind를 사용하여 외부 C ++ dll을로드하고 함수를 호출 할 수 있습니까?

분류에서Dev

C #에서 참조 된 DLL에 메서드 / 인터페이스를 추가 할 수 있습니까?

분류에서Dev

PHP에서 사용할 수있는 C #에서 dll을 만드는 단계

분류에서Dev

Windows에서 실행중인 exe 및로드 된 dll을 삭제할 수없는 이유는 무엇입니까?

분류에서Dev

C #에서 observableCollection 속성을 재정의 할 수 있습니까?

분류에서Dev

C # DLL에서 http 호출을 할 수 없습니다.

분류에서Dev

C # XML 문서에서 const 필드의 값을 참조 할 수 있습니까?

분류에서Dev

커스텀 로더로로드 된 DLL을 디버깅 할 수 있습니까?

분류에서Dev

netbeans에서 jna로 개인 DLL을로드 할 수 없습니다.

분류에서Dev

EXE에서 할 수 있는데 왜 DLL을 컴파일 할 수 없습니까?

분류에서Dev

매개 변수가있는 exe에서 DLL을 실행할 수 있습니까?

분류에서Dev

매개 변수가있는 exe에서 DLL을 실행할 수 있습니까?

Related 관련 기사

  1. 1

    Windows에서 DLL 지연로드 : 찾을 DLL 이름을 동적으로 선택할 수 있습니까? (C ++)

  2. 2

    C ++ dll 파일을 Lua에로드 할 수 있습니까?

  3. 3

    Apache Cordova에서 C # Library dll을 호출 할 수 있습니까?

  4. 4

    Delphi DLL을 PInvoked 및 C #에서 사용할 수 있습니까?

  5. 5

    C ++ dll이 Python Ctypes에서로드되지 않도록 할 수 있습니까?

  6. 6

    lua 5.0.2에서 C ++로 작성된 lua 5.3.5 dll을로드 할 수 있습니까?

  7. 7

    .net은 메모리에서 C ++ / cli dll을 동적으로로드 할 수 있습니까?

  8. 8

    다른 C ++ DLL의 DLL에서 JNIEXPORT 함수를 어떻게 호출 할 수 있습니까?

  9. 9

    SYSPRO의 VBscript에서 C # dll을 호출 할 수 없습니다.

  10. 10

    NSIS는 Windows XP에서 gdiplus.dll을로드 할 수 없습니다.

  11. 11

    Windows 7 32 비트 PC에서 SQLite DLL을로드 할 수 없습니다.

  12. 12

    Windows 7의 shell32.dll을 Windows XP로 대체 할 수 있습니까?

  13. 13

    Windows XP에서 "DLL을로드 할 수 없습니다 ... 지정한 프로 시저를 찾을 수 없습니다."C ++

  14. 14

    HTML5를 사용하여 Windows Store 앱에서 .net (C #)으로 컴파일 된 dll을 사용할 수 있습니까?

  15. 15

    내 C # 프로그램에서 dll 파일을 어떻게 사용하고 호출 할 수 있습니까?

  16. 16

    Linux에서 .Net Core 3.1을 사용하여 C ++ / CLI 코드의 C # DLL을 만들 수 있습니까?

  17. 17

    C ++의 DLL에서 클래스를 어떻게 인스턴스화 할 수 있습니까?

  18. 18

    pybind를 사용하여 외부 C ++ dll을로드하고 함수를 호출 할 수 있습니까?

  19. 19

    C #에서 참조 된 DLL에 메서드 / 인터페이스를 추가 할 수 있습니까?

  20. 20

    PHP에서 사용할 수있는 C #에서 dll을 만드는 단계

  21. 21

    Windows에서 실행중인 exe 및로드 된 dll을 삭제할 수없는 이유는 무엇입니까?

  22. 22

    C #에서 observableCollection 속성을 재정의 할 수 있습니까?

  23. 23

    C # DLL에서 http 호출을 할 수 없습니다.

  24. 24

    C # XML 문서에서 const 필드의 값을 참조 할 수 있습니까?

  25. 25

    커스텀 로더로로드 된 DLL을 디버깅 할 수 있습니까?

  26. 26

    netbeans에서 jna로 개인 DLL을로드 할 수 없습니다.

  27. 27

    EXE에서 할 수 있는데 왜 DLL을 컴파일 할 수 없습니까?

  28. 28

    매개 변수가있는 exe에서 DLL을 실행할 수 있습니까?

  29. 29

    매개 변수가있는 exe에서 DLL을 실행할 수 있습니까?

뜨겁다태그

보관