我必须从二进制打开的文件中一次读取4个字符,因此我可以应用带有双重定义变量的XOR。我以二进制读取方式打开文件,当我应用XOR时,它会更改每个字节。我认为我的程序实际上需要一个转弯处的每个字节,而不是4字节块。我怎么能一次读取4个?
buffer dd 0
rmode db "rb",0
rfilename db "input.txt"
key dd 0Ah
.....................................................................
;open the file
push offset rmode
push offset rfilename
call fopen
add esp ,8
push eax
push 1
push 1
push offset buffer
read_loop:
call fread
test eax,eax
jz close_file
MOV ebx,key
XOR buffer,eax
............................................
输入
0123
我明白了:
:;89
但它应该是
0129
答案 0 :(得分:1)
我至少可以看到几个问题。
一般来说,当你打电话时,你必须推动然后忘记"数据。您可以针对fopen
来电,但不能fread
。
然后以某种方式你想要读取4个字节,但是push 1
作为大小...你可能希望push 4
作为大小而push 1
作为项目数。这样你就可以保持简单的test eax,eax
来打破循环(尽管这样你就不会检查错误:即eax = -1
)。这个:
read_loop: ; <- move loop here
push eax
push 1
push 4 ; <- use 4 to read 4 bytes
push offset buffer
call fread
add esp, 16 ; <- forget the push'es
test eax,eax
jz close_file
接下来,您获得ebx
中的密钥,然后使用xor
eax
MOV ebx,key
XOR buffer,eax ; <- shouldn't this be ebx?
由于fread
会返回大小,因此使用xor
执行eax
肯定是错误的。
旁注:fread
如果文件中只剩下1,2或3位数,则会失败。您可以通过交换push 1
和push 4
来规避这一点,然后检查返回值以了解读取了多少字符......这样做的工作量更多了!