さて、最近は
実行前にロードするsoを指定する環境変数はなんだったっけ?(LD_PRELOAD)
とかそういうのを思い出すのに時間がかかったりしてもうバイナリアンとしてはだめだと思ったので、まあ、アレ。リハビリに。
WindowsはWin32APIを呼び出すことでOSの機能を使えるようになる、というのは有名な話かと思う。
ファイルを作るには、CreateFile、ファイルに書き込むには、WriteFileといった感じ。
…そこまでは、良い。
が、しかし、Windowsはどこらへんが「特権モード」のシステムコールなのかが結構謎だ。他にやることもないので、そこらへんをおっかける。
まず、Windowsでは、特権モードのあっち側へ行く方法は、どうなってるんだろうか?ソフトウェア割り込み?コールゲート?
そこらへんの話は、
http://www.marbacka.net/asm64/arkiv/int2e_sysenter_syscall.html と、
http://www.sysinternals.com/Information/NativeApi.html
に書いてある。
いろんな方法があるようだけど、面倒なので、ソフトウェア割り込みを使った方法についてだけ考えることにする。
と、思ったけど、なんか調べてたら時間がやばいので、続きは明日。
.globl _mainCRTStartup _mainCRTStartup: mov $0x101, %eax # NtTerminateProcessは0x101番 push $0xff # main戻り値 push $-1 # 終了するプロセスのハンドル # push $-1 # ?? # push $retaddr syscall: leal (%esp), %edx # sysenter int $0x2e retaddr: # ここには来ない nop jmp retaddr ret
これでDLLに頼らないで終了するプログラム。sysenterを使う場合はコメントはずして。XPじゃないと動かないかもしれない。