我刚才其实已经写了一篇了, 然后不知怎么的不见了, 所以我不想说话了. 自己看源码

源码下载地址:
LocateAddr.rar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
	.586
	.model flat, stdcall
	option casemap:none
	Include Windows.inc
	Include kernel32.inc
	Includelib kernel32.lib
;===========================================================================
	.Code
REMOTE_CODE_START	equ this byte
	Include GetApiAddr.inc
	Include GetApiAddr.asm
;===========================================================================
;函数列表, 格式是前面一个是函数的字符串形式, 另外紧接着就是该
;函数的地址存放, 以后就可以这样使用	call  xxx
;===========================================================================
;C语言库函数使用方法printf   msvcrt!_cprintf
_Fun_msvcrt:
	_Function	_cprintf, realloc, malloc
_Fun_msvcrt_End:
;===========================================================================
_Fun_Kernel32:
	_Function	AllocConsole, ExitProcess
_Fun_Kernel32_End:

_User32:
	_Function	MessageBoxA
_User32_End:
;===========================================================================
_Szkernel32	byte	'kernel32', 0
_Szmsvcrt	byte	'msvcrt', 0
_SzUser32	byte	'user32', 0

_SzHello	byte	'这里是自定位的函数的输出', 13, 10, 0

_LocateAddr	Proc

	_Locate ebx		;自定位ebx的值就不能改变了
;===========================================================================
	;Kernel32函数
	lea	eax, [ebx+_Fun_Kernel32_End]
	lea	ecx, [ebx+_Fun_Kernel32]
	lea	edx, [ebx+_Szkernel32]
	Invoke	_FillFunction, edx, ecx, eax
;===========================================================================
	lea	eax, [ebx+_User32_End]
	lea	ecx, [ebx+_User32]
	lea	edx, [ebx+_SzUser32]
	Invoke	_FillFunction, edx, ecx, eax
;===========================================================================
	;C库函数
	lea	eax, [ebx+_Fun_msvcrt_End]
	lea	ecx, [ebx+_Fun_msvcrt]
	lea	edx, [ebx+_Szmsvcrt]
	Invoke	_FillFunction, edx, ecx, eax
;===========================================================================
	lea	eax, [ebx+_SzHello]
	_Invoke	[ebx+__cprintf], eax		;c语言的printf

	lea	eax, [ebx+_SzHello]		;Windows的MessageBox
	_Invoke	[ebx+_MessageBoxA], 0, eax, eax, 0

	_Invoke	[ebx+_ExitProcess], 0		;退出程序
;===========================================================================	

	ret
_LocateAddr 	Endp
;===========================================================================
REMOTE_CODE_END		equ this byte
REMOTE_CODE_LENGTH	equ offset REMOTE_CODE_END - offset REMOTE_CODE_START
REMOTE_CODE_ENTRY	equ offset _LocateAddr - REMOTE_CODE_START
;***************************************************************************
Jmain	Proc
	mov	eax, REMOTE_CODE_LENGTH
	Invoke	VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_EXECUTE_READWRITE
;====================================================================
	;将代码copy到堆里去执行
	pushad
	mov	esi, offset REMOTE_CODE_START
	mov	edi, eax

	mov	ecx, REMOTE_CODE_LENGTH
	cld
	rep	movsb
	popad
;====================================================================
	;将原来的代码全部填0, 以免干扰
	pushad
	mov	edi, offset REMOTE_CODE_START
	mov	eax, 0
	mov	ecx, REMOTE_CODE_LENGTH
	cld
	rep	stosb
	popad
;====================================================================
	add	eax, REMOTE_CODE_ENTRY	;入口
	jmp	eax
Jmain	Endp

End	Jmain