cscの作法 その249

# 概要
cscの作法、調べてみた。
exeファイルをフルスクラッチで書いてみた。

# 参考にしたページ

https://qiita.com/lambdataro/items/c36fb9614263d21ce23a


# サンプルコード

```
using System;
using System.IO;
using System.Text;

public class test0 {
	static void pad(BinaryWriter bw, int n) {
		int i;
		for (i = 0; i < n; i++)
		{
			bw.Write((byte) 0x00);
		}
	}
	static void Main(string[] args) {
		string FileName = "mkpe3.exe";
		FileStream filStream = new FileStream(FileName, FileMode.Create, FileAccess.Write);
		BinaryWriter bw = new BinaryWriter(filStream);
		//; DOS ヘッダ
		bw.Write((UInt16) 0x5A4D);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt32) 0x0080);
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		pad(bw, 64);

		//; EXE ヘッダ
		bw.Write((UInt16) 0x4550);
		bw.Write((UInt16) 0x0000);
		bw.Write((UInt16) 0x8664);
		bw.Write((UInt16) 0x0002);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt16) 0x00F0);
		bw.Write((UInt16) 0x002F);

		//; オプションヘッダ
		bw.Write((UInt16) 0x020B);
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0x1000);
		bw.Write((UInt32) 0);

		//; オプションヘッダ (Windows)
		bw.Write((UInt64) 0x00400000);
		bw.Write((UInt32) 0x1000);
		bw.Write((UInt32) 0x0200);
		bw.Write((UInt16) 0x0005);
		bw.Write((UInt16) 0x0000);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0x0005);
		bw.Write((UInt16) 0x0000);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0x3000);
		bw.Write((UInt32) 0x0200);
		bw.Write((UInt32) 0);
		bw.Write((UInt16) 0x0003);
		bw.Write((UInt16) 0);
		bw.Write((UInt64) 0x1000);
		bw.Write((UInt64) 0x1000);
		bw.Write((UInt64) 0x00010000);
		bw.Write((UInt64) 0x0000);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0x0010);

		//; オプションヘッダ (Data)
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0x2000);
		bw.Write((UInt32) 0x004F);
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		//bw.Write((UInt32) 0, 0
		pad(bw, 112);

		//; .text
		bw.Write(Encoding.ASCII.GetBytes(".text"));
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write((UInt32) 0x0011);
		bw.Write((UInt32) 0x1000);
		bw.Write((UInt32) 0x0200);
		bw.Write((UInt32) 0x0200);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt32) 0x60000020);

		//; .idata
		bw.Write(Encoding.ASCII.GetBytes(".idata"));
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write((UInt32) 0x004F);
		bw.Write((UInt32) 0x2000);
		bw.Write((UInt32) 0x0200);
		bw.Write((UInt32) 0x0400);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt16) 0);
		bw.Write((UInt32) 0xC0000040);
		//bw.Write((UInt64) 0, 0, 0, 0, 0
		pad(bw, 40);

		//; text セクション
		bw.Write((Byte) 0x48);
		bw.Write((Byte) 0x83);
		bw.Write((Byte) 0xEC);
		bw.Write((Byte) 0x28);
		bw.Write((Byte) 0x48);
		bw.Write((Byte) 0xC7);
		bw.Write((Byte) 0xC1);
		bw.Write((Byte) 0x7B);
		bw.Write((Byte) 0x00);
		bw.Write((Byte) 0x00);
		bw.Write((Byte) 0x00);
		bw.Write((Byte) 0xFF);
		bw.Write((Byte) 0x15);
		bw.Write((Byte) 0x17);
		bw.Write((Byte) 0x10);
		bw.Write((Byte) 0x00);
		bw.Write((Byte) 0x00);
		//bw.Write((Byte) 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		pad(bw, 495);

		//; idata セクション
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0x2038);
		bw.Write((UInt32) 0x2028);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt32) 0);
		bw.Write((UInt64) 0x2041);
		bw.Write((UInt64) 0);
		bw.Write(Encoding.ASCII.GetBytes("kernel32"));
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		bw.Write(Encoding.ASCII.GetBytes("ExitProcess"));
		bw.Write((Byte) 0);
		bw.Write((Byte) 0);
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		//bw.Write((UInt64) 0, 0, 0, 0, 0, 0, 0, 0
		pad(bw, 432);

	}
}



```

# 実行結果

```
>pe3

>mkpe3

>

```

以上。