9.1 Global variables example

  1. #include <stdio.h>
  2. void f1 (int x, int y, int *sum, int *product)
  3. {
  4. *sum=x+y;
  5. *product=x*y;
  6. };
  7. int sum, product;
  8. void main()
  9. {
  10. f1(123, 456, &sum, &product);
  11. printf ("sum=%d, product=%d", sum, product);
  12. };

编译后

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

  1. COMM _product:DWORD
  2. COMM _sum:DWORD
  3. $SG2803 DB sum=%d, product=%d’, 0aH, 00H
  4. _x$ = 8 ; size = 4
  5. _y$ = 12 ; size = 4
  6. _sum$ = 16 ; size = 4
  7. _product$ = 20 ; size = 4
  8. _f1 PROC
  9. mov ecx, DWORD PTR _y$[esp-4]
  10. mov eax, DWORD PTR _x$[esp-4]
  11. lea edx, DWORD PTR [eax+ecx]
  12. imul eax, ecx
  13. mov ecx, DWORD PTR _product$[esp-4]
  14. push esi
  15. mov esi, DWORD PTR _sum$[esp]
  16. mov DWORD PTR [esi], edx
  17. mov DWORD PTR [ecx], eax
  18. pop esi
  19. ret 0
  20. _f1 ENDP
  21. _main PROC
  22. push OFFSET _product
  23. push OFFSET _sum
  24. push 456 ; 000001c8H
  25. push 123 ; 0000007bH
  26. call _f1
  27. mov eax, DWORD PTR _product
  28. mov ecx, DWORD PTR _sum
  29. push eax
  30. push ecx
  31. push OFFSET $SG2803
  32. call DWORD PTR __imp__printf
  33. add esp, 28 ; 0000001cH
  34. xor eax, eax
  35. ret 0
  36. _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.

9.1 Global variables example - 图1

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

9.1 Global variables example - 图2

Figure 9.2: OllyDbg: f1()开始

9.1 Global variables example - 图3

Figure 9.3: OllyDbg: f1()完成

9.1 Global variables example - 图4

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

9.1 Global variables example - 图5

Figure 9.5: OllyDbg: memory map