All pastes #809013 Raw Edit

Mine

public text v1 · immutable
·published 2007-12-08 03:38 UTC
rendered paste body
; -------------------------------------------------------
; K32B.INC
;   An include to simplify and speed the development
;   of applications that do not have an import section.
; -------------------------------------------------------
; Copyright (c) Bryant Keller, 2005
; -------------------------------------------------------
GetProcAddr		proto :DWORD, :DWORD
K32Base		proto

DEFINE_API macro api_id:REQ, api_string:VARARG
	&api_id&_str	db api_string, 0
	&api_id&_fn	dd 0
endm

LdAPI macro libname:REQ, procname:REQ
	push	offset &procname&_str
	push	libname
	call	[GetProcAddr]
	mov	&procname&_fn, eax
endm

ACall macro funcname:REQ,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22
	FOR arg,<a22,a21,a20,a19,a18,a17,a16,a15,a14,a13,a12,a11,a10,a9,a8,a7,a6,a5,a4,a3,a2,a1>
		IFNB	<arg>
			push	arg
		ENDIF
	ENDM
	call	[&funcname&_fn]
endm

K32B macro k32ref:REQ
	local	________GetKernel32_Delta_Method_Macro
	call	________GetKernel32_Delta_Method_Macro
		________GetKernel32_Delta_Method_Macro:
	pop	ebp
	sub	ebp, OFFSET ________GetKernel32_Delta_Method_Macro
	call	[K32Base]
	mov	k32ref, eax
endm

.code
;------------------------------------------------------------------------------
; Obtains the base address of KERNEL32.DLL
;------------------------------------------------------------------------------
K32Base proc
	mov	ecx, [esp + 4]
@@:	xor	edx, edx
	dec	ecx
	mov	dx, [ecx + 3ch]
	test	dx, 0f800h
	jnz	@b
	cmp	ecx, [ecx + edx + 34h]
	jnz	@b
	mov	eax, ecx
	ret
K32Base endp

;------------------------------------------------------------------------------
; GetProcAddress replacement
;------------------------------------------------------------------------------
GetProcAddr proc uses esi edi ecx ebx edx, hLib:DWORD, szProc:DWORD

	mov	esi, hLib
	cmp	word ptr [esi], 5a4dh				; check the DOS MZ signature
	jnz	@@error_exit

	add	esi, [esi + 03ch]
	cmp	dword ptr [esi], 00004550h				; check the PE signature
	jnz	@@error_exit

	mov	edi, szProc						; obtain the length of the api name
	mov	ecx, 200
	xor	al, al
	repnz	scasb
	mov	ecx, edi
	sub	ecx, szProc						; ecx = strlen ( szProc )

	mov	edx, [esi + 078h]					; trace the export table
	add	edx, hLib						; edx = export table

	assume	edx:ptr IMAGE_EXPORT_DIRECTORY
	mov	ebx, [edx].AddressOfNames
	add	ebx, hLib						; ebx = AddressOfNames
	xor	eax, eax						; eax = AddressOfNames index

@@:	mov	edi, [ebx]
	add	edi, hLib
	mov	esi, szProc
	push	ecx
	repz	cmpsb							; save the api string length
	jz	@@sth_done

	pop	ecx
	add	ebx, 4
	inc	eax
	cmp	eax, [edx].NumberOfNames
	jne	@b
	jmp	@f

	@@sth_done:
	add	esp, 4

@@:	cmp	eax, [edx].NumberOfNames				; did we find sth?
	je	@@error_exit

	mov	esi, [edx].AddressOfNameOrdinals			; find the corresponding ordinal
	add	esi, hLib
	push	edx							; save the export table pointer
	mov	ebx, 2
	xor	edx, edx
	mul	ebx
	pop	edx
	add	eax, esi
	xor	ecx, ecx
	mov	word ptr cx, [eax]					; ecx = API ordinal
	
	mov	edi, [edx].AddressOfFunctions			; get the address of the api
	xor	edx, edx
	mov	ebx, 4
	mov	eax, ecx
	mul	ebx
	add	eax, hLib
	add	eax, edi
	mov	eax, [eax]
	add	eax, hLib
	jmp	@f

	assume	edx:nothing
	@@error_exit:
	xor	eax, eax						; return zero on error
@@:	ret								; return address of api on success
GetProcAddr endp