首页 > Win32 ASM > 极度BT的一段汇编代码

极度BT的一段汇编代码

源自看雪论坛,《ASM的魅力(一)》,目前就弄懂了他怎么通过堆栈调用函数,至于程序是怎么结束的还是不清楚。原帖地址:http://bbs.pediy.com/showthread.php?t=96969。整个看得比较头晕,转来转去的。

对函数的调用是先压入参数,然后压入返回地址,压入函数地址,接着一句lea esp,[esp + 4],让esp加4,于是esp指向返回地址了。然后jmp dword ptr [esp - 4],就相当于跳转到了函数地址,整个模仿了call的实现,很是精辟。

下面的代码稍稍做了点改动(用MASM可以正常编译。另外,金山毒霸报毒,可能是因为这些及怪的代码编译之后的产物太畸形了吧O(∩_∩)O~)

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
100
101
102
103
104
105
106
107
				.386P
				.model flat, stdcall
				option casemap:none
 
include			windows.inc
include			user32.inc
includelib		user32.lib
include			kernel32.inc
includelib		kernel32.lib
 
				.data
hInst			dd		?
dwA				dd		0100h
dwB				dd		0200h
dwC				dd		?
szOut			db		20h dup(0)
 
				.code
start:
				mov		eax, dword ptr [esp]	;
				mov		dwExit, eax
 
				xor		ebx, ebx
				push	ebx						;参数
				push	offset aa				;返回地址
				push	offset GetModuleHandleA	;函数地址
				lea		esp, [esp + 4]
				jmp		dword ptr [esp -4]
aa:
				mov		hInst, eax
				push	dwC
				push	dwB
				push	dwA
				push	dwProc2Entry
				push	ebx
				push	ebx
				push	offset szMsg
				push	ebx
				push	dwProc1Entry
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
_sub3:
				add		esp, 20
				pop		dwC
				push	offset _ret
				push	ebx
				push	ebx
 
				push	offset szMsg
				push	ebx
				push	dwProc1Entry
				lea		esp, [esp + 4]
				jmp		dword ptr [esp -4]
szFmt			db		'dwC=%xh', 0
_ret:
				push	dwC
				push	offset szFmt
				push	offset	szOut
				push	offset bb
				push	offset wsprintfA
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
bb:
				push	ebx
				push	ebx
				push	offset szOut
				push	ebx
				push	offset cc
				push	offset MessageBoxA
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
cc:
				push	ebx
				push	offset	ee
				push	offset	ExitProcess
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
ee:
				push	offset dwExit
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
 
				.data
dwProc1Entry	dd		offset _sub1
dwProc2Entry	dd		offset _sub2
dwExit			dd		?
szMsg			db		'子程序', 0
 
				.code
_sub1:
				push	offset ff
				push	offset MessageBoxA
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
ff:
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
 
_sub2:
				mov		eax, [esp]
				add		eax, [esp + 4]
				mov		[esp + 8], eax
				push	offset _sub3
				lea		esp, [esp + 4]
				jmp		dword ptr [esp - 4]
 
				end		start

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 极度BT的一段汇编代码
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: Win32 ASM 标签: , ,
  1. 2011年3月17日11:39 | #1

    呵呵,不错不错。有空了我也在回味一下这些个代码,这可比现在的这些java或者.net带劲多了。

    [回复]

  2. 2011年3月17日18:08 | #2

    @the5fire
    学习汇编有助于了解操作系统底层的一些运行机制,呵呵

    [回复]