Poszukuję programu napisanego w assemblerze który będzie szyfrował plik (nie tylko tekstowy), algorytmem podstawieniowym myślałem o najprostszym XOR ale pliki mogą być różnej długości więc nie mogę przyjąć od razu długość pliku. Jak nie znając długości (wielkości) pliku można przeczytać go linijka po linijce? I może macie jakieś wskazówki jak zaimplementować ten algorytm,. Dzięki wielkie za odpowiedzi.
Co to znaczy że nie masz wielkości pliku wczytywanego? To co nie możesz jej pobrać? Bo coś tu jest w takim razie sprzeczne. Wczytując plik do pamięci potrzebujesz jego wielkości.
szyfruj_xorem proc lpBufor:dword, dwRozmiar:dword, dwKlucz:dword
mov eax,lpBufor
mov ecx,dwRozmiar
mov edx,dwKlucz
nastepny_bajt:
xor byte ptr[eax+ecx-1],dl
dec ecx
jne nastepny_bajt
ret
szyfruj_xorem endp
wesołych świąt ;)
Assa napisał(a)
Co to znaczy że nie masz wielkości pliku wczytywanego? To co nie możesz jej pobrać? Bo coś tu jest w takim razie sprzeczne. Wczytując plik do pamięci potrzebujesz jego wielkości.
Niby tak ale jak pobrać wielkość takiego pliku bo np. plik tekstowy będzie potrzebował mniejszego bufora niż plik obrazka.
Bartosz Wójcik napisał(a)
szyfruj_xorem proc lpBufor:dword, dwRozmiar:dword, dwKlucz:dword
mov eax,lpBufor
mov ecx,dwRozmiar
mov edx,dwKlucz
nastepny_bajt:
xor byte ptr[eax+ecx-1],dl
dec ecx
jne nastepny_bajt
ret
szyfruj_xorem endp
wesołych świąt ;)
Czy powyższa procedura da się zastosować do plików innych niż pliki tekstowe?
Życzę także także wesołych świąt :)
Bartosz Wójcik napisał(a)
Nie, tylko pliki z rozszerzeniem .txt i .tiff da się tym zaxorować hehe :P
to w takim razie jakie przekształcić ten kod dla obrazków?
Wybaczcie miałem w tedy kiepski dzień. W kodzie wyskakuje mi błąd (nie jeden :) )
xor byte ptr[eax+ecx-1],dl
spodziewa się jakiejś instrukcji lub przecinka
szyfruj_xorem proc lpBufor:dword, dwRozmiar:dword, dwKlucz:dword
, szyfruj_xorem endp
błąd parsera spodziewa się jakiejś instrukcji. Używam NASM'a
xor byte ptr[eax+ecx-1],dl
w NASM nie ma czegoś takiego jak ptr. Wywal go po prostu.
szyfruj_xorem proc lpBufor:dword, dwRozmiar:dword, dwKlucz:dword
mov eax,lpBufor
mov ecx,dwRozmiar
mov edx,dwKlucz
nastepny_bajt:
xor byte ptr[eax+ecx-1],dl
dec ecx
jne nastepny_bajt
ret
szyfruj_xorem endp
Proc też nie ma.
Nie testowałem, ale w najprostszej wersji powinno to wyglądać mniej-więcej tak:
szyfruj_xorem:
pop edx ;dwKlucz
pop ecx ;dwRozmiar
pop eax ;lpBufor
.nastepny_bajt:
xor byte [eax+ecx-1], dl
dec ecx
jne nastepny_bajt
ret
; po wywołaniu funkcji trzeba będzie jeszcze wyczyścić stos, zostawiamy go na -0xC
<code = asm>; void encrypt_xor(LPBYTE lpBuffor, DWORD dwSize, DWORD dwKey)
encrypt_xor:
push ebp
mov ebp,esp
%stacksize flat
%arg lpBuffor:dword, dwSize:dword, dwKey:dword
mov eax,[lpBuffor]
mov ecx,[dwSize]
mov edx,[dwKey]
next_byte:
xor [eax+ecx-1],dl
dec ecx
jne next_byte
mov esp, ebp
pop ebp
ret
Próbowałem w ten sposób ale ma problem z preprocesorami %stacksize oraz %arg