最近、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.