𝖳𝗁𝖾 𝖾𝗇𝗍𝗂𝗋𝖾 𝗁𝗂𝗌𝗍𝗈𝗋𝗒 𝖿𝗈𝗋 𝗍𝗁𝗂𝗌 𝗉𝗋𝗈𝗃𝖾𝖼𝗍 𝗂𝗇 𝗌𝗈𝗎𝗋𝖼𝖾 𝖼𝗈𝖽𝖾 𝗂𝗌 𝗂𝗇𝖼𝗅𝗎𝖽𝖾𝖽. 𝖳𝗁𝖾 𝖿𝗂𝗅𝖾 𝗇𝖺𝗆𝖾𝗌 𝖼𝗈𝗇𝗍𝖺𝗂𝗇 𝗍𝗁𝖾 𝗏𝖾𝗋𝗌𝗂𝗈𝗇 𝗇𝗎𝗆𝖻𝖾𝗋𝗌 𝖺𝗇𝖽 𝖻𝗋𝗂𝖾𝖿 𝖽𝖾𝗌𝖼𝗋𝗂𝗉𝗍𝗂𝗈𝗇𝗌. 𝖲𝗍𝖺𝗋𝗍𝗂𝗇𝗀 𝗐𝗂𝗍𝗁 𝟢𝟢𝟢 𝗂𝗌 𝗍𝗁𝖾 𝖢 𝗍𝖾𝗅𝗇𝖾𝗍 𝗌𝖾𝗋𝗏𝖾𝗋, 𝖾𝗑𝗍𝗋𝖾𝗆𝖾𝗅𝗒 𝖻𝖺𝗌𝗂𝖼. 𝖨 𝖿𝗈𝗋𝗀𝖾𝗍 𝗐𝗁𝗒 𝖨 𝗁𝖺𝖽 𝗍𝗁𝖾 𝗌𝗅𝖾𝖾𝗉 𝗍𝗂𝗆𝖾𝗋 𝗂𝗇 𝗍𝗁𝖾𝗋𝖾 𝖻𝗎𝗍 𝗂𝗍 𝗂𝗌 𝗋𝖾𝗆𝗈𝗏𝖾𝖽 𝗅𝖺𝗍𝖾𝗋 𝖺𝗇𝗒𝗐𝖺𝗒.
𝖵𝖾𝗋𝗌𝗂𝗈𝗇 𝟢𝟢𝟣 𝗂𝗌 𝗍𝗁𝖾 𝖽𝗂𝗋𝖾𝖼𝗍 𝖼𝗈𝗇𝗏𝖾𝗋𝗌𝗂𝗈𝗇 𝗍𝗈 𝗑𝟪𝟨. 𝖵𝖾𝗋𝗌𝗂𝗈𝗇 𝟢𝟢𝟤 𝖻𝖾𝗀𝗂𝗇𝗌 𝗍𝗁𝖾 𝗉𝗋𝗈𝖼𝖾𝗌𝗌 𝗈𝖿 𝖻𝗋𝖾𝖺𝗄𝗂𝗇𝗀 𝖾𝗏𝖾𝗋𝗒𝗍𝗁𝗂𝗇𝗀 𝖽𝗈𝗐𝗇. 𝖡𝗒 𝗏𝖾𝗋𝗌𝗂𝗈𝗇 𝟢𝟢𝟨 𝗐𝖾'𝗋𝖾 𝗎𝗌𝗂𝗇𝗀 𝖢𝗋𝗂𝗇𝗄𝗅𝖾𝗋 𝖺𝗇𝖽 𝗋𝖾𝖺𝗅𝗅𝗒 𝗀𝗈𝗂𝗇𝗀 𝖿𝗈𝗋 𝗂𝗍. 𝖠𝗍 𝟢𝟣𝟧 𝗐𝖾 𝗅𝖾𝖺𝗏𝖾 𝗈𝖿𝖿 𝖺𝗍 𝟦𝟪𝟥 𝖻𝗒𝗍𝖾𝗌. 𝖨 𝗍𝗁𝗂𝗇𝗄 𝗍𝗁𝖾𝗋𝖾 𝗆𝖺𝗒 𝖻𝖾 𝗆𝗈𝗋𝖾 𝗍𝗈 𝗀𝗈, 𝖻𝗎𝗍 𝗍𝗁𝗂𝗌 𝗂𝗌 𝗀𝗈𝗈𝖽 𝖿𝗈𝗋 𝗇𝗈𝗐.
𝖥𝗈𝗋 𝗆𝖾 𝗍𝗁𝖾 𝖻𝗂𝗀𝗀𝖾𝗌𝗍 𝗌𝗎𝗋𝗉𝗋𝗂𝗌𝖾 𝗐𝖺𝗌 𝗍𝗁𝗂𝗌:
original C simple telnet server - 90112 bytes CL build
original C no CRT & heavy CL size opts - 1536 bytes CL OPT SIZE build
convert orig C to assembly - 3072 bytes MASM
𝖳𝗁𝖾 𝗅𝖺𝗋𝗀𝖾𝗌𝗍 𝗌𝗂𝗓𝖾 𝗋𝖾𝖽𝗎𝖼𝗍𝗂𝗈𝗇 𝗈𝖿 𝗍𝗁𝖾 𝖾𝗇𝗍𝗂𝗋𝖾 𝗉𝗋𝗈𝗃𝖾𝖼𝗍 𝖻𝗒 𝖿𝖺𝗋 𝗐𝖺𝗌 𝖺𝖼𝖼𝗈𝗆𝗉𝗅𝗂𝗌𝗁𝖾𝖽 𝗐𝗂𝗍𝗁 𝗍𝗁𝖾 𝗅𝗂𝗇𝗄𝖾𝗋 𝖺𝗇𝖽 𝗇𝗈 𝖼𝗈𝖽𝖾 𝖼𝗁𝖺𝗇𝗀𝖾𝗌. 𝖨 𝗊𝗎𝗂𝗍𝖾 𝗐𝖺𝗇𝗍𝖾𝖽 𝗍𝗈 𝗀𝖾𝗍 𝖺 𝖳𝗂𝗇𝗒 𝖢 𝖢𝗈𝗇𝗉𝗅𝗂𝖾𝗋 (𝖳𝖢𝖢) 𝖻𝗎𝗂𝗅𝖽 𝗐𝗈𝗋𝗄𝗂𝗇𝗀 𝗍𝗈 𝗌𝖾𝖾 𝗍𝗁𝖾 𝗋𝖾𝗌𝗎𝗅𝗍, 𝖻𝗎𝗍 𝖨 𝖼𝗈𝗎𝗅𝖽𝗇'𝗍 𝗀𝖾𝗍 𝖺𝗋𝗈𝗎𝗇𝖽 𝗇𝖾𝖾𝖽𝗂𝗇𝗀 𝗍𝗈 𝗁𝖺𝗏𝖾 𝗐𝗂𝗇𝗌𝗈𝖼𝗄𝟤.𝗁 𝗌𝗂𝗍𝗍𝗂𝗇𝗀 𝗍𝗁𝖾𝗋𝖾 𝗇𝖾𝗑𝗍 𝗍𝗈 𝖾.𝖼 𝖺𝗇𝖽 𝗍𝗁𝖺𝗍 𝗏𝗈𝗂𝖽𝗌 𝗍𝗁𝖾 𝗐𝗁𝗈𝗅𝖾 𝗉𝗈𝗂𝗇𝗍 𝗈𝖿 𝗍𝗁𝖾 𝗉𝗋𝗈𝗃𝖾𝖼𝗍. 𝖨 𝖽𝗂𝖽𝗇'𝗍 𝗍𝗋𝗒 𝖦𝖢𝖢.
𝖳𝗁𝖾 𝗌𝗍𝗒𝗅𝖾 𝗎𝗌𝖾𝖽 𝗐𝖺𝗌 𝖼𝗈𝗆𝗆𝖾𝗇𝗍𝗂𝗇𝗀 𝗈𝗎𝗍 𝗈𝗅𝖽 𝖼𝗈𝖽𝖾 𝗂𝗇𝗌𝗍𝖾𝖺𝖽 𝗈𝖿 𝗋𝖾𝗆𝗈𝗏𝗂𝗇𝗀 𝗂𝗍. 𝖠 𝗇𝗎𝗆𝖻𝖾𝗋 𝗈𝖿 𝗍𝗁𝗂𝗇𝗀𝗌 𝗐𝖾𝗇𝗍 𝗂𝗇 𝖺𝗇𝖽 𝗈𝗎𝗍 𝗌𝖾𝗏𝖾𝗋𝖺𝗅 𝗍𝗂𝗆𝖾𝗌 𝖺𝗅𝗈𝗇𝗀 𝗍𝗁𝖾 𝗐𝖺𝗒. 𝖨 𝖽𝗂𝖽𝗇'𝗍 𝗉𝗋𝖾𝗌𝖾𝗋𝗏𝖾 𝗍𝗁𝖾 𝖿𝖺𝗂𝗅𝗎𝖾𝗌.
Walkdown from 90K to 483 bytes:
start with working version in C - 90112 bytes exe size
original C no CRT & heavy CL size opts - 1536 bytes
first version in MASM - 3072 bytes
replace invokes with push/call - 3072 bytes
remove dup error handles - 3072 bytes
first crinker build - 558 bytes
remove htons import & hard-code port - 551 bytes
remove ZeroMemory (win does the init) - 533 bytes
remove sleep - not needed - 529 bytes
switched to ebx/esi - 521 bytes
ebx = listening socket
esi = client socket
combined mov AF_INET and mov 0B315h - 517 bytes
switched IPPROTO to eax protocol zero - 515 bytes
removed shutdown - let socket default - 510 bytes
reduce wsa to actual size (400) - 509 bytes
shortened the message to server name "E" - 493 bytes
let wsacleanup dispoose of the socket - 487 bytes
fall-thu redundant INVALID_SOCKET check - 484 bytes
moved addr_in from data? to data - 483 bytes


