質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.35%

  • C++

    2412questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Windows

    1009questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 10

    541questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Win32 API

    151questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

DLLインジェクションがうまくいかない

解決済

回答 2

投稿 2017/11/28 13:24 ・編集 2017/11/28 20:46

  • 評価
  • クリップ 2
  • VIEW 285

katahiromz

score 34

こんにちは。

64ビットのWindows 10で、DLLインジェクションをしようとしています。
https://github.com/katahiromz/SimpleDLLInjection

CMakeLists.txtファイルがあるので、CMakeでビルドして下さい。

64ビットプログラムから64ビットアプリへのインジェクションは成功するのですが、
32ビットプログラムから32ビットアプリへのインジェクションが失敗します。

原因がわかりません。失敗したときの出力は以下の通りです。

$ ./build/injector32.exe -e pictbear.exe
dll_path: C:\Users\katahiromz\Documents\Dev\SimpleDLLInjection\build\payload32.dll
LoadLibraryA failed: 0, 0
DllInjectByPid failed
failed

GetLastErrorの戻り値は、ゼロになりました。

ソースはこちらです。
https://github.com/katahiromz/SimpleDLLInjection/blob/master/payload/payload.cpp
https://github.com/katahiromz/SimpleDLLInjection/blob/master/injector/injector.cpp

この中に間違いがあると思われます。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2017/11/28 15:35

    最低限、GetLastErrorで取得できるエラーコードを確認されてはいかがでしょう。

    キャンセル

  • katahiromz

    2017/11/28 15:40

    32ビットのPictBearというプログラムに対して、コマンドプロンプトからinjectorを起動しましたが、前述のように失敗しました。

    キャンセル

  • katahiromz

    2017/11/28 15:56

    エラーコードはゼロでした。

    キャンセル

  • 退会済みユーザー

    2017/11/28 17:48

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+3

私の環境では
・セキュリティ的には何も特別なことをやってない、自分が以前作成した32bitのEXEファイルを直接ダブルクリックで起動してターゲットにする
・MSYS2の32bit向けシェルからSimpleDLLInjectionをビルドしてinjector32.exeを実行する
でもインジェクション失敗しました。

仮説:
・payload32.dllが、特定のDLL(例えば、libgcc_s_dw2-1.dll)を必要としている
かつ
・pictbear.exeからはlibgcc_s_dw2-1.dllの場所がわからない
なので、「pictbear.exeからpayload32.dllをロードできない」ということなのでは。

実験:
・injector32.exeを実行する前に、同じシェルからpictbear.exeを実行しておく
ではどうでしょうか。
これでインジェクション成功するのであれば、仮説の信憑性が高まります。
私の環境では、これでインジェクション成功したように見えました。

libgcc_s_dw2-1.dllだけが問題だとすれば、
・payload32.dllがlibgcc_s_dw2-1.dllを必要としないようにする
または
・pictbear.exeからlibgcc_s_dw2-1.dllの場所がわかるようにする
が対策でしょうか。

ついでに。
今は全プロセスでkernel32.dllのアドレスが同じみたいだけど、将来的にも保証されているのかどうかが気になります。

投稿 2017/11/30 22:21

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/01 20:54

    回答ありがとうございます。
    「injector32.exeを実行する前に、同じシェルからpictbear.exeを実行しておく
    ではどうでしょうか」
    これは成功しました。現在、検証中です。

    キャンセル

  • 2017/12/01 21:03 編集

    解決いたしました。やはりDLLの依存関係が問題でした。injectorが「libgcc_s_dw2-1.dll」に依存していたようです。

    set(CMAKE_C_FLAGS "-static -static-libgcc -static-libstdc++")
    set(CMAKE_CXX_FLAGS "-static -static-libgcc -static-libstdc++")

    キャンセル

  • 2017/12/05 23:00

    今更ですが、書き忘れていたことがあった(けど回答そのものではない)のでコメントを追加します。
    確か、私の環境では最初の段階で
    ・MSYS2の32bit向けシェルからビルドしたtargetprog.exeをエクスプローラーから直接ダブルクリックすると「libgcc_s_dw2-1.dll が見つからないため、コードの実行を続行できません。」で実行できない
    ・MSYS2の32bit向けシェルからtargetprog.exeを実行することは可能
    という現象があったので、
    「targetprog.exeもpayload32.dllも共通する部分があるだろうなあ」ということから仮説や実験に繋がりました。

    あとは、
    Visual Studioのコマンドプロンプトが使えれば、そこから
    DUMPBIN /DEPENDENTS (パス)\payload32.dll

    MSYS2にBinutilsが入っているのであれば
    objdump -p (パス)/payload32.dll | grep -i dll
    または
    objdump -x (パス)/payload32.dll | grep -i dll
    (もっと適切な方法があるかもしれませんが、そこは広い心で見てやって下さい)
    で簡易調査。

    キャンセル

