OllyDbg - 读取文件 API

逆向工程 ollydbg
2021-07-01 18:49:54

我正在学习逆向工程(Lena's Reversing for Newbies)第 2 部分我对ReadFileAPI感到困惑

在第 2 部分中,我创建了一个空白的Keyfile.datNear 应用程序(其中没有密钥)。

在此处输入图片说明

pBytesRead :读取字节数的地址

大小(要读取的字节数)= 70 // 要读取的字节数。

  1. 什么是-> 0pBytesReadBuffer 中,符号->0出现00这意味着什么?
  2. Size (Number of Bytes to Read) = 70 是什么意思?这是否意味着程序应该读取70十进制?

我对这部分感到困惑。

2个回答
  1. 什么是-> 0pBytesReadBuffer 中,符号->0出现00这意味着什么?

OllyDbg想帮助你,并为你提供一个额外的信息—— “给定地址当前有什么?”

  • address -> something表示在address当前something— 请参阅以下内存转储图片。

(在 C 语言的说法中,地址是指向内存指针:“地址指向内存中的某物”,因此您可以读->作“指向”。)

  • pBytesRead = reverseMe.402173 -> 0表示地址402173是当前0

  • Buffer = reverseMe.40211A -> 00表示 at 地址40211A当前为00

但是为什么0在第一种情况下,00在第二种情况下呢?

因为 - 再次 - OllyDbg想帮助你。它足够聪明,可以正确解释记忆内容的含义——在给定的上下文中——对于你,一个人类:

  • 在第一种情况 ( pBytesRead) 中,预期数据是一个数字,因此它将双字(4 个连续字节;文档中的 LPDWORD 表示指向双字的长指针)转换为十进制数0在您的情况下):

    在此处输入图片说明

  • 在第二种情况 ( Buffer) 中,预期数据是一个字节(例如一个字符),因此如果可能,它会将其显示为ASCII 字符(例如'p'),否则显示为2 个十六进制数字00在您的情况下):

    在此处输入图片说明


  1. Size (Number of Bytes to Read) = 70 是什么意思?这是否意味着程序应该读取70十进制?

是的 - 更准确地说,最多(最多) 70 个字节。

您可以MSDN上找到有关ReadFile函数的更多信息

来自MSDN的函数签名

BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);

如果你同意我的看法,那么函数是如何被调用的:

ReadFile(EAX, OFFSET 0x0040211A, 0x46, OFFSET 0x00402173, 0);

这里0x46(一个十六进制数)放在nNumberOfBytesToRead参数上,我们将读取70(十进制)字符。

  • hfile - 文件的句柄,在这种情况下,它是从CreateFileA之前分配的