Привет всем, походу Томаш Криштак (кажется так его правильно величать) придумал новую технологию анти отладки, я в принципе люблю программировать на фасме, но последние две програмки не создают контролы пока их чем нить не запакуешь и следовательно бесполезны в простом виде. У меня Windows XP SP 3, прошу проверить на ваших машинах работа способность последней...
XPSP3. Пустое окно появляется, ничего больше нет. Запокавал upx-м тоже самое. Если не секрет, то что за технология ???
В общем суть, я компилирую и у меня белый экран, хотя из исходника можете видеть, что там создано несколько контролов, сжимаю UPX'om версии 2.92b и все ок... Это я вообще то не совсем серьезно имел ввиду, насчет пропажи контролов, если добавлю ShareWare в прогу, пакую, то при распаковке, она будет бесполезна для отладки...
Перекуём баги на фичи! Если что-то не работает, как надо, теперь это зовётся гордым именем "технология анти отладки". «Я это… Ик… Код сломал, во!» ©анекдот
Работает если указать запускать программу в режиме совместимости с 2000. В этом режиме грузится шим, его движок парсит таблицу импорта и перехватывает некоторые функции там. Вот выглядит код с хуками шима: Код (Text): 00403A31 push autorune.0040240D 00403A36 push 0F003F 00403A3B push 0 00403A3D push autorune.00402085 ; ASCII "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" 00403A42 push 80000001 00403A47 call dword ptr ds:[<&ADVAPI32.RegOpenKeyExA>] ; AcLayers.7168F22E 00403A4D cmp eax,-1 00403A50 jnz short autorune.00403A7B 00403A52 push 0 00403A54 push dword ptr ss:[ebp-4] 00403A57 push 1 00403A59 push 0 00403A5B push autorune.004020CB ; ASCII "startup" 00403A60 push dword ptr ds:[40240D] 00403A66 call dword ptr ds:[<&ADVAPI32.RegQueryValueExA>] ; AcLayers.7168D45D Эти две функции обрабатывает вначале враппер - AcLayers.dll. Ты пытаешся считать параметр "Startup", там его нет, но там есть "Common Startup", собственно и остальные параметры имеют префикс "Common". Шим эмулирует его, поэтому и работает. Насчёт "антиотладки" - это никакая не антиотладка, останов на диспетчере исключений, либо сразу на ntdll.ExecuteHandler() и мы попадаем прямо в твой сех. В принципе подход хороший, но реализация некуда не годится. Еспользовать GUI-калбаки для вызова своего кода весьма хороший способ, но нельзя из них генерировать исключения, ибо этим словят. Хороший вариант перехват KernelCallbackTable и вызов своего кода в каждом из её хэндлеров.
Не работает. Эмулятор возвращает строку "D:\Documents and Settings\...", ты в конец её добавляешь "*.*" и тогда работает. Реально значение параметра "%ALLUSERSPROFILE%\Главное меню\Программы\Автозагрузка", переменная %ALLUSERSPROFILE% не определена в виде символической ссылки, далее само собой FindFirstFile() возвращает ERROR_INVALID_NAME. Тут почитай http://www.virustech.org/f/viewtopic.php?id=35
Это не антиотладка, это невнимательность при копипи… копипастинге кода. >.<'' Пакеры (между прочим, далеко не все) просто затаптывают манифест. Вместо того, чтобы запаковывать программу, берём ресурсный редактор и прибиваем манифест из екзешника. Работает. И в режиме совместимости работает. Вопрос: топикстартер вообще понимает, что при этом происходит?
Имхо пакеры используют только нубы, либо те, кто пишет говнокод. Дрочево с манифестами и пр., зачем.. Примитивная проверка типа этой: Код (Text): IsUpx proc UpxPresent:PBOOLEAN Local ThreadWin32StartAddress:PVOID invoke ZwQueryInformationThread, NtCurrentThread, ThreadQuerySetWin32StartAddress, addr ThreadWin32StartAddress, sizeof PVOID, NULL test eax,eax mov edx,UpxPresent jnz exit_ mov eax,ThreadWin32StartAddress xor ecx,ecx cmp word ptr [eax],0BE60h jne not_upx_ cmp word ptr [eax + 6],0BE8Dh jne not_upx_ cmp dword ptr [eax + 0Ch],0FFCD8357h jne not_upx_ cmp word ptr [eax + 10h],10EBh jne not_upx_ inc ecx not_upx_: mov dword ptr [edx],ecx xor eax,eax exit_: ret IsUpx endp
Clerk, при всём уважении, имхо сейчас вы всё усложняете. =) Что-то мне подсказывает, что ситуация развивалась по такому сценарию: …Пишет dgs код. Пишет-пишет-пишет, вдруг бац! - натыкается где-то на пример использования seh-обработчика фасмовского. Вау, думает, надо это тоже вставить в свой проект. Вставляет. Потом ещё пишет-пишет-пишет. Компилит. Не работает. Окошко создаётся, а контролы - нет. Потом запаковывает проект UPX-ом. Вау, контролы появились. Круто! Да Это Же, никак, "антиотладочная технология" (или другое умное слово). Открыл! Сам! Так, ещё раз. Компилим - не видно. Пакуем - видно. Всё, можно постить на васм… Антон, признавайтесь, так всё было?
Примерно так, только еще раз смотрим 3 и 6 пост и убеждаемся, что главной проблемой было бороться с этим явлением, а не: Я не называю себе гениальным программистом, я ламер, бывает впихививаю чужой код, но хочу стать настоящим ассемблерщиком. Сам термин "антиотладочная технология" я применял слегка в насмешку, не думая, что вы воспримите так все всерьез, ну простите, буду теперь осторожней с выражениями...
G13 Я только подумал про упаковку прочитав твой 10-й пост. Почемуто я думал что целью топика является текст на работу во всех версиях ос, а антиотладка - какойто из скрытых калбэков, впрочем как оно и есть. Но я и подумать не мог, что это тест на работу запакованного модуля. Нужно было нормально описать задачу.. Насчёт антиотладки посредством исключений, какиебы не использовались ухищрения, а их описано множество, все они основаны на нескольких особенностях: 1. Вход в диспетчер исключений выполняется с взведённым RF(Resume Flag), изза чего пошаговый останов может быть выполнен только после исполнения первой его инструкции(но не при входе в него). 2. Вход в диспетчер исключений исполняется с взведённым IF(Interrupt Flag) и 1-м битом регистра флагов. 3. При входе в диспетчер исключений не изменяются регистры общего назначения, кроме Esp и Eip. 4. При входе в диспетчер исключений не изменяются флажки CPAZSDOF. 5. При входе в диспетчер исключений сбрасывается регистр Dr7. 6. Если исключение трассировочное(#DB, STATUS_SINGLE_STEP), то при входе в диспетчер исключений сбрасывается TF(Trap Flag) в флажках. Другое исключение не приводит к сбросу TF. 7. Контекст в стековом фрейме содержит регистр EFlags и Dr6 на момент возникновения исключения. 8. Возврат после обработки исключения выполняется посредством сервиса NtContinue, который перезагружает весь контекст потока полностью(не исключая TF). 9. Если у процесса установлен отладочный порт, то до вызова диспетчера исключений на порт посылается сообщение. 10. Если запрещена нотификация дебуггера(ThreadHideFromDebugger), при исключении на порт отладчика сообщение не поступает. 11. Обработка исключения требует некоторое время. Вроде всё учёл.. Если какойлибо антиотладочный трюк связанный с механизмом исключений не подходит ни под один из эхтих пунктов, то это будет новая техника.
Спасибо всем за информацию, [add] казалось бы все, но на по следок встал вопрос с win.ini, вот разбираюсь, почему не читает раздел? Хотя он у меня есть точно... Код (Text): key.windows db 'windows',0 sub.run db 'run',0 ... invoke GetProfileString, key.windows, sub.run, [text_buffer], [text_buffer], 1000h
dgs, прошу прощения, если мой пост показался вам слишком резким. Просто раз уж в программе есть манифест, а в манифесте прописана зависимость: …то это самое Microsoft.Windows.Common-Controls, (то бишь библиотечка comctl32.dll) должно наличествовать в адресном пространстве процесса. Обычно для этого используется функция InitCommonControls (хотя можно с тем же успехом сделать LoadLibrary,"comctl32.dll" до создания первого окна). В противном случае из CreateWindow прилетит эксепшен (который у вас игнорится SEH-обработчиком).