2

最近、Win32 バイナリをいじってみました (これは私の大きなプロジェクトのためのものです)。数週間の調査の結果、Assembly がどのように機能するか、どのようにバイナリ コードに変換されるか、および x86/x64 オペコードがどのように機能するかについて、しっかりと理解できるようになりました。

パズルの最後のピースは、Win32 API メソッドを正しく呼び出す方法を見つけることです。これに関して実際にここで質問したところ、得られた答えは、これを行うアセンブリまたは C プログラムを試してコンパイルする必要があるというものでした。そこで、Assembly でこれを試してみました (ちなみに FASM を使用しています)。

format PE console
entry start

section '.idata' import data readable writable
    include 'win32a.inc'

    library kernel,'kernel32.dll'


    import kernel,\
           GetStdHandle,'GetStdHandle',\
           WriteConsoleA,'WriteConsoleA'

section '.data' data readable writable
    string db 'Hello!', 0h
    output dd ?

section '.code' code readable executable
    start:  push -11
            call GetStdHandle

            pushd 0
            pushd output
            pushd 7
            pushd string
            pushd eax
            call WriteConsoleA

これは、実際にはこのコードの多くのバージョンの 1 つです。主な問題は、「ExitProcess」などのメソッドを呼び出すと、通常は kernel32.dll ライブラリの他の関数がうまくいくように見えることです。私を悩ませているのはIO関数です...

このコードの何が問題なのかわかりません。コンパイル時のエラーは発生しませんが、実行するとクラッシュするだけです。

だから私の次のアイデアは、これがうまくいかなかったので、Cで同じことを試すことでした.Cygwinをコンパイラとリンカとして使用しています...

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MessageBox(NULL, "Hello, world!", "Test", MB_OK);
    return 0;
}

このコードは同じ結果をもたらし、アプリケーションはクラッシュしました。

今、私は C/C++ コードを探していません。私の最初の関心事は、extern ライブラリ関数の呼び出しが x86/x64 バイナリ (アセンブル) コードでどのように見えるかを知ることでした。しかし、このトピックに関するリソースに非常に感謝しています。

前もって感謝します。

-トム S.

4

1 に答える 1

4

あなたの問題はExitProcess、プロセスを適切に終了するために最後に呼び出す必要があることです。それを行っていないため、コードは現在実行を続け、ジャンク バイトを実行しようとするため、最終的にセグメンテーション違反になります。

于 2012-05-28T19:31:01.303 に答える