Windowsだって深追いできるんです。

さて、最近は
実行前にロードする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じゃないと動かないかもしれない。