| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1870 人关注过本帖
标题:释放?不释放?实践是检验真理的唯一标准
只看楼主 加入收藏
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:0 
我还在一条一条的琢磨呢。
2012-08-10 19:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你第二个程序的证明逻辑本身就不对劲。执行文件的汇编码和机器码,都是静态代码,程序还没有执行,何来的释放、应该堆栈大小一样?代码明摆着就分配了那些空间,一个都不能少。想办法看到执行时的情况才行。

授人以渔,不授人以鱼。
2012-08-10 19:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-8-10 19:36:40的发言:

你第二个程序的证明逻辑本身就不对劲。执行文件的汇编码和机器码,都是静态代码,程序还没有执行,何来的释放、应该堆栈大小一样?代码明摆着就分配了那些空间,一个都不能少。想办法看到执行时的情况才行。

您说的极是
2012-08-10 19:54
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-8-10 19:19:31的发言:

这是你第二个代码的汇编文件,你看看它是怎样的:

 
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01  
 
    TITLE    e:\test2.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat
 
INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES
 
PUBLIC    ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@ ; `string'
PUBLIC    ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@ ; `string'
PUBLIC    __$ArrayPad$
PUBLIC    _main
EXTRN    __imp__printf:PROC
EXTRN    _strcpy:PROC
EXTRN    ___security_cookie:DWORD
EXTRN    @__security_check_cookie@4:PROC
EXTRN    @_RTC_CheckStackVars@8:PROC
EXTRN    __RTC_CheckEsp:PROC
EXTRN    _memset:PROC
EXTRN    __RTC_Shutdown:PROC
EXTRN    __RTC_InitBase:PROC
;    COMDAT ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@
; File e:\my_documents\projects\c_test\test2\test2.cpp
CONST    SEGMENT
??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@ DB 'c', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@
CONST    SEGMENT
??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@ DB 0d5H
    DB    0e2H, 0c0H, 0efH, 0d4H, 0d9H, 0d3H, 0d0H, 0d2H, 0bbH, 0b8H, 0f6H
    DB    0d7H, 0d6H, 0b7H, 0fbH, 0b4H, 0aeH, 0d3H, 0a6H, 0b8H, 0c3H, 0caH
    DB    0c7H, 0b2H, 0bbH, 0d4H, 0f6H, 0bcH, 0d3H, 0b6H, 0d1H, 0d5H, 0bbH
    DB    0b4H, 0f3H, 0d0H, 0a1H, 0b2H, 0c5H, 0b6H, 0d4H, 00H ; `string'
CONST    ENDS
;    COMDAT ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@
CONST    SEGMENT
??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@ DB 'b', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@
CONST    SEGMENT
??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@ DB 'a', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@
CONST    SEGMENT
??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@ DB 0ceH
    DB    0d2H, 0d3H, 0c3H, 0d5H, 0e2H, 0b8H, 0f6H, 0caH, 0fdH, 0d7H, 0e9H
    DB    0b7H, 0c5H, 0d2H, 0bbH, 0b8H, 0f6H, 0d7H, 0d6H, 0b7H, 0fbH, 0b4H
    DB    0aeH, 00H                    ; `string'
CONST    ENDS
;    COMDAT rtc$TMZ
rtc$TMZ    SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ    ENDS
;    COMDAT rtc$IMZ
rtc$IMZ    SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ    ENDS
;    COMDAT _main
_TEXT    SEGMENT
_c$ = -216                        ; size = 64
_b$4520 = -144                        ; size = 64
_a$ = -72                        ; size = 64
__$ArrayPad$ = -4                    ; size = 4
_main    PROC                        ; COMDAT
 
