9.2 Local variables example

让我们修改一下例子:

Listing 9.2: 局部变量

  1. void main()
  2. {
  3. int sum, product; // now variables are here
  4. f1(123, 456, &sum, &product);
  5. printf ("sum=%d, product=%d
  6. ", sum, product);
  7. };

f1()函数代码没有改变。仅仅main()代码作了修改。

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

  1. _product$ = -8 ; size = 4
  2. _sum$ = -4 ; size = 4
  3. _main PROC
  4. ; Line 10
  5. sub esp, 8
  6. ; Line 13
  7. lea eax, DWORD PTR _product$[esp+8]
  8. push eax
  9. lea ecx, DWORD PTR _sum$[esp+12]
  10. push ecx
  11. push 456 ; 000001c8H
  12. push 123 ; 0000007bH
  13. call _f1
  14. ; Line 14
  15. mov edx, DWORD PTR _product$[esp+24]
  16. mov eax, DWORD PTR _sum$[esp+24]
  17. push edx
  18. push eax
  19. push OFFSET $SG2803
  20. call DWORD PTR __imp__printf
  21. ; Line 15
  22. xor eax, eax
  23. add esp, 36 ; 00000024H
  24. ret 0

我们在OD中查看,局部变量地址在堆栈中是0x35FCF4和0x35FCF8。我们可以看到是如何圧栈的fig. 9.6.

f1()开始的时候,随机栈地址为0x35FCF4和0x35FCF8 fig. 9.7.

f1()完成时结果0xDB18和0x243存放在地址0x35FCF4和0x35FCF8。

9.2 Local variables example - 图1

Figure 9.6: OllyDbg: 局部变量地址被圧栈

9.2 Local variables example - 图2

Figure 9.7: OllyDbg: f1()starting

9.2 Local variables example - 图3

Figure 9.8: OllyDbg: f1()finished