ホームページ >バックエンド開発 >Golang >CGO で生成された DLL のリフレクティブローディング

CGO で生成された DLL のリフレクティブローディング

王林
王林転載
2024-02-08 21:00:13531ブラウズ

反射加载 CGO 生成的 DLL

質問の内容

リフレクティブ DLL ロードを試してみたかったので、簡単なメッセージ ボックスを書きました:

リーリー

次のコマンドを使用して dll (cgo/golang を含む単なるメッセージ ボックス) を生成しました go build --buildmode=c-shared main.go

loadlibrary() を使用して dll をロードし、エクスポートされた関数 onprocessattach を実行すると、機能します (メッセージ ボックスが表示されます)。しかし、再配置を解決し、iat を解決して dll のリフレクティブ ロードを実装しようとすると、機能しません。 。 基本的な再配置が実行され、iat が go ランタイムの初期化に使用される .rdata の空のセクションに設定されているようです (nt ヘッダーのエントリ ポイントで初期化されます)。 インポートの問題を解決するために使用したコード スニペットは次のとおりです:

リーリー

これを実行した後、onprocessattach 関数を探す Eat の問題を解決しました。 go ランタイムが初期化されていないため、関数を直接実行しても明らかに機能しませんが、初期化しようとすると、前述したようにプログラムがクラッシュします。無効なバイトブロックを読み取ろうとしたため、Exception_access_violation が発生します。

エントリポイントの逆アセンブリ: mov rax、qdword ptr ds:[アドレス] mov dword ptr ds:[rax]

ダンプ内のアドレスによると、空のように見えます 00 00 00 00 00 00 00 00 00 [..]

元の DLL には価値がありますが、 90 2b c5 ea 01 [...]

.rdata 上のこれらのバイトを null に設定していることはわかっていますが、再配置の実行時になぜこれが起こるのかわかりません。おそらく go ランタイムが私がやろうとしていることに適していないのではないでしょうか?または、他の何か?


正解


解決策ここに解決策を投稿するのを忘れてしまいました エラーは次の行

で発生します。 リーリー

これは単なる指のミスです。コンマの代わりに記号を追加する必要がありました。そのため、アドレスが無効になりました。

以上がCGO で生成された DLL のリフレクティブローディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。