3
3

More than 3 years have passed since last update.

Friendlyが対象プロセスにdllを読み込ませる(DLLインジェクション)仕組み

Posted at

はじめに

FriendlyではDLLインジェクションを用いて、任意のDLLを読み込ませることができます。
DLLインジェクションとは、他のプロセス上でコードを実行する方法の一つです。
DLLインジェクションはクラッキングなどに悪用されることもあるようですが、Friendlyでは上手く使用しています。
今回はそのDLLインジェクションのやり方について調べてみました。

FriendlyのDLLインジェクションの概要

Codeer.Friendly.Windows.InsideパッケージのDllInjector.Load()メソッドが対象プロセスにdllを読み込ませるメソッドです。
このメソッドでは、カーネルを用いて対象プロセスに働きかけることでdllを読み込ませています。
大まかな手順としては、以下の通りです。

  1. ロードさせるDLL名称を、対象プロセス内にメモリを確保して書き込みます
  2. カーネルからライブラリを読み込む関数(LoadLibraryW)を取得します
  3. 対象プロセスの別スレッドにて、DLLをロードします
  4. DLLのロードが終わるまで待ちます

上記の手順は、以下のWindowsAPIを実行することで実現されています。

DLLインジェクションのポイント

FriendlyのコードではありませんがDLLインジェクションの原理自体は参考の記事と同様であるため、詳細を知りたい場合は参考をご覧ください。
以下は、自分が参考を読んでポイントだと思った点を整理したものになります。

  • kernel.dllに含まれているLoadLibraryというAPIは全てのプロセス空間で同一アドレスにロードされている。そのため、別プロセスで取得したLoadLibraryのポインタが、対象とするプロセスのLoadLibraryのポインタと同じである。
  • CreateRemoteThread APIを用いると指定したプロセスにスレッドを作成し、関数を実行させられる。上記で取得したLoadLibraryのポインタを用いて指定したDLLを読み込める。

おわりに

今回、Friendlyコンポーネントから入り、DLLインジェクションの仕組みについて勉強してみました。おそらく開発で直接活用される機会はなさそうですが、WindowsAPIを詳しく知ることで色々なことができるようになるのだなと思いました。
今後は、FriendlyがDLLインジェクションをした後のことについて、もう少し勉強してみようと思います。

参考

64ビット対応のDLLインジェクション - SIN@SAPPOROWORKSの覚書
http://furuya02.hatenablog.com/entry/20120114/1326484897

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3