+2

こちらではうまくいきました。
相手側プロセスでLoadLibraryAは実行されているのでしょうか?

こちらではWindbgを使用して以下のように実行されていることを確認できました。
引数の値はマスクしています。
とりあえずインジェクト先のプロセスにデバッガをアタッチして確認してみてください。

0:005> x KERNEL32!LoadLi*
~省略~
0:005> x KERNELBASE!LoadLi*
~省略~

//とりえあえず両方ともブレークポイントを仕掛けておく
0:005> bp KERNELBASE!LoadLibraryA
0:005> bp KERNEL32!LoadLibraryAStub
0:005> g

----------------
ここで
injector32.exe -e DF.exe
----------------
//ブレークした
Breakpoint 1 hit
eax=88ef99bc ebx=025e0000 ecx=75025980 edx=75025980 esi=75025980 edi=75025980
eip=75025980 esp=04beff84 ebp=04beff94 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
KERNEL32!LoadLibraryAStub:
75025980 8bff            mov     edi,edi

//引数を確認
0:005> kv
 # ChildEBP RetAddr  Args to Child              
00 04beff80 75028654 025e0000 75028630 88ef99bc KERNEL32!LoadLibraryAStub (FPO: [Non-Fpo])
01 04beff94 77e24a47 025e0000 974d2a9c 00000000 KERNEL32!BaseThreadInitThunk+0x24 (FPO: [Non-Fpo])
02 04beffdc 77e24a17 ffffffff 77e49ed8 00000000 ntdll!__RtlUserThreadStart+0x2f (FPO: [SEH])
03 04beffec 00000000 75025980 025e0000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])

//引数を表示。想定したものがセットされている
0:005> da 025e0000 
025e0000  "C:\Users\XXXXXXXXXXXXXXXXXXXXXX"
025e0020  "XXXXXXXXXXXXXXXXX\SimpleDLLInje"
025e0040  "ction-master\build\Debug\payload"
025e0060  "32.dll"

もう少し簡単な方法を記載しておきます。
okrtさんの記載している仮説も調べられると思います。

Process Monitorというツールがあってこれを使用するとスレッド開始やDLLのロードの結果を調べられます。

Filterから
Process Name is PictBear.exe
をIncludeとして設定します。
フィルター
キャプチャを開始して、
injector32.exe -e PictBear.exe
とします。
そうすると以下のようにDLLのロードが実施され成功しているのかが分かります。
なお、私の環境ではPictBearでも成功しました。
ログ

投稿 2017/11/28 22:06

編集 2017/12/01 20:45

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 22:43

    LoadLibraryAStubなんて初めて見ました。どうやら、PictBear.exeにはDLL注入を妨害する機構があるようです。後でWinDbgを試してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.35%

関連した質問

  • 解決済

    ja.ymlに関する質問

    質問がございます。よろしくお願い致します。何かわかりづらい点がある場合はご指摘ください。 質問 下記のja.ymlファイルのuser: name:以下に「blank: ユーザー名

  • 受付中

    ソフトウェアキーボード作成の仕方

    ソフトウェアキーボードを作成したいのですが、参考になるサイトやサンプル をご存知でしたら教えてください。 作成したいもののイメージとしては、セブンイレブンにあるマルチコピー機の

  • 受付中

    Railsでのgitignore

    Railsをgitで管理しているのですが、tmp/cache内のファイルがアプリケーションサーバを起動するたび、変更されます。 変更されるので、addまちとなってしまいます。 普

  • 解決済

    Datapickerを使うことができません。。

    いつもお世話になっています。 Bootstrapを使って、WEBサイト制作を行っているのですが Datapickerをいれても反応しなくて困っています。 https://eo

  • 解決済

    jq.schedule.jsでスケジュールデータを変更する方法

    jq.schedule.jsを使ってスケジュールアプリを作っているのですが  表示されているデータを変更しようとしているのですが、 変更しようとするrowsに値をセットしても

  • 受付中

    WordPress「WordPress popular posts」について

    お世話になります。 WordPressのテンプレート制作で「WordPress popular posts」で人気記事を表示させているのですが、SSLの対応をする必要がでてきまし

  • 受付中

    Python Json 扱い方 どれが最大か求めたい!!

    どの値が最も大きく出ているのかを文字で出力しようとしています。 (例:neutralが最大だったらneutral と出力し何かはこに入れる) しかし帰ってきたデータをどのように

  • 解決済

    公開されているデータベースシステムのビルドの方法

    やりたいこと とあるゲームのデータベースをいじりたいと思い、調べたらデータベースのシステムが公開されていました しかし、ビルドを行う方法がわからず困っています。 https:/

同じタグがついた質問を見る

  • C++

    2412questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Windows

    1009questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 10

    541questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Win32 API

    151questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。