metasploit-framework/external/source/shellcode/windows/templates/inc/function.inc

310 lines
8.2 KiB
PHP

; MACROS FOR FUNCTION DECLARATIONS v0.9a
; ======================================
;gérer les appels de fonctions externes C (linux)
;return() ?
;FUNCTION.INC_CONVENTION = C|Std = convention d'appel des fonctions par défaut
;FunctionDefine alias,C|Std|Pascal [,adresse]
; -> FunctionDefine_alias = C|Std|Pascal
; @alias = adresse de la fonction
; alias$ (si aucun paramètre)
; alias([p1,...]) (si plusieurs paramètres)
;Function alias, [,p1,...]
; <- FunctionDefine
; -> @alias = adresse de la fonction
; Function_EBP ebp
; Function_EIP byte ebp+4
;[FunctionResd nom,nombre d]
;[FunctionResw nom,nombre w]
;[FunctionResb nom,nombre b]
;...
;FunctionBegin
; <- Sub
; ...
;FunctionEnd
; <- FUNCTION.INC_CONVENTION,BYTE.INC_NO_00
;FunctionCall alias, [,p1,...]
; <- Push,Call,BYTE.INC_TEMPORARY_REGISTER(push & pop C)
;================================= General ===================================
%ifndef _FUNCTION.INC
%define _FUNCTION.INC
%include "byte.inc"
%macro FUNCTION.INC 0
BYTE.INC
%define FUNCTION.INC_CONVENTION C
%endmacro
%macro FUNCTION.INC~ 0
BYTE.INC~
%define FUNCTION.INC_CONVENTION C
%endmacro
FUNCTION.INC
%macro FunctionDefine 2-3
%define FunctionDefine_%1 %2
%if %0==3
%ifnidni %3,@%1
%define @%1 %3
%endif
%endif
%define %1$ FunctionCall %1
%define %1(p1) FunctionCall %1,p1
%define %1(p1,p2) FunctionCall %1,p1,p2
%define %1(p1,p2,p3) FunctionCall %1,p1,p2,p3
%define %1(p1,p2,p3,p4) FunctionCall %1,p1,p2,p3,p4
%define %1(p1,p2,p3,p4,p5) FunctionCall %1,p1,p2,p3,p4,p5
%define %1(p1,p2,p3,p4,p5,p6) FunctionCall %1,p1,p2,p3,p4,p5,p6
%define %1(p1,p2,p3,p4,p5,p6,p7) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7
%define %1(p1,p2,p3,p4,p5,p6,p7,p8) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19
%define %1(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20) FunctionCall %1,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20
%endmacro
;================================= Function ==================================
%macro Function 1-*
FUNCTION.INC~
%ifndef Function_%1
%ifctx Function
Error FUNCTION,Function =X=> Function
%else
%push Function
%define Function_%1
%define Function_Name_Define @%1
%ifndef BYTE.INC_NO_00
%define Function_EBP byte ebp
%endif
%define Function_EIP byte ebp+4
FunctionDefine %1,FUNCTION.INC_CONVENTION
%assign Function_Params_Assign 4
%if %0>1
%rotate 1
%rep %0-1
%assign Function_Params_Assign Function_Params_Assign+4
%1_Equ equ Function_Params_Assign
%define %1 byte ebp+%1_Equ
%rotate 1
%endrep
%endif
%assign Function_Locals_Assign 0
%endif
%undef Function_Exist_Define
%else
%define Function_Exist_Define
%endif
%endmacro
%macro FunctionResd 2
%ifndef Function_Exist_Define
%ifctx Function
%assign Function_Locals_Assign Function_Locals_Assign+%2*4
%1_Equ equ Function_Locals_Assign
%if (Function_Locals_Assign < 256)
%define %1 byte ebp-%1_Equ
%else
%define %1 dword ebp-%1_Equ
%ifdef BYTE.INC_NO_00
Warning FUNCTION,FunctionResd %1,%2 => 00 ?
%endif
%endif
%else
Error FUNCTION,FunctionResd => Function
%endif
%endif
%endmacro
%macro FunctionResw 2
%ifndef Function_Exist_Define
%ifctx Function
%assign Function_Locals_Assign Function_Locals_Assign+%2*2
%1_Equ equ Function_Locals_Assign
%if (Function_Locals_Assign < 256)
%define %1 byte ebp-%1_Equ
%else
%define %1 dword ebp-%1_Equ
%ifdef BYTE.INC_NO_00
Warning FUNCTION,FunctionResw %1,%2 => 00 ?
%endif
%endif
%else
Error FUNCTION,FunctionResw => Function
%endif
%endif
%endmacro
%macro FunctionResb 2
%ifndef Function_Exist_Define
%ifctx Function
%assign Function_Locals_Assign Function_Locals_Assign+%2
%1_Equ equ Function_Locals_Assign
%if (Function_Locals_Assign < 256)
%define %1 byte ebp-%1_Equ
%else
%define %1 dword ebp-%1_Equ
%ifdef BYTE.INC_NO_00
Warning FUNCTION,FunctionResb %1,%2 => 00 ?
%endif
%endif
%else
Error FUNCTION,FunctionResb => Function
%endif
%endif
%endmacro
%macro FunctionBegin 0
%ifndef Function_Exist_Define
%ifctx Function
Function_Name_Define:
%define BYTE.INC_TEMPORARY_REGISTER eax
%if (Function_Params_Assign>4)||(Function_Locals_Assign>0)
push ebp
mov ebp,esp
%endif
%if Function_Locals_Assign>0
Sub esp,Function_Locals_Assign
%endif
; enter Function_Locals_Assign,0
%undef BYTE.INC_TEMPORARY_REGISTER
%else
Error FUNCTION,FunctionBegin => Function
%endif
%endif
%endmacro
%macro FunctionEnd 0
%ifndef Function_Exist_Define
%ifctx Function
%if (Function_Params_Assign>4)||(Function_Locals_Assign>0)
leave
%endif
%ifnidni FUNCTION.INC_CONVENTION,C
%if Function_Params_Assign==4
ret
%elifndef BYTE.INC_NO_00
ret Function_Params_Assign-4
%else
Error FUNCTION,NO_00 =X=> CONVENTION Std
%endif
%else
ret
%endif
%undef Function_Name_Define
%pop
%else
Error FUNCTION,FunctionEnd => Function
%endif
%endif
%undef Function_Exist_Define
FUNCTION.INC~
%endmacro
;=================================== Call ====================================
%macro FunctionCallStd 1-*
%define BYTE.INC_TEMPORARY_REGISTER eax
%rep %0-1
%rotate -1
Push %1
%endrep
Call FunctionCall_Address_Define
%undef BYTE.INC_TEMPORARY_REGISTER
%endmacro
%macro FunctionCallPascal 1-*
%define BYTE.INC_TEMPORARY_REGISTER eax
%rep %0-1
%rotate 1
Push %1
%endrep
Call FunctionCall_Address_Define
%undef BYTE.INC_TEMPORARY_REGISTER
%endmacro
%macro FunctionCallC 1-*
%ifndef BYTE.INC_NO_00
%define BYTE.INC_TEMPORARY_REGISTER eax
%else
%ifdef BYTE.INC_TEMPORARY_REGISTER
%ifidni BYTE.INC_TEMPORARY_REGISTER,eax
Error FUNCTION,NO_00 => TEMPORARY_REGISTER <> eax
%endif
%else
Error FUNCTION,NO_00 => TEMPORARY_REGISTER
%endif
%endif
%rep %0-1
%rotate -1
Push %1
%endrep
Call FunctionCall_Address_Define
%if %0>1
%ifndef BYTE.INC_NO_00
%assign FunctionCallC_Assign (%0-1)*4
add esp,FunctionCallC_Assign
%undef BYTE.INC_TEMPORARY_REGISTER
%else
%ifdef BYTE.INC_TEMPORARY_REGISTER
%rep %0-1
pop BYTE.INC_TEMPORARY_REGISTER
%endrep
%else
Error FUNCTION,NO_00 => TEMPORARY_REGISTER
%endif
%endif
%endif
%endmacro
;FunctionCall nom fonction [,p1,...]
%macro FunctionCall 1-2+
%ifdef FunctionDefine_%1
%define FunctionCall_Address_Define @%1
%ifidni FunctionDefine_%1,Std
%if %0==1
FunctionCallStd %1
%else
FunctionCallStd %1,%2
%endif
%elifidni FunctionDefine_%1,Pascal
%if %0==1
FunctionCallPascal %1
%else
FunctionCallPascal %1,%2
%endif
%else
%if %0==1
FunctionCallC %1
%else
FunctionCallC %1,%2
%endif
%endif
%undef FunctionCall_Address_Define
%else
%if %0==1
Error FUNCTION,FunctionCall %1
%else
Error FUNCTION,FunctionCall %1,%2
%endif
%endif
%endmacro
%endif