-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfile-hex.Asm
161 lines (126 loc) · 3.61 KB
/
file-hex.Asm
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
.386
.model flat,STDCALL
option casemap :none ;case sensitive
include file-hex.inc
.code
Begin:
call main
invoke ExitProcess,NULL
; âëàñíà ïðîöåäóðà âèä³ëåííÿ ïàì'ÿò³
Mem_Alloc PROC Buf_Size:DWORD
add Buf_Size,4 ; âèä³ëÿºìî áóôåð íà 4 áàéòè á³ëüøèé
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, Buf_Size ; âèä³ëÿºìî îáëàñòü ó äèíàì³÷í³é ïàì'ÿò³
push eax ; çáåð³ãàºìî õåíäë îáëàñò³ âèä³ëåíîãî áóôåðà ó ñòåê
invoke GlobalLock,eax ;ô³êñóºìî ó ðåàëüí³é
pop [eax] ;Âèòÿãíåìî ç³ ñòåêó çíà÷åííÿ ³ çàïèøåìî ó ïåðø³ 4 áàéòà âèä³ëåíîãî ìàñèâó,
;öå çíà÷åííÿ º õåíä îáëàñò³ âèä³ëåíî¿ îáëàñò³
;íàñòóïí³ Buf_Size áàéò âèêîðèñòîâóºìî ÿê ìàñèâ
add eax,4 ;çñóâàºìî âêàç³âíèõ ïî÷àòêó ìàñèâó íà 4 áàéòè, îñê³ëüêè ïåðø³ 4 áàéòè
;çàíÿò³ çíà÷åííÿì õåíäëó áóôåðà
ret ; âèõîäèìî ç ïðîöåäóðè
Mem_Alloc endp
; âëàñíà ïðîöåäóðà çíèùåííÿ ïàì'ÿò³.
Mem_Free PROC DATA:DWORD
mov eax,DATA ;êîï³þºìî çíà÷åííÿ ïàðàìåòðà ïðîöåäóðè ó ðåã³ñòð eax, ïàðàìåòðîì º
;ïî÷àòêîâà (ðîáî÷à) àäðåñà áóôåðà ( ïî÷àòîê + 4 áàéòè)
sub eax,4 ;ïàì'ÿòàºìî, ùî ïåðøèõ 4 áàéòè ìàñèâó - öå õåíäë áóôåðà
push [eax] ;áåðåìî ÷îòèðüîõ áàéòíå çíà÷åííÿ ïî àäðåñ³, ùî ëåæèòü ó ðåã³ñòð³ eax, çàíîñèìî éîãî ó ñòåê
push [eax] ;áåðåìî ÷îòèðüîõ áàéòíå çíà÷åííÿ ïî àäðåñ³, ùî ëåæèòü ó ðåã³ñòð³ eax, çàíîñèìî éîãî ó ñòåê
call GlobalUnlock ;ðîçáëîêîâóºìî ïàì'ÿòü (âñþ ðîçì³ðîì Buf_Size+4)
call GlobalFree ;îñê³ëüêè ïàðàìåòð âæå ó ñòåö³, âèêëèêàºìî ïðîöåäóðó áåç ïàðàìåòð³â, çà äàïîìîãîþ ³íñòðóêö³¿
;call (çíèùóºìî õåíäåë áóôåðà)
ret ;âèõ³ä ç ïðîöåäóðè
Mem_Free endp
read_file proc file_path, pMem:dword
LOCAL hfile, readed:dword
invoke CreateFile, file_path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
cmp eax, -1
je @F
mov hfile, eax
invoke ReadFile, hfile, pMem, 4000h, addr readed, 0
invoke CloseHandle,hfile
@@:
ret
read_file endp
write_file proc file_path, pMem, size_pmem:dword
LOCAL hfile, readed:dword
invoke CreateFile, file_path, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, 0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
cmp eax, -1
je @F
mov hfile, eax
invoke WriteFile, hfile, pMem, size_pmem, addr readed, 0
invoke CloseHandle,hfile
@@:
ret
write_file endp
a2h proc uses edi esi p1,p2:dword
mov esi, p1
mov edi,p2
@@:
lodsb
test al,al
jz exit
mov bl, al
shr bl, 4
and al,0fh
cmp bl,9
ja m1
add bl,'0'
jmp next
m1:
add bl,'A'-10
next:
mov [edi],bl
cmp al,9
ja m2
add al,'0'
jmp next2
m2:
add al,'A'-10
next2:
mov [edi+1],al
add edi,2
jmp @B
exit:
ret
a2h endp
main proc
;init struct
invoke Mem_Alloc, sizeof OPENFILENAME
mov edi, eax
assume edi: ptr OPENFILENAME
invoke GetCurrentDirectory, 260, addr initdir
mov [edi].lStructSize, sizeof OPENFILENAME
mov [edi].lpstrFile, offset filename
mov [edi].nMaxFile, 260
mov [edi].lpstrInitialDir, offset initdir
invoke GetOpenFileName, edi
cmp eax, 0
je exit
; ——————————————————————————————————————————————————————————————————————————————————————————————————
;read data
invoke Mem_Alloc, 4000h
mov pmem, eax
invoke Mem_Alloc, 4000h
mov pmem2, eax
invoke read_file,addr filename,pmem
; ——————————————————————————————————————————————————————————————————————————————————————————————————
;tranform data
invoke a2h,pmem,pmem2
invoke MessageBox, 0, pmem2, 0, MB_OK
; ——————————————————————————————————————————————————————————————————————————————————————————————————
;write data
invoke GetSaveFileName, edi
cmp eax, 0
je exit
invoke lstrlen,pmem2
invoke write_file,addr filename, pmem2,eax
exit:
;free mem
invoke Mem_Free, edi
assume edi:DWORD
invoke Mem_Free, pmem
invoke Mem_Free, pmem2
ret
main endp
end Begin