『~.exe は有効な Win32 アプリケーションではありません』がでる仕組み

Windows で 使ってるOSより高いバージョンのサブシステム向けに作られたアプリケーションを起動しようとすると、

『~.exe は有効な Win32 アプリケーションではありません』というエラーがでてきます。
win32


これを回避するために、fcwinでヘッダ情報を書き換えたりするわけですが、実際どこでこの処理が行われているか、今まで不明でした。

解析してみたところ、kernel32.dll の CreateProcessInternalW に該当するコードがありました。

 SUB_L77E74987:
          mov    ecx,[esp+04h]
          cmp    ecx,00000003h // <- Windows 3未満はエラーにする
          jc     L77E749B3
          mov    edx,[esp+08h]
          jnz    L77E7499B
          cmp    edx,0000000Ah // <- Windows 3.10未満はエラーにする
          jc     L77E749B3
 L77E7499B:
          mov    eax,[7FFE026Ch] // <- OS バージョン上位をロード
          cmp    ecx,eax
          ja     L77E749B3 // 多きければエラー
          jnz    L77E749AE // 小さければOK
          cmp    edx,[7FFE0270h] // <- OS バージョン下位をロード
          ja     L77E749B3 // 大きければエラー
 L77E749AE:
          push    00000001h
          pop    eax
          jmp    L77E749B5
 L77E749B3:
          xor    eax,eax
 L77E749B5:
          retn    0008h

ちなみに
0x7FFE026CはOSバージョン上位
0x7FFE0270はOSバージョン下位
ですが、
0x7ffdf0a4 はエミュレーションOSバージョン上位
0x7ffdf0a8 はエミュレーションOSバージョン下位
0x7ffdf0ac はエミュレーションOSBuild バージョン
0x7ffdf0ae はエミュレーションOS SPバージョン
になります。

jnz    L77E7499B を jnz L77E749AE に書き換えてみたところ、Subsystemバージョンが 6.0でも実行できる Windows 2000になりました。

Windows XPやVistaなども基本的に同じ仕組みのようです。

おすすめ

14件のフィードバック

  1. SI より:

    「jnz L77E7499B を jnz L77E749AE に書き換えてみたところ、」とありますが、何のソフトを使って書き換えたらいいのでしょうか?kdw095の中のfcwin2k.exeなのでしょうか? 書き換えるkernel32.dllはシステムドライブの「WINNT\system32」のやつでいいですよね?

  2. SI より:

    「jnz L77E7499B を jnz L77E749AE に書き換えてみたところ、」とありますが、何のソフトを使って書き換えたらいいのでしょうか?kdw095の中のfcwin2k.exeなのでしょうか? 書き換えるkernel32.dllはシステムドライブの「WINNT\system32」のやつでいいですよね?

  3. blackwingcat より:

    バイナリエディタで書き換えるのですが書き換えたものを EX Kernel v3として公開してるので通常は自分で書き換える必要はありません。

  4. blackwingcat より:

    バイナリエディタで書き換えるのですが書き換えたものを EX Kernel v3として公開してるので通常は自分で書き換える必要はありません。

  5. 左右 より:

    Windows2000のkernel32改造フリーがあるようなのですが
    XPのものはないのでしょうか?
    専門用語が行きかう中
    無知なものでどうも話が分からなくて・・・
    自分じゃどうも分からないので、恐れながら黒翼猫に是非見て頂きたいです>< えー。一応なので今の状況を。 WindowsXPを使っております。 先日、Skypeをダウンロードしようと思ったところ Failed to get proc address for SetDllDirectoryW(kernel32.dll) というメッセージが出てきてしまいました・・・。 各サイト様で改善方法が書かれているのですが、イマイチ上手くいきません。 お手隙でしたら、是非答えていただきたいです。 では乱文失礼致しました。

  6. 左右 より:

    Windows2000のkernel32改造フリーがあるようなのですが
    XPのものはないのでしょうか?
    専門用語が行きかう中
    無知なものでどうも話が分からなくて・・・
    自分じゃどうも分からないので、恐れながら黒翼猫に是非見て頂きたいです>< えー。一応なので今の状況を。 WindowsXPを使っております。 先日、Skypeをダウンロードしようと思ったところ Failed to get proc address for SetDllDirectoryW(kernel32.dll) というメッセージが出てきてしまいました・・・。 各サイト様で改善方法が書かれているのですが、イマイチ上手くいきません。 お手隙でしたら、是非答えていただきたいです。 では乱文失礼致しました。

  7. blackwingcat より:

    取りあえず、フォルダ %systemRoot%\system32 の中の kernel32.dll のバージョンを確認してみてください。
    5.1.2600.2180(XP SP2) 以前のものだと エラーになると思います
    それとも、XP SP1や無印環境で実行したいという話でしょうか?

  8. blackwingcat より:

    取りあえず、フォルダ %systemRoot%\system32 の中の kernel32.dll のバージョンを確認してみてください。
    5.1.2600.2180(XP SP2) 以前のものだと エラーになると思います
    それとも、XP SP1や無印環境で実行したいという話でしょうか?

  9. 八雲 より:

    はじめまして。
    「EX Kernel v3」を公開しているとありますが、
    どこで公開してますでしょうか?
    現在、改造版が「~.exe は有効な Win32 アプリケーションではありません」のエラーになってしまいます。

  10. 八雲 より:

    はじめまして。
    「EX Kernel v3」を公開しているとありますが、
    どこで公開してますでしょうか?
    現在、改造版が「~.exe は有効な Win32 アプリケーションではありません」のエラーになってしまいます。

  11. 黒翼猫 より:

    サイドバーからのリンクから飛べます。
    今は最新版が 拡張カーネル v24c2 (v.2.4c2) になっています。
    目的にあったバージョンを導入してみてください。

  12. 黒翼猫 より:

    サイドバーからのリンクから飛べます。
    今は最新版が 拡張カーネル v24c2 (v.2.4c2) になっています。
    目的にあったバージョンを導入してみてください。

  13. piotrhn より:

    How rewrite CreateProcessW on NT4?

  14. piotrhn より:

    How rewrite CreateProcessW on NT4?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です