Вот что сделано в MSVC 6. Код (Text): #pragma comment(linker,"/MERGE:.data=.text") #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,ER /IGNORE:4078") #pragma comment(linker,"/SUBSYSTEM:WINDOWS") #pragma comment(linker,"/ENTRY:New_WinMain") #pragma comment(linker,"/NODEFAULTLIB") #include "windows.h" void New_WinMain(void) { DWORD dwFibra=0x6688; DWORD dwptr=(DWORD)&dwFibra; __asm{ call delta delta: //pop ebp mov eax,[esp] sub eax,offset delta } //printf("Hello World!\n"); char lpMessage[]="HELLO!\0x0"; char lpCaption[]="CAPTION\0x0"; MessageBoxA(NULL,lpMessage,lpCaption,MB_OK); // return 0; } А вот что выдала ИДА Код (Text): 00401020 ; Attributes: bp-based frame 00401020 00401020 public start 00401020 start proc near 00401020 00401020 var_30 = dword ptr -30h 00401020 var_20 = dword ptr -20h 00401020 var_1C = dword ptr -1Ch 00401020 var_18 = word ptr -18h 00401020 var_16 = byte ptr -16h 00401020 var_14 = dword ptr -14h 00401020 var_10 = dword ptr -10h 00401020 var_C = word ptr -0Ch 00401020 var_8 = dword ptr -8 00401020 var_4 = dword ptr -4 00401020 00401020 push ebp 00401021 mov ebp, esp 00401023 sub esp, 20h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 mov [ebp+var_4], 6688h 00401030 lea eax, [ebp+var_4] 00401033 mov [ebp+var_8], eax 00401036 call $+5 0040103B mov eax, [esp+30h+var_30] 0040103E sub eax, 40103Bh 00401043 mov ecx, ds:dword_401008 00401049 mov [ebp+var_14], ecx 0040104C mov edx, ds:dword_40100C 00401052 mov [ebp+var_10], edx 00401055 mov ax, ds:word_401010 0040105B mov [ebp+var_C], ax 0040105F mov ecx, ds:dword_401014 00401065 mov [ebp+var_20], ecx 00401068 mov edx, ds:dword_401018 0040106E mov [ebp+var_1C], edx 00401071 mov ax, ds:word_40101C 00401077 mov [ebp+var_18], ax 0040107B mov cl, ds:byte_40101E 00401081 mov [ebp+var_16], cl 00401084 push 0 00401086 lea edx, [ebp+var_20] 00401089 push edx 0040108A lea eax, [ebp+var_14] 0040108D push eax 0040108E push 0 00401090 call ds:MessageBoxA 00401096 pop edi 00401097 pop esi 00401098 pop ebx 00401099 mov esp, ebp 0040109B pop ebp 0040109C retn 0040109C start endp 0040109C 0040109C ; ────────────────────────────────────────────────────────────────────── ───── 0040109D align 4 004010A0 dd 10C8h, 2 dup(0), 10DEh, 1000h, 5 dup(0), 10D0h, 0, 654D01BEh 004010A0 dd 67617373h, 786F4265h, 53550041h, 32335245h, 6C6C642Eh 004010A0 dd 46h dup(0) 004010A0 _text ends 004010A0 004010A0 004010A0 end start Прагмы поставлены для уменьшения размера и совмещения секций. Но данных нет вообще в листинге. Вопрос! Начиная с адреса 00401043 что это и откуда взялось?
Это: char lpMessage[]="HELLO!\0x0"; char lpCaption[]="CAPTION\0x0"; суть - переменные объявлены в стеке, и туда копируются строчки. Решение: static char lpMessage[]="HELLO!\0x0"; static char lpCaption[]="CAPTION\0x0";
в общем читать про автоматические перменные и их размещение в стеке а также еслли тебе интересны подробности компиляции сделай pdb или map файл , импортируй в IDA и наслаждайся области памяти( переменные ) будут поименованы там где вот такая конструкция ecx, ds:dword_401008 встань на dword_401008 и нажми "o" тогда операнд сконвертируется в offset и станет понятно что и куда ссылается будет потом сходи по этим ссылкам и если ида не обнаружила что это строки - сделай их строками вручную, текст приобретёт читаемый вид