返回介绍

9.1 Global variables example

发布于 2025-02-22 14:00:43 字数 2941 浏览 0 评论 0 收藏 0

#!bash
#include <stdio.h>

void f1 (int x, int y, int *sum, int *product)
{
    *sum=x+y;
    *product=x*y;
};

int sum, product;

void main()
{
    f1(123, 456, &sum, &product);
    printf ("sum=%d, product=%d
", sum, product);
};

编译后

Listing 9.1: Optimizing MSVC 2010 (/Ox /Ob0)

#!bash
COMM        _product:DWORD
COMM        _sum:DWORD
$SG2803 DB              ’sum=%d, product=%d’, 0aH, 00H

_x$ = 8                                     ; size = 4
_y$ = 12                                    ; size = 4
_sum$ = 16                                  ; size = 4
_product$ = 20                              ; size = 4
_f1         PROC
            mov     ecx, DWORD PTR _y$[esp-4]
            mov     eax, DWORD PTR _x$[esp-4]
            lea     edx, DWORD PTR [eax+ecx]
            imul    eax, ecx
            mov     ecx, DWORD PTR _product$[esp-4]
            push    esi
            mov     esi, DWORD PTR _sum$[esp]
            mov     DWORD PTR [esi], edx
            mov     DWORD PTR [ecx], eax
            pop     esi
            ret     0
_f1         ENDP

_main       PROC
            push    OFFSET _product
            push    OFFSET _sum
            push    456                     ; 000001c8H
            push    123                     ; 0000007bH
            call    _f1
            mov     eax, DWORD PTR _product
            mov     ecx, DWORD PTR _sum
            push    eax
            push    ecx
            push    OFFSET $SG2803
            call    DWORD PTR __imp__printf
            add     esp, 28                 ; 0000001cH
            xor     eax, eax
            ret     0
_main   ENDP

让我们在 OD 中查看:图 9.1。首先全局变量地址被传递进 f1()。我们在堆栈元素点击“数据窗口跟随”,可以看到数据段上分配两个变量的空间。这些变量被置 0,因为未初始化数据(BSS1)在程序运行之前被清理为 0。这些变量属于数据段,我们按 Alt+M 可以查看内存映射 fig. 9.5.

让我们跟踪(F7)到 f1()fig. 9.2.在堆栈中为 456 (0x1C8) 和 123 (0x7B),接着是两个全局变量的地址。

让我们跟踪到 f1() 结尾,可以看到两个全局变量存放了计算结果。

现在两个全局变量的值被加载到寄存器传递给 printf(): fig. 9.4.

enter image description here

Figure 9.1: OllyDbg: 全局变量地址被传递进 f1()

enter image description here

Figure 9.2: OllyDbg: f1() 开始

enter image description here

Figure 9.3: OllyDbg: f1() 完成

enter image description here

Figure 9.4: OllyDbg: 全局变量被传递进 printf()

enter image description here

Figure 9.5: OllyDbg: memory map

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文