eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Adler (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Основной форум —› Как обойти large fs:0 ???
Посл.ответ Сообщение

Ранг: 11.4 (новичок)
Статус: Участник

Создано: 7 декабря 2007 19:43 · Поправил: shob_vas New!
Цитата · Личное сообщение · #1

Я пытаюсь инверсить прогу. Пусть прога называется Program.exe. Она использует библиотеку Library.dll. С помощью LordPe создал свою библиотеку ImportDll.dll и приатачил ее к екзешнику. В функции DllMain моей библиотеки создается новый поток. Этот поток через какое то время вызывает процедуру Procedure из Library.dll. Но процедура Procedure в самом начале содержит следующий код:

.text:008DB720 push 4294967295
.text:008DB722 push offset ?GetInitializeData@CSocketCommImp@@U...
.text:008DB727 mov eax, large fs:0
.text:008DB72D push eax
.text:008DB72E mov large fs:0, esp
.text:008DB735 sub esp, 34h
.text:008DB738 mov al, byte ptr [esp+40h+arg_0]


Я прочитал статью http://www.wasm.ru/article.php?article=packers2 http://www.wasm.ru/article.php?article=packers2 (Об упаковщиках в последний раз. Часть вторая /06.11.03/) и понял что видимо мой поток находится в кольце 3, а должен находиться в кольце 1. По крайне мере вызов процедуры из моего потока приводит к ошибке. В строке 008DB727 при штатной работе проги в eax помещается всегда одно и тоже число (04DEFF30). Можно ли тупо замазать этот кусок на mov eax,04DEFF30h ?

Какие другие решения есть? Как назначить своему потоку приоритет кольца 0?

Ранг: 11.4 (новичок)
Статус: Участник

Создано: 7 декабря 2007 19:46 New!
Цитата · Личное сообщение · #2

P.S. PEiD кстати пишет что прога не запакована

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

Создано: 7 декабря 2007 21:03 · Поправил: x-code New!
Цитата · Личное сообщение · #3

Я так понял, что ты дальше 008DB727 не можешь пройти.

Пробовал бряк поставить на 008DB738 и запустить прогу, срабатывает.

Ранг: 11.4 (новичок)
Статус: Участник

Создано: 7 декабря 2007 21:23 New!
Цитата · Личное сообщение · #4

все бряки запускаются без проблем. Пробовал менять значение регистра eax в строке 008DB727 на 04DEFF30. Вроде поначалу процедура работает нормально. Но потом идет большое количество вызовов других процедур с такими же обращениями к fs:0. Причем все они написаны по одной схеме:


;начало процедуры
.text:008DB727 mov eax, large fs:0
.text:008DB72D push eax
.text:008DB72E mov large fs:0, esp
...
.text:008DB998 mov ecx, [esp+50h+var_C]
.text:008DB9A0 mov large fs:0, ecx
.text:008DB9A7 add esp, 40h
.text:008DB9AA retn 8
;конец


В строке 008DB72D идет отправление large fs:0 в стек, а в 008DB9A0 восстановление предыдущего значения. На самом деле я не уверен что это сделано для защиты (слишком уж криво написана вся другая часть программы). Может ли быть что это производится предохранения от ошибок мультипотоковости?

Причем у меня еще такая проблема есть с вызовом этой функции. Вот как выглядит анализ переменных в IDA:
.text:008DB720 var_40 = dword ptr -40h
.text:008DB720 var_3C = dword ptr -3Ch
.text:008DB720 var_38 = dword ptr -38h
.text:008DB720 var_34 = dword ptr -34h
.text:008DB720 var_30 = dword ptr -30h
.text:008DB720 var_2C = byte ptr -2Ch
.text:008DB720 var_28 = dword ptr -28h
.text:008DB720 var_24 = dword ptr -24h
.text:008DB720 var_1C = byte ptr -1Ch
.text:008DB720 var_18 = dword ptr -18h
.text:008DB720 var_C = dword ptr -0Ch
.text:008DB720 var_4 = dword ptr -4
.text:008DB720 arg_0 = dword ptr 4
.text:008DB720 arg_4 = dword ptr 8


В процедуре используется стек выше esp (переменные var_*) (сдвиг стека происходит, например, по адресу 008DB735, см пост #1), но никакой явной инициализации этих переменных (обнуление или задание начальных параметров) нет. А между тем почему то в процедуре происходят над этими переменными какие то арифметические операции. Штатно вызов этой процедуры (она находится в библиотеке Library.dll) происходит из екзешника (Program.exe) поэтому абсолютно непонятно почему происходит использование стека выше esp...

Ранг: 11.4 (новичок)
Статус: Участник

Создано: 7 декабря 2007 22:19 New!
Цитата · Личное сообщение · #5

Нарыл ток что статью www.wasm.ru/article.php?article=Win32SEHPietrek1 про SEH почитал ее и понял, что видимо fs:[0] помещен лдя обработки исключений. но почему то я всеравно не могу запустить прогу. Может ли обработка исключений использоваться какнибудь для защиты программы от взлома? Вопрос про переменные var_* остается открытым...

Ранг: 11.4 (новичок)
Статус: Участник

Создано: 7 декабря 2007 23:06 New!
Цитата · Личное сообщение · #6

Вообщем я понял почему у меня были проблемы с запуском функции Procedure. Видимо в исходнике стоит что-то типа (извените никогда есепшинами не пользовался, поэтому точно не помню синтаксис)

__try
{
Procedure()
}

__catch
{
Procedure2();
}


Это также подтверждается тем что если поставить bp на вызов процедуры Procedure в Program.exe, то вызов выполняется один раз. А если поставить bp на начло процедуры Procedure (на первую инструкцию), то вызов происходит два или три раза.
По идее адрес процедуры ексепшина должен находиться в fs:0, но почему то когда я ставил bp на этот адрес (fs:0), то ничего не происходило. Как отлавливать такие ексепшены в IDA?

Ранг: 1.0 (гость)
Статус: Участник

Создано: 21 мая 2019 04:01 New!
Цитата · Личное сообщение · #7


не пойму, какого хера!!!!!
заведомо шлет shob_vas этот пользователь в тупик яное дело что .text:008DB9A7 add esp, 40h после этого убдет конец, т.к. дальше идти не куда
он тупо пропушил .text:008DB72D push eax вы понимаете тчо он написал? после этого дальше можно ыбло бы не продолжать, ну ладно он заведомо
прости от чего ты пытаешься отнять? .text:008DB720 var_40 = dword ptr -40h
на том месте ты пишешь 0
.text:008DB720 var_3C = dword ptr -3Ch здесь ты тоже пишешь 0
это нехера не код программы, это просто стерание старого куска программы, это уже делается когда программа напишется и там надо чисто стереть, можно этого в принципи и не делать, ну допустим идиальный прогер. это не рабочий код, первое сообщение респект далее просто сбивает с пути, кто не понимает чтов первом написано и как работает и что нужно написать, недойдет. Последнее сообщение меня просто напрочь добила у него была проблема с запуском процедуры. Я хренею где он код взял... ну то что дальше напсиано то просто не хочу коментить, за код спасибо! некаких запомните стороних библиотек удачи! прости 2007 год я вывиду в топ тебя пипец мое детство((

| Сообщение посчитали полезным: plutos



Ранг: 508.5 (!)
Статус: Участник
_Вечный_Студент_

Создано: 21 мая 2019 04:28 · Поправил: plutos New!
Цитата · Личное сообщение · #8

pOcketNpiAoSCuhs пишет:
не пойму, какого хера!!!!!


чел терпел 12 (двенадцать!) лет, наконец прорвало!
Без сомнения, post эпохи, шедевр!
 eXeL@B —› Основной форум —› Как обойти large fs:0 ???
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS