Dit is wat code uit een spel. Nu snap ik ongeveer wat deze functie doet, maar ik snap niet helemaal wat een bepaalde instructie met de stack doet. Het gaat om de volgende instructie:
Volgens mij staat op die lokatie namelijk ecx (gepushed door eerste instructie). Het lijkt me niet dat daar gewoon overheen wordt geschreven.
code:
1
| 4FBF mov [esp+10h], ebx |
Volgens mij staat op die lokatie namelijk ecx (gepushed door eerste instructie). Het lijkt me niet dat daar gewoon overheen wordt geschreven.
code:
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
| 4F80 CommonFunc20 proc near 4F80 4F80 arg_0 = dword ptr 14h 4F80 4F80 push ecx 4F81 push ebx 4F82 push ebp 4F83 push esi 4F84 mov esi, [esp+arg_0] 4F88 test esi, esi 4F8A push edi 4F8B mov ebp, ecx 4F8D jz loc_5142 4F93 mov edi, esi 4F95 or ecx, 0FFFFFFFFh 4F98 xor eax, eax 4F9A repne scasb 4F9C not ecx 4F9E dec ecx 4F9F jz loc_5142 4FA5 mov eax, [ebp+0] 4FA8 mov ecx, ebp 4FAA call dword ptr [eax+4] 4FAD push esi ; const char * 4FAE call __strdup 4FB3 mov ebx, eax 4FB5 or ecx, 0FFFFFFFFh 4FB8 mov edi, ebx 4FBA xor eax, eax 4FBC add esp, 4 4FBF mov [esp+10h], ebx 4FC3 repne scasb 4FC5 not ecx 4FC7 dec ecx 4FC8 jz short loc_4FEB 4FCA mov edi, ebx 4FCC or ecx, 0FFFFFFFFh 4FCF repne scasb 4FD1 not ecx 4FD3 dec ecx 4FD4 cmp byte ptr [ecx+ebx-1], 0Ah 4FD9 jnz short loc_4FEB 4FDB mov edi, ebx 4FDD or ecx, 0FFFFFFFFh 4FE0 xor eax, eax 4FE2 repne scasb 4FE4 not ecx 4FE6 dec ecx 4FE7 mov [ecx+ebx-1], al 4FEB 4FEB loc_4FEB: 4FEB 4FEB mov al, [ebx] 4FED xor esi, esi 4FEF test al, al 4FF1 jz short loc_4FF8 4FF3 mov esi, 1 4FF8 4FF8 loc_4FF8: 4FF8 test al, al 4FFA mov ecx, ebx 4FFC jz short loc_500B 4FFE 4FFE loc_4FFE: 4FFE cmp al, 2Ch 5000 jnz short loc_5003 5002 inc esi 5003 5003 loc_5003: 5003 mov al, [ecx+1] 5006 inc ecx 5007 test al, al 5009 jnz short loc_4FFE 500B 500B loc_500B: 500B test esi, esi 500D jz loc_5142 5013 mov eax, [ebp+10h] 5016 test eax, eax 5018 jz short loc_5053 501A mov ecx, [ebp+0Ch] 501D test ecx, ecx 501F lea eax, [ecx-1] 5022 mov [ebp+0Ch], eax 5025 jz short loc_5047 5027 5027 loc_5027: 5027 mov ecx, [ebp+10h] 502A mov eax, [ecx+eax*4] 502D test eax, eax 502F jz short loc_503A 5031 push eax 5032 call sub_5A55 5037 add esp, 4 503A 503A loc_503A: 503A mov ecx, [ebp+0Ch] 503D test ecx, ecx 503F lea eax, [ecx-1] 5042 mov [ebp+0Ch], eax 5045 jnz short loc_5027 5047 5047 loc_5047: 5047 mov edx, [ebp+10h] 504A push edx 504B call sub_57DD 5050 add esp, 4 5053 5053 loc_5053: 5053 mov [ebp+0Ch], esi 5056 mov dword ptr [ebp+10h], 0 505D shl esi, 2 5060 push esi ; size 5061 call new 5066 mov ecx, esi 5068 mov edi, eax 506A mov edx, ecx 506C xor eax, eax 506E shr ecx, 2 5071 mov [ebp+10h], edi 5074 add esp, 4 5077 repe stosd 5079 mov ecx, edx 507B and ecx, 3 507E repe stosb 5080 mov edi, [esp+4+arg_0] 5084 or ecx, 0FFFFFFFFh 5087 xor eax, eax 5089 repne scasb 508B not ecx 508D sub edi, ecx 508F mov eax, ecx 5091 mov esi, edi 5093 mov edi, ebx 5095 shr ecx, 2 5098 repe movsd 509A mov ecx, eax 509C and ecx, 3 509F repe movsb 50A1 mov ecx, [esp+10h] 50A5 xor edi, edi 50A7 mov [esp+4+arg_0], edi 50AB cmp byte ptr [ecx], 0 50AE jz short loc_5107 50B0 50B0 loc_50B0: 50B0 mov al, [ebx] 50B2 mov esi, ebx 50B4 test al, al 50B6 jz short loc_50C4 50B8 50B8 loc_50B8: 50B8 cmp al, 2Ch 50BA jz short loc_50C4 50BC mov al, [esi+1] 50BF inc esi 50C0 test al, al 50C2 jnz short loc_50B8 50C4 50C4 loc_50C4: 50C4 50C4 cmp byte ptr [esi], 0 50C7 jz short loc_50CD 50C9 mov byte ptr [esi], 0 50CC inc esi 50CD 50CD loc_50CD: 50CD mov edx, [esp+4+arg_0] 50D1 shl edi, 2 50D4 inc edx 50D5 mov [esp+4+arg_0], edx 50D9 mov edx, [ebp+10h] 50DC mov eax, [edx+edi] 50DF test eax, eax 50E1 jz short loc_50EC 50E3 push eax 50E4 call sub_5A55 50E9 add esp, 4 50EC 50EC loc_50EC: 50EC push ebx ; const char * 50ED call __strdup 50F2 mov ecx, [ebp+10h] 50F5 add esp, 4 50F8 mov ebx, esi 50FA mov [ecx+edi], eax 50FD mov al, [esi] 50FF mov edi, [esp+4+arg_0] 5103 test al, al 5105 jnz short loc_50B0 5107 5107 loc_5107: 5107 mov edx, [ebp+0Ch] 510A dec edx 510B cmp edi, edx 510D jnz short loc_5135 510F mov eax, [ebp+10h] 5112 mov eax, [eax+edi*4] 5115 test eax, eax 5117 jz short loc_5122 5119 push eax 511A call sub_5A55 511F add esp, 4 5122 5122 loc_5122: 5122 push offset noparams ; const char * 5127 call __strdup 512C mov ecx, [ebp+10h] 512F add esp, 4 5132 mov [ecx+edi*4], eax 5135 5135 loc_5135: 5135 mov edx, [esp+10h] 5139 push edx 513A call sub_5A55 513F add esp, 4 5142 5142 loc_5142: 5142 5142 pop edi 5143 pop esi 5144 pop ebp 5145 pop ebx 5146 pop ecx 5147 retn 4 5147 CommonFunc20 endp |