티스토리 뷰
단순히 궁금증이 생겨서 비교해보았다.
노트 ㄱㄱ
아래는 .COD 파일을 생성해서 본 결과
아래는 release 빌드시 결과 파일에서 긁어온 내용
당연하지만, 최적화(Optimization)이 되어 있다.
.COD 가 소스(Source) 를 직역했다고 한다면,
아래의 코드는 의역을 했다고 생각할 수 있겠다.
궁금증에서 한번 비교해보긴 했는데, 역시 별게 없었다.
'최적화로 인해 저렇게 바뀌는구나' 하는 감상 뿐... ㅋ
노트 ㄱㄱ
아래는 .COD 파일을 생성해서 본 결과
TITLE d:\projects_svn\test_forloop\test_forloop.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?ret_printf@@YAHH@Z ; 함수 ret_printf
EXTRN _printf:NEAR
_DATA SEGMENT
$SG579 DB '%d', 0aH, 00H
_DATA ENDS
_TEXT SEGMENT
_i$ = 8
?ret_printf@@YAHH@Z PROC NEAR ; ret_printf
; 8 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
; 9 : return printf("%d\n", i);
00003 8b 45 08 mov eax, DWORD PTR _i$[ebp]
00006 50 push eax
00007 68 00 00 00 00 push OFFSET FLAT:$SG579
0000c e8 00 00 00 00 call _printf
00011 83 c4 08 add esp, 8
; 10 : }
00014 5d pop ebp
00015 c3 ret 0
?ret_printf@@YAHH@Z ENDP ; ret_printf
_TEXT ENDS
PUBLIC _main ; 함수 MAIN
_DATA SEGMENT
$SG589 DB '-> %d ', 00H
_DATA ENDS
_TEXT SEGMENT
_i$ = -4
_j$588 = -8
_main PROC NEAR
; 13 : {
00016 55 push ebp
00017 8b ec mov ebp, esp
00019 83 ec 08 sub esp, 8
; 14 : for(int i = 0; i < MAX_PATH; i++)
0001c c7 45 fc 00 00
00 00 mov DWORD PTR _i$[ebp], 0
00023 eb 09 jmp SHORT $L585
$L586:
00025 8b 45 fc mov eax, DWORD PTR _i$[ebp]
00028 83 c0 01 add eax, 1
0002b 89 45 fc mov DWORD PTR _i$[ebp], eax
$L585:
0002e 81 7d fc 04 01
00 00 cmp DWORD PTR _i$[ebp], 260 ; 00000104H
00035 7d 22 jge SHORT $L587
; 16 : int j = ret_printf(i);
00037 8b 4d fc mov ecx, DWORD PTR _i$[ebp]
0003a 51 push ecx
0003b e8 00 00 00 00 call ?ret_printf@@YAHH@Z ; ret_printf
00040 83 c4 04 add esp, 4
00043 89 45 f8 mov DWORD PTR _j$588[ebp], eax
; 17 :
; 18 : printf("-> %d ", j);
00046 8b 55 f8 mov edx, DWORD PTR _j$588[ebp]
00049 52 push edx
0004a 68 00 00 00 00 push OFFSET FLAT:$SG589
0004f e8 00 00 00 00 call _printf
00054 83 c4 08 add esp, 8
; 19 : }
00057 eb cc jmp SHORT $L586
$L587:
; 20 :
; 21 : return 0;
00059 33 c0 xor eax, eax
; 22 : }
0005b 8b e5 mov esp, ebp
0005d 5d pop ebp
0005e c3 ret 0
_main ENDP
_TEXT ENDS
END
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?ret_printf@@YAHH@Z ; 함수 ret_printf
EXTRN _printf:NEAR
_DATA SEGMENT
$SG579 DB '%d', 0aH, 00H
_DATA ENDS
_TEXT SEGMENT
_i$ = 8
?ret_printf@@YAHH@Z PROC NEAR ; ret_printf
; 8 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
; 9 : return printf("%d\n", i);
00003 8b 45 08 mov eax, DWORD PTR _i$[ebp]
00006 50 push eax
00007 68 00 00 00 00 push OFFSET FLAT:$SG579
0000c e8 00 00 00 00 call _printf
00011 83 c4 08 add esp, 8
; 10 : }
00014 5d pop ebp
00015 c3 ret 0
?ret_printf@@YAHH@Z ENDP ; ret_printf
_TEXT ENDS
PUBLIC _main ; 함수 MAIN
_DATA SEGMENT
$SG589 DB '-> %d ', 00H
_DATA ENDS
_TEXT SEGMENT
_i$ = -4
_j$588 = -8
_main PROC NEAR
; 13 : {
00016 55 push ebp
00017 8b ec mov ebp, esp
00019 83 ec 08 sub esp, 8
; 14 : for(int i = 0; i < MAX_PATH; i++)
0001c c7 45 fc 00 00
00 00 mov DWORD PTR _i$[ebp], 0
00023 eb 09 jmp SHORT $L585
$L586:
00025 8b 45 fc mov eax, DWORD PTR _i$[ebp]
00028 83 c0 01 add eax, 1
0002b 89 45 fc mov DWORD PTR _i$[ebp], eax
$L585:
0002e 81 7d fc 04 01
00 00 cmp DWORD PTR _i$[ebp], 260 ; 00000104H
00035 7d 22 jge SHORT $L587
; 16 : int j = ret_printf(i);
00037 8b 4d fc mov ecx, DWORD PTR _i$[ebp]
0003a 51 push ecx
0003b e8 00 00 00 00 call ?ret_printf@@YAHH@Z ; ret_printf
00040 83 c4 04 add esp, 4
00043 89 45 f8 mov DWORD PTR _j$588[ebp], eax
; 17 :
; 18 : printf("-> %d ", j);
00046 8b 55 f8 mov edx, DWORD PTR _j$588[ebp]
00049 52 push edx
0004a 68 00 00 00 00 push OFFSET FLAT:$SG589
0004f e8 00 00 00 00 call _printf
00054 83 c4 08 add esp, 8
; 19 : }
00057 eb cc jmp SHORT $L586
$L587:
; 20 :
; 21 : return 0;
00059 33 c0 xor eax, eax
; 22 : }
0005b 8b e5 mov esp, ebp
0005d 5d pop ebp
0005e c3 ret 0
_main ENDP
_TEXT ENDS
END
아래는 release 빌드시 결과 파일에서 긁어온 내용
당연하지만, 최적화(Optimization)이 되어 있다.
.COD 가 소스(Source) 를 직역했다고 한다면,
아래의 코드는 의역을 했다고 생각할 수 있겠다.
[MAIN]
00401020 /$ 56 push esi
for(int i = 0; i < 260; i++) 에서 맨 처음이 당연히 LOOP에 들어가는 것이니까,
쓸데 없이 비교하는 루틴은 들어가지 않는다,
ESI 를 초기화 하고, 스택에 넣은 뒤 바로 CALL
00401021 |. 33F6 xor esi,esi
00401023 |> 56 push esi
00401024 |. E8 D7FFFFFF call release_.00401000
00401029 |. 83C4 04 add esp,4
함수 호출의 결과 (EAX)를 바로 스택에 넣고 다시 CALL
0040102C |. 50 push eax
0040102D |. 68 34704000 push release_.00407034 ; ASCII "-> %d "
00401032 |. E8 19000000 call release_.00401050
00401037 |. 83C4 08 add esp,8
0040103A |. 46 inc esi
0040103B |. 81FE 04010000 cmp esi,104
00401041 |.^ 7C E0 jl short release_.00401023
00401043 |. 33C0 xor eax,eax
00401045 |. 5E pop esi
00401046 \. C3 retn
[ret_printf]
00401000 /$ 8B4424 04 mov eax,ss:[esp+4]
00401004 |. 50 push eax
00401005 |. 68 30704000 push release_.00407030 ; ASCII "%d",LF
0040100A |. E8 41000000 call release_.00401050
0040100F |. 83C4 08 add esp,8
00401012 \. C3 retn
00401020 /$ 56 push esi
for(int i = 0; i < 260; i++) 에서 맨 처음이 당연히 LOOP에 들어가는 것이니까,
쓸데 없이 비교하는 루틴은 들어가지 않는다,
ESI 를 초기화 하고, 스택에 넣은 뒤 바로 CALL
00401021 |. 33F6 xor esi,esi
00401023 |> 56 push esi
00401024 |. E8 D7FFFFFF call release_.00401000
00401029 |. 83C4 04 add esp,4
함수 호출의 결과 (EAX)를 바로 스택에 넣고 다시 CALL
0040102C |. 50 push eax
0040102D |. 68 34704000 push release_.00407034 ; ASCII "-> %d "
00401032 |. E8 19000000 call release_.00401050
00401037 |. 83C4 08 add esp,8
0040103A |. 46 inc esi
0040103B |. 81FE 04010000 cmp esi,104
00401041 |.^ 7C E0 jl short release_.00401023
00401043 |. 33C0 xor eax,eax
00401045 |. 5E pop esi
00401046 \. C3 retn
[ret_printf]
00401000 /$ 8B4424 04 mov eax,ss:[esp+4]
00401004 |. 50 push eax
00401005 |. 68 30704000 push release_.00407030 ; ASCII "%d",LF
0040100A |. E8 41000000 call release_.00401050
0040100F |. 83C4 08 add esp,8
00401012 \. C3 retn
궁금증에서 한번 비교해보긴 했는데, 역시 별게 없었다.
'최적화로 인해 저렇게 바뀌는구나' 하는 감상 뿐... ㅋ
'보안 > 분석' 카테고리의 다른 글
Reversing Secrets Of Reverse Engineering : RtlNumberGenericTableElements (0) | 2009.10.11 |
---|---|
Reversing Secrets Of Reverse Engineering : RtlInitializeGenericTable (4) | 2009.10.11 |
[자문 自問] POP 대신에 ADD ESP, XX 를 이용하는 이유 ? (3) | 2009.09.16 |
[노트] ProbeForRead (0) | 2009.08.31 |
[노트] Reverse Engineering 하면서 생각나는 질문 들... (2) | 2009.08.13 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- 지루박멸연구센타
- 열정의 힘을 믿는다
- Le4rN TO Cr4cK
- 디버깅에관한모든것(DebugLab)
- sysinternals
- FoundStone
- hashtab
- 보안-coderant
- 디바이스드라이버 개발자 포럼
- dualpage.muz.ro
- osronline.com - 드라이버 관련 정보 사이트
- NtInternals - NativeAPI Refere…
- pcthreat - spyware 정보 제공
- rootkit.com - 루트킷 관련 정보
- www.ntinternals.net
- WINE CrossRef. - source.winehq…
- tuts4you
- hex-rays
- idapalace
- idefense
- immunityinc
- threatexpert
- hdp.null2root.org
- www.crackstore.com
- crackmes.de
- www.who.is
- www.cracklab.ru
- community.reverse-engineering.…
- video.reverse-engineering.net
- SnD
- 클레이 키위
- reversengineering.wordpress.co…
- www.openrce.org
- www.woodmann.com
- PEID.Plusins.BobSoft
- roxik.com/pictaps/
- regexlib.com
- spyware-browser.com
- www.usboffice.kr
- regulator
- www.txt2re.com
- ietab.mozdev.org
- zesrever.xstone.org
- www.heaventools.com/PE-file-he…
- www.heaventools.com
- www.innomp3.com
- 울지않는벌새
- exetools.com-forum
- exetools.com
- utf8 conv
- robtex - IP trace
- onsamehost - same IP sites
- JpopSuki
- jsunpack.jeek.org
- wepawet.iseclab.org
- www.jswiff.com
- www.hackeroo.com
- winesearcher.co.kr
- khpga.org
- malwareurl.com
- anubis.iseclab.org
- www.crummy.com-eautifulSoup
- malwarebytes.org/forums
- bbs.janmeng.com
- blackip.ustc.edu.cn
- eureka.cyber-ta.org
- exploit-db.com
TAG
- systemd
- 피봇
- logrotate
- 전세매매지수
- O365
- PIR
- 실시간트래이딩
- ElasticSearch
- ubuntu
- 주택구매력지수
- 시스템트래이딩
- 레고랜드
- 군함도
- 다올저축은행
- 신한저축은행
- ROA
- 주식트래이딩
- ChatGPT
- 자동트래이딩
- 공공인프라
- CriticalSection
- 주식
- hai
- 사회간접자본
- Pivot
- 맥쿼리인프라
- INVOICE
- 미국주식
- 매매가격지수
- SBI저축은행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함