了解循环反汇编

逆向工程 拆卸 二元分析
2021-06-14 20:45:00

这是我试图了解它的反汇编的循环代码:

#include<stdio.h>
#include <iostream>

using namespace std;

int main() {
   int i, arr[50], num;

   printf("\nEnter no of elements :");
   cin >> num;

   //Reading values into Array
   printf("\nEnter the values :");
   for (i = 0; i < num; i++)
    cin >> arr[i];

   return 0;
}

这是反汇编: 在此处输入图片说明

你能解释一下突出显示的部分吗?什么Var_D8是干什么用的?为什么编译器左移edx

2个回答

var_D8是你的int arr[50]

您可以仅通过其名称快速识别它:50 * sizeof(int) = 200 = 0xC8。堆栈上的下一个变量位于堆栈numb_of_elements上的 -0x10 上,因此我们在 -0xD8 和 -0x10 之间有一些与int数组对应的内存

以下是有关以下说明的一些解释:

lea eax, [ebp+var_D8]  ; Get the address of the first element of the array.
mov edx, [ebp+Counter] ; Get the current element index.
shl edx, 2             ; Since the size of each element of the array is 4, multiply the index by 4
add eax, edx           ; &arr[i] = The address of the current element
mov [esp], eax         ; Move it on the stack so it can be written by std::cin

var_d8是的基准位置arr在堆栈中,类型的大小int在你的机器4,所以该位置arr[i]在堆叠由下式计算:

var_d8 + 4 * i