Сейчас на форуме: Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Непонятный код
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 июня 2008 14:29
· Личное сообщение · #1

#include <windows.h>
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")
#pragma comment(linker, "/ENTRY:main")
void main()
{
char Text[] = "Text";
char Capt[] = "Caption";
MessageBoxA(NULL, Text, Capt, MB_OK);
ExitProcess(0);
}

Компилирую эту прграммку в VS2005, смотрю получившееся в Olly и вижу то, что написал. Теперь если закомментировать вызов ExitProcess и снова посмотреть в Olly, то там появится какой-то непонятный код. Соответсвенно вопросы: что это за код, для чего он нужен и как от него избавится.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 15 июня 2008 14:35 · Поправил: Ara
· Личное сообщение · #2

наверно Olly ждала что-то типа ret в конце процедуры, а его нету...Отсюда неправильный дизасм кода..



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 15 июня 2008 14:41
· Личное сообщение · #3

n01z
Это студия вставила свои ф-ии зачем-то.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 июня 2008 14:59
· Личное сообщение · #4

Нет, нет, нет, дело не в Olly и не в ExitProcess, просто я самый короткий пример привел. Этот код и в других случая появляется. Именно что его студия зачем-то вставляет. Хотелось бы узнать зачем. Вот:

/*4015ED*/ PUSH EBP
/*4015EE*/ MOV EBP,ESP
/*4015F0*/ SUB ESP,328
/*4015F6*/ MOV DWORD PTR DS:[403120],EAX
/*4015FB*/ MOV DWORD PTR DS:[40311C],ECX
/*401601*/ MOV DWORD PTR DS:[403118],EDX
/*401607*/ MOV DWORD PTR DS:[403114],EBX
/*40160D*/ MOV DWORD PTR DS:[403110],ESI
/*401613*/ MOV DWORD PTR DS:[40310C],EDI
/*401619*/ MOV WORD PTR DS:[403138],SS
/*401620*/ MOV WORD PTR DS:[40312C],CS
/*401627*/ MOV WORD PTR DS:[403108],DS
/*40162E*/ MOV WORD PTR DS:[403104],ES
/*401635*/ MOV WORD PTR DS:[403100],FS
/*40163C*/ MOV WORD PTR DS:[4030FC],GS
/*401643*/ PUSHFD
/*401644*/ POP DWORD PTR DS:[403130]
/*40164A*/ MOV EAX,DWORD PTR SS:[EBP]
/*40164D*/ MOV DWORD PTR DS:[403124],EAX
/*401652*/ MOV EAX,DWORD PTR SS:[EBP+4]
/*401655*/ MOV DWORD PTR DS:[403128],EAX
/*40165A*/ LEA EAX,DWORD PTR SS:[EBP+8]
/*40165D*/ MOV DWORD PTR DS:[403134],EAX
/*401662*/ MOV EAX,DWORD PTR SS:[EBP-320]
/*401668*/ MOV DWORD PTR DS:[403070],10001
/*401672*/ MOV EAX,DWORD PTR DS:[403128]
/*401677*/ MOV DWORD PTR DS:[403024],EAX
/*40167C*/ MOV DWORD PTR DS:[403018],C0000409
/*401686*/ MOV DWORD PTR DS:[40301C],1
/*401690*/ MOV EAX,DWORD PTR DS:[403000]
/*401695*/ MOV DWORD PTR SS:[EBP-328],EAX
/*40169B*/ MOV EAX,DWORD PTR DS:[403004]
/*4016A0*/ MOV DWORD PTR SS:[EBP-324],EAX
/*4016A6*/ CALL DWORD PTR DS:[<&KERNEL32.IsDebuggerPresent>]
/*4016AC*/ MOV DWORD PTR DS:[403068],EAX
/*4016B1*/ PUSH 1
/*4016B3*/ CALL ProcessL.004016F1
/*4016B8*/ POP ECX
/*4016B9*/ PUSH 0
/*4016BB*/ CALL DWORD PTR DS:[<&KERNEL32.SetUnhandledExceptionFilter>]
/*4016C1*/ PUSH ProcessL.00402090
/*4016C6*/ CALL DWORD PTR DS:[<&KERNEL32.UnhandledExceptionFilter>]
/*4016CC*/ CMP DWORD PTR DS:[403068],0
/*4016D3*/ JNZ SHORT ProcessL.004016DD
/*4016D5*/ PUSH 1
/*4016D7*/ CALL ProcessL.004016F1
/*4016DC*/ POP ECX
/*4016DD*/ PUSH C0000409
/*4016E2*/ CALL DWORD PTR DS:[<&KERNEL32.GetCurrentProcess>]
/*4016E8*/ PUSH EAX
/*4016E9*/ CALL DWORD PTR DS:[<&KERNEL32.TerminateProcess>]
/*4016EF*/ LEAVE
/*4016F0*/ RETN



Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 15 июня 2008 15:10
· Личное сообщение · #5

Именно что его студия зачем-то вставляет.
А с каким флагами собирается программа?
От них уже и танцуй =)



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 июня 2008 16:40
· Личное сообщение · #6

Такое чувство что это просто дебаг сборка...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 15 июня 2008 17:06
· Личное сообщение · #7

n01z
если хочешь видеть только свой код - компилируй без дефолт либ. в остальных случаях студия вставляет код, который нужен для нужд crt, stl, итп.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 июня 2008 17:42
· Личное сообщение · #8

Лень создавать тему - плагины на VS существуют? Хотелось бы сворачивать блоки типа if for итп. как в Notepad++



Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 15 июня 2008 18:02
· Личное сообщение · #9

плагины на VS существуют?
Насмчет сворачивания не знаю, но в Visual Assist X, есть опция Hide Selection



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 июня 2008 18:39
· Личное сообщение · #10

n01z
Project->Properties->C++->Code Generation:
Buffer Security Check поставь в No

Если компелируешь с ExitProcess то всё-равно этот код есть и вызывается он call'ом



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 июня 2008 19:09
· Личное сообщение · #11

bad_boy, самое оно. Я думал что указав #pragma comment(linker, "/ENTRY:main")
больше ничего лишнего не появится, оказывается что нет. Но с ExitProcess у меня этот код почему-то не появляется.



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 июня 2008 21:18
· Личное сообщение · #12

n01z пишет:
Но с ExitProcess у меня этот код почему-то не появляется.


Вообще, скорее всего, когда ты ставить ExitProcess, то точка входа в программу считается не стандартной, а если не ставишь то компилятор считает её стандартной и думает что ему самому предлогается корректно завершить программу. Но в последнем случае вызов той процедуры должен идти где-то до твоего кода. Посмотри в таблицу экспорта и если там есть IsDebuggerPresent то пляши от неё и найдёшь этот кусок кода снова.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 16 июня 2008 03:20
· Личное сообщение · #13

Помню, кто-то выкладывал прогу накрытую криптором и предлагал ее заломать, бгг..
Так вот эта прога была набита под завязку ффсякой там дебаг инфой и прочим хуиз-знает чем
Меня она заинтересовала, помню применением в ней битмапов с альфа-каналом, так вот в ней и было много вот такого кода почти один в один, мне тогда помню, стало интересно, а нах он там нужен..
Короче погуглил чуток и оказалось, что этот кодес (если мне память не изменяет), сделан специально от переполнения буфера(даже есть гуаностатейка у КК на эту тему), чтобы вот такие вот супер-прожки из сабжа, куллхакеры не похекали %)))
А это из первоисточника
/GS[-]
Detects some buffer overruns that overwrite the return address, a common technique for exploiting code that does not enforce buffer size restrictions. This is achieved by injecting security checks into the compiled code.
Помню специально запостил этот код с уклоном на антиотладку, чтобы чел который писал эту программу вышел из себя(психически) и отписался грамотно, но его хватило только на выпить яду! %)(как оказалось вся его сила была нажать кнопку protect в говнопроте)

n01z пишет:
Я думал что указав #pragma comment(linker, "/ENTRY:main") больше ничего лишнего не появится

Ну, так там есть в студии Project->Properties->C++->Command Line и в окне All options: будут все ключи, используемые при компиляции, полное(!) описание с примерами итд. которых есть в первоисточнике(MSDN)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com



 eXeL@B —› Программирование —› Непонятный код
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати