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

王林
リリース: 2024-02-08 21:00:13
転載
462 人が閲覧しました

反射加载 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!