━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・コード内容

SUB ESP, 0x04
PUSHAD

;
; 1000Byteのメモリを確保
;
XOR EAX, EAX
INC EAX
SHL EAX, 0xC
LEA ECX, [EAX*2+EAX]
PUSH 0x40
PUSH ECX
PUSH EAX
PUSH 0
CALL DWORD [0x49F094]; VirtualAlloc
; ESI := VirtualAlloc()
MOV ESI, EAX

;
; 自身のselect.defの登録番号を取得
;
; EBX := [0x4B5B4C]
MOV EBX, DWORD [0x4B5B4C]
MOV AX, 0xD58
CWDE
MOV EAX, DWORD [EAX+EBX]
; EDI := 自身の登録番号
MOV EDI, EAX

;
; MUGEN本体処理の書き換えて独自コードへジャンプさせる
;
PUSH 0
PUSH "EL32"
PUSH "KERN"
PUSH ESP
CALL DWORD [0x49F0B8]; GetModuleHandleA
PUSH "ct"
PUSH "rote"
PUSH "ualP"
PUSH "Virt"
PUSH ESP
PUSH EAX
CALL DWORD [0x49F130]; GetProcAddress
ADD ESP, 0x1C
LEA ECX, [ESI+0x4]
; EBX := 0x43F0A8
MOV EBX, 0x43F0A8
PUSH ECX
PUSH 0x40
PUSH 0x5
PUSH EBX
CALL EAX
MOV BYTE [EBX], 0xE8
LEA EAX, [EBX+0x5]
NEG EAX
ADD EAX, ESI
MOV DWORD [EBX+0x1], EAX

;
; ジャンプ先の独自コードを先に取得したメモリ上へ埋め込む
;
MOV DWORD [ESI+0x0], 0x042444C7
MOV DWORD [ESI+0x4], EDI
MOV DWORD [ESI+0x8], 0x43A960B8
MOV DWORD [ESI+0xC], 0x90E0FF00

POPAD
MOV EAX, DWORD [ESP]
MOV WORD [EAX], 0x22
MOV DWORD [ESI], EAX
PUSH 0x479B7B
RET


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