; 5    : {
 
  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp
  00003    81 ec 9c 01 00
    00         sub     esp, 412        ; 0000019cH
  00009    53         push     ebx
  0000a    56         push     esi
  0000b    57         push     edi
  0000c    8d bd 64 fe ff
    ff         lea     edi, DWORD PTR [ebp-412]
  00012    b9 67 00 00 00     mov     ecx, 103        ; 00000067H
  00017    b8 cc cc cc cc     mov     eax, -858993460        ; ccccccccH
  0001c    f3 ab         rep stosd
  0001e    a1 00 00 00 00     mov     eax, DWORD PTR ___security_cookie
  00023    33 c5         xor     eax, ebp
  00025    89 45 fc     mov     DWORD PTR __$ArrayPad$[ebp], eax
 
; 6    :     char a[64] = {0};
 
  00028    c6 45 b8 00     mov     BYTE PTR _a$[ebp], 0
  0002c    6a 3f         push     63            ; 0000003fH
  0002e    6a 00         push     0
  00030    8d 45 b9     lea     eax, DWORD PTR _a$[ebp+1]
  00033    50         push     eax
  00034    e8 00 00 00 00     call     _memset
  00039    83 c4 0c     add     esp, 12            ; 0000000cH
 
; 7    :     strcpy(a, "我用这个数组放一个字符串");
 
  0003c    68 00 00 00 00     push     OFFSET ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@
  00041    8d 45 b8     lea     eax, DWORD PTR _a$[ebp]
  00044    50         push     eax
  00045    e8 00 00 00 00     call     _strcpy
  0004a    83 c4 08     add     esp, 8
 
; 8    :     printf("a是:%s\n", a);
 
  0004d    8b f4         mov     esi, esp
  0004f    8d 45 b8     lea     eax, DWORD PTR _a$[ebp]
  00052    50         push     eax
  00053    68 00 00 00 00     push     OFFSET ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@
  00058    ff 15 00 00 00
    00         call     DWORD PTR __imp__printf
  0005e    83 c4 08     add     esp, 8
  00061    3b f4         cmp     esi, esp
  00063    e8 00 00 00 00     call     __RTC_CheckEsp
 
; 9    :   
; 10   :     {
; 11   :         //这是个大括号里面
; 12   :         char b[64] = {0};
 
  00068    c6 85 70 ff ff
    ff 00         mov     BYTE PTR _b$4520[ebp], 0
  0006f    6a 3f         push     63            ; 0000003fH
  00071    6a 00         push     0
  00073    8d 85 71 ff ff
    ff         lea     eax, DWORD PTR _b$4520[ebp+1]
  00079    50         push     eax
  0007a    e8 00 00 00 00     call     _memset
  0007f    83 c4 0c     add     esp, 12            ; 0000000cH
 
; 13   :         strcpy(b, a);
 
  00082    8d 45 b8     lea     eax, DWORD PTR _a$[ebp]
  00085    50         push     eax
  00086    8d 8d 70 ff ff
    ff         lea     ecx, DWORD PTR _b$4520[ebp]
  0008c    51         push     ecx
  0008d    e8 00 00 00 00     call     _strcpy
  00092    83 c4 08     add     esp, 8
 
; 14   :         printf("b是:%s\n", b);
 
  00095    8b f4         mov     esi, esp
  00097    8d 85 70 ff ff
    ff         lea     eax, DWORD PTR _b$4520[ebp]
  0009d    50         push     eax
  0009e    68 00 00 00 00     push     OFFSET ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@
  000a3    ff 15 00 00 00
    00         call     DWORD PTR __imp__printf
  000a9    83 c4 08     add     esp, 8
  000ac    3b f4         cmp     esi, esp
  000ae    e8 00 00 00 00     call     __RTC_CheckEsp
 
; 15   :     }
; 16   :     //理论上到这里b就释放了
; 17   :   
; 18   :     char c[64] = "这里再有一个字符串应该是不增加堆栈大小才对";
 
  000b3    b9 0a 00 00 00     mov     ecx, 10            ; 0000000aH
  000b8    be 00 00 00 00     mov     esi, OFFSET ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@
  000bd    8d bd 28 ff ff
    ff         lea     edi, DWORD PTR _c$[ebp]
  000c3    f3 a5         rep movsd
  000c5    66 a5         movsw
  000c7    a4         movsb
  000c8    33 c0         xor     eax, eax
  000ca    89 85 53 ff ff
    ff         mov     DWORD PTR _c$[ebp+43], eax
  000d0    89 85 57 ff ff
    ff         mov     DWORD PTR _c$[ebp+47], eax
  000d6    89 85 5b ff ff
    ff         mov     DWORD PTR _c$[ebp+51], eax
  000dc    89 85 5f ff ff
    ff         mov     DWORD PTR _c$[ebp+55], eax
  000e2    89 85 63 ff ff
    ff         mov     DWORD PTR _c$[ebp+59], eax
  000e8    88 85 67 ff ff
    ff         mov     BYTE PTR _c$[ebp+63], al
 
; 19   :     printf("c是:%s\n", c);
 
  000ee    8b f4         mov     esi, esp
  000f0    8d 85 28 ff ff
    ff         lea     eax, DWORD PTR _c$[ebp]
  000f6    50         push     eax
  000f7    68 00 00 00 00     push     OFFSET ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@
  000fc    ff 15 00 00 00
    00   ...
这里面连机器码都打了 不好看啊。。
2012-08-10 19:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
弄个没机器码的,等着

授人以渔,不授人以鱼。
2012-08-10 19:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01 

    TITLE    e:\My_Documents\Projects\C_Test\test2\test2.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC    ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@ ; `string'
PUBLIC    ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@    ; `string'
PUBLIC    ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@ ; `string'
PUBLIC    __$ArrayPad$
PUBLIC    _main
EXTRN    __imp__printf:PROC
EXTRN    _strcpy:PROC
EXTRN    ___security_cookie:DWORD
EXTRN    @__security_check_cookie@4:PROC
EXTRN    @_RTC_CheckStackVars@8:PROC
EXTRN    __RTC_CheckEsp:PROC
EXTRN    _memset:PROC
EXTRN    __RTC_Shutdown:PROC
EXTRN    __RTC_InitBase:PROC
;    COMDAT ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@
; File e:\my_documents\projects\c_test\test2\test2.cpp
CONST    SEGMENT
??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@ DB 'c', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@
CONST    SEGMENT
??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@ DB 0d5H
    DB    0e2H, 0c0H, 0efH, 0d4H, 0d9H, 0d3H, 0d0H, 0d2H, 0bbH, 0b8H, 0f6H
    DB    0d7H, 0d6H, 0b7H, 0fbH, 0b4H, 0aeH, 0d3H, 0a6H, 0b8H, 0c3H, 0caH
    DB    0c7H, 0b2H, 0bbH, 0d4H, 0f6H, 0bcH, 0d3H, 0b6H, 0d1H, 0d5H, 0bbH
    DB    0b4H, 0f3H, 0d0H, 0a1H, 0b2H, 0c5H, 0b6H, 0d4H, 00H ; `string'
CONST    ENDS
;    COMDAT ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@
CONST    SEGMENT
??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@ DB 'b', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@
CONST    SEGMENT
??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@ DB 'a', 0caH, 0c7H, 0a3H, 0baH
    DB    '%s', 0aH, 00H                ; `string'
CONST    ENDS
;    COMDAT ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@
CONST    SEGMENT
??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@ DB 0ceH
    DB    0d2H, 0d3H, 0c3H, 0d5H, 0e2H, 0b8H, 0f6H, 0caH, 0fdH, 0d7H, 0e9H
    DB    0b7H, 0c5H, 0d2H, 0bbH, 0b8H, 0f6H, 0d7H, 0d6H, 0b7H, 0fbH, 0b4H
    DB    0aeH, 00H                    ; `string'
CONST    ENDS
;    COMDAT rtc$TMZ
rtc$TMZ    SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ    ENDS
;    COMDAT rtc$IMZ
rtc$IMZ    SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ    ENDS
;    COMDAT _main
_TEXT    SEGMENT
_c$ = -216                        ; size = 64
_b$4520 = -144                        ; size = 64
_a$ = -72                        ; size = 64
__$ArrayPad$ = -4                    ; size = 4
_main    PROC                        ; COMDAT

; 5    : {

    push    ebp
    mov    ebp, esp
    sub    esp, 412                ; 0000019cH
    push    ebx
    push    esi
    push    edi
    lea    edi, DWORD PTR [ebp-412]
    mov    ecx, 103                ; 00000067H
    mov    eax, -858993460                ; ccccccccH
    rep stosd
    mov    eax, DWORD PTR ___security_cookie
    xor    eax, ebp
    mov    DWORD PTR __$ArrayPad$[ebp], eax

; 6    :     char a[64] = {0};

    mov    BYTE PTR _a$[ebp], 0
    push    63                    ; 0000003fH
    push    0
    lea    eax, DWORD PTR _a$[ebp+1]
    push    eax
    call    _memset
    add    esp, 12                    ; 0000000cH

; 7    :     strcpy(a, "我用这个数组放一个字符串");

    push    OFFSET ??_C@_0BJ@PJBNBAIL@?N?R?S?C?U?b?$LI?v?J?$PN?W?i?$LH?E?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?$AA@
    lea    eax, DWORD PTR _a$[ebp]
    push    eax
    call    _strcpy
    add    esp, 8

; 8    :     printf("a是:%s\n", a);

    mov    esi, esp
    lea    eax, DWORD PTR _a$[ebp]
    push    eax
    push    OFFSET ??_C@_08EOHJJGDG@a?J?G?$KD?$LK?$CFs?6?$AA@
    call    DWORD PTR __imp__printf
    add    esp, 8
    cmp    esi, esp
    call    __RTC_CheckEsp

; 9    :   
; 10   :     {
; 11   :         //这是个大括号里面
; 12   :         char b[64] = {0};

    mov    BYTE PTR _b$4520[ebp], 0
    push    63                    ; 0000003fH
    push    0
    lea    eax, DWORD PTR _b$4520[ebp+1]
    push    eax
    call    _memset
    add    esp, 12                    ; 0000000cH

; 13   :         strcpy(b, a);

    lea    eax, DWORD PTR _a$[ebp]
    push    eax
    lea    ecx, DWORD PTR _b$4520[ebp]
    push    ecx
    call    _strcpy
    add    esp, 8

; 14   :         printf("b是:%s\n", b);

    mov    esi, esp
    lea    eax, DWORD PTR _b$4520[ebp]
    push    eax
    push    OFFSET ??_C@_08HHPEKKPD@b?J?G?$KD?$LK?$CFs?6?$AA@
    call    DWORD PTR __imp__printf
    add    esp, 8
    cmp    esi, esp
    call    __RTC_CheckEsp

; 15   :     }
; 16   :     //理论上到这里b就释放了
; 17   :   
; 18   :     char c[64] = "这里再有一个字符串应该是不增加堆栈大小才对";

    mov    ecx, 10                    ; 0000000aH
    mov    esi, OFFSET ??_C@_0CL@LCHNGBJP@?U?b?$MA?o?T?Y?S?P?R?$LL?$LI?v?W?V?$LH?$PL?$LE?$KO?S?$KG?$LI?C?J?G?$LC?$LL?T?v?$LM?S?$LG?Q@
    lea    edi, DWORD PTR _c$[ebp]
    rep movsd
    movsw
    movsb
    xor    eax, eax
    mov    DWORD PTR _c$[ebp+43], eax
    mov    DWORD PTR _c$[ebp+47], eax
    mov    DWORD PTR _c$[ebp+51], eax
    mov    DWORD PTR _c$[ebp+55], eax
    mov    DWORD PTR _c$[ebp+59], eax
    mov    BYTE PTR _c$[ebp+63], al

; 19   :     printf("c是:%s\n", c);

    mov    esi, esp
    lea    eax, DWORD PTR _c$[ebp]
    push    eax
    push    OFFSET ??_C@_08GAIPLOLA@c?J?G?$KD?$LK?$CFs?6?$AA@
    call    DWORD PTR __imp__printf
    add    esp, 8
    cmp    esi, esp
    call    __RTC_CheckEsp

; 20   :
; 21   :     return 0;

    xor    eax, eax

; 22   : }

    push    edx
    mov    ecx, ebp
    push    eax
    lea    edx, DWORD PTR $LN7@main
    call    @_RTC_CheckStackVars@8
    pop    eax
    pop    edx
    pop    edi
    pop    esi
    pop    ebx
    mov    ecx, DWORD PTR __$ArrayPad$[ebp]
    xor    ecx, ebp
    call    @__security_check_cookie@4
    add    esp, 412                ; 0000019cH
    cmp    ebp, esp
    call    __RTC_CheckEsp
    mov    esp, ebp
    pop    ebp
    ret    0
    npad    3
$LN7@main:
    DD    3
    DD    $LN6@main
$LN6@main:
    DD    -72                    ; ffffffb8H
    DD    64                    ; 00000040H
    DD    $LN3@main
    DD    -144                    ; ffffff70H
    DD    64                    ; 00000040H
    DD    $LN4@main
    DD    -216                    ; ffffff28H
    DD    64                    ; 00000040H
    DD    $LN5@main
$LN5@main:
    DB    99                    ; 00000063H
    DB    0
$LN4@main:
    DB    98                    ; 00000062H
    DB    0
$LN3@main:
    DB    97                    ; 00000061H
    DB    0
_main    ENDP
_TEXT    ENDS
END

授人以渔,不授人以鱼。
2012-08-10 20:00
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:0 
程序代码:
.text:004013B7 ; Attributes: bp-based frame
.text:004013B7
.text:004013B7 sub_4013B7      proc near               ; CODE XREF: sub_401000+B4p
.text:004013B7
.text:004013B7 var_DC          = dword ptr -0DCh
.text:004013B7 var_D8          = dword ptr -0D8h
.text:004013B7 var_CC          = byte ptr -0CCh
.text:004013B7 var_8C          = byte ptr -8Ch
.text:004013B7 var_61          = byte ptr -61h
.text:004013B7 var_4C          = byte ptr -4Ch
.text:004013B7
.text:004013B7                 push    ebp
.text:004013B8                 mov     ebp, esp
.text:004013BA                 push    edi
.text:004013BB                 push    esi
.text:004013BC                 push    ebx
.text:004013BD                 and     esp, 0FFFFFFF0h
.text:004013C0                 sub     esp, 0D0h
.text:004013C6                 call    sub_4019B4
.text:004013CB                 lea     ebx, [esp+0DCh+var_4C]
.text:004013D2                 mov     al, 0
.text:004013D4                 mov     edx, 40h
.text:004013D9                 mov     edi, ebx
.text:004013DB                 mov     ecx, edx
.text:004013DD                 rep stosb
.text:004013DF                 lea     eax, [esp+0DCh+var_4C]
.text:004013E6                 mov     edx, eax
.text:004013E8                 mov     ebx, offset aTSO ; "我用这个数组放一个字符串"
.text:004013ED                 mov     eax, 19h
.text:004013F2                 mov     edi, edx
.text:004013F4                 mov     esi, ebx
.text:004013F6                 mov     ecx, eax
.text:004013F8                 rep movsb
.text:004013FA                 lea     eax, [esp+0DCh+var_4C]
.text:00401401                 mov     [esp+0DCh+var_D8], eax
.text:00401405                 mov     [esp+0DCh+var_DC], offset aAGS ; "a是:%s\n"
.text:0040140C                 call    sub_40138C
.text:00401411                 lea     ebx, [esp+0DCh+var_CC]
.text:00401415                 mov     al, 0
.text:00401417                 mov     edx, 40h
.text:0040141C                 mov     edi, ebx
.text:0040141E                 mov     ecx, edx
.text:00401420                 rep stosb
.text:00401422                 lea     eax, [esp+0DCh+var_4C]
.text:00401429                 mov     [esp+0DCh+var_D8], eax
.text:0040142D                 lea     eax, [esp+0DCh+var_CC]
.text:00401431                 mov     [esp+0DCh+var_DC], eax
.text:00401434                 call    strcpy
.text:00401439                 lea     eax, [esp+0DCh+var_CC]
.text:0040143D                 mov     [esp+0DCh+var_D8], eax
.text:00401441                 mov     [esp+0DCh+var_DC], offset aBGS ; "b是:%s\n"
.text:00401448                 call    sub_40138C
.text:0040144D                 lea     edx, [esp+0DCh+var_8C]
.text:00401451                 mov     ebx, offset aTQOJB ; "这里再有一个字符串应该是不增加堆栈大小?...
.text:00401456                 mov     eax, 2Bh
.text:0040145B                 mov     edi, edx
.text:0040145D                 mov     esi, ebx
.text:0040145F                 mov     ecx, eax
.text:00401461                 rep movsb
.text:00401463                 lea     ebx, [esp+0DCh+var_61]
.text:00401467                 mov     al, 0
.text:00401469                 mov     edx, 15h
.text:0040146E                 mov     edi, ebx
.text:00401470                 mov     ecx, edx
.text:00401472                 rep stosb
.text:00401474                 lea     eax, [esp+0DCh+var_8C]
.text:00401478                 mov     [esp+0DCh+var_D8], eax
.text:0040147C                 mov     [esp+0DCh+var_DC], offset aCGS ; "c是:%s\n"
.text:00401483                 call    sub_40138C
.text:00401488                 mov     eax, 0
.text:0040148D                 lea     esp, [ebp-0Ch]
.text:00401490                 pop     ebx
.text:00401491                 pop     esi
.text:00401492                 pop     edi
.text:00401493                 pop     ebp
.text:00401494                 retn
.text:00401494 sub_4013B7      endp
.text:00401494




 
2012-08-10 20:03
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
_c$ = -216                        ; size = 64
_b$4520 = -144                        ; size = 64
_a$ = -72                        ; size = 64

DWORD PTR _a$[ebp]
DWORD PTR _b$4520[ebp]
DWORD PTR _c$[ebp]

而整个过程中ebp都没变 结论和上面的一样

2012-08-10 20:13
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:0 
我最近股悬梁锥刺头的发奋学习汇编。。。 感觉太勃大精深了。
程序虽然没执行,但是有足够的也是唯一需要的信息在代码里面,就是栈桢。
分析栈桢可以知道参数和局部变量的分配情况。
楼上的楼上的楼上的代码是直接分析的CPP文件啊。。。还是反汇编EXE比较好。
2012-08-10 20:26
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用信箱有效在2012-8-10 20:26:32的发言:

我最近股悬梁锥刺头的发奋学习汇编。。。 感觉太勃大精深了。
程序虽然没执行,但是有足够的也是唯一需要的信息在代码里面,就是栈桢。
分析栈桢可以知道参数和局部变量的分配情况。
楼上的楼上的楼上的代码是直接分析的CPP文件啊。。。还是反汇编EXE比较好。

.text:004013B7 ; Attributes: bp-based frame
.text:004013B7
.text:004013B7 sub_4013B7      proc near               ; CODE XREF: sub_401000+B4p
.text:004013B7
.text:004013B7 var_DC          = dword ptr -0DCh
.text:004013B7 var_D8          = dword ptr -0D8h
.text:004013B7 var_CC          = byte ptr -0CCh
.text:004013B7 var_8C          = byte ptr -8Ch
.text:004013B7 var_61          = byte ptr -61h
.text:004013B7 var_4C          = byte ptr -4Ch

你说的这个么 这个好像是逆向的罢
2012-08-10 21:11
快速回复:释放?不释放?实践是检验真理的唯一标准
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023411 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved