Сейчас на форуме: Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Непонятный код |
Посл.ответ | Сообщение |
|
Создано: 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, то там появится какой-то непонятный код. Соответсвенно вопросы: что это за код, для чего он нужен и как от него избавится. ![]() |
|
Создано: 15 июня 2008 14:35 · Поправил: Ara · Личное сообщение · #2 |
|
Создано: 15 июня 2008 14:41 · Личное сообщение · #3 |
|
Создано: 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 ![]() |
|
Создано: 15 июня 2008 15:10 · Личное сообщение · #5 |
|
Создано: 15 июня 2008 16:40 · Личное сообщение · #6 |
|
Создано: 15 июня 2008 17:06 · Личное сообщение · #7 |
|
Создано: 15 июня 2008 17:42 · Личное сообщение · #8 |
|
Создано: 15 июня 2008 18:02 · Личное сообщение · #9 |
|
Создано: 15 июня 2008 18:39 · Личное сообщение · #10 |
|
Создано: 15 июня 2008 19:09 · Личное сообщение · #11 |
|
Создано: 15 июня 2008 21:18 · Личное сообщение · #12 n01z пишет: Но с ExitProcess у меня этот код почему-то не появляется. Вообще, скорее всего, когда ты ставить ExitProcess, то точка входа в программу считается не стандартной, а если не ставишь то компилятор считает её стандартной и думает что ему самому предлогается корректно завершить программу. Но в последнем случае вызов той процедуры должен идти где-то до твоего кода. Посмотри в таблицу экспорта и если там есть IsDebuggerPresent то пляши от неё и найдёшь этот кусок кода снова. ![]() |
|
Создано: 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 —› Программирование —› Непонятный код |