Сейчас на форуме: -Sanchez- (+9 невидимых)

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

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

Создано: 07 декабря 2007 19:43 · Поправил: shob_vas
· Личное сообщение · #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 (новичок)
Активность: 0.010
Статус: Участник

Создано: 07 декабря 2007 19:46
· Личное сообщение · #2

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



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

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

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

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



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

Создано: 07 декабря 2007 21:23
· Личное сообщение · #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 (новичок)
Активность: 0.010
Статус: Участник

Создано: 07 декабря 2007 22:19
· Личное сообщение · #5

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



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

Создано: 07 декабря 2007 23:06
· Личное сообщение · #6

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

__try
{
Procedure()
}

__catch
{
Procedure2();
}


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



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

Создано: 21 мая 2019 04:01
· Личное сообщение · #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


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

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

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


чел терпел 12 (двенадцать!) лет, наконец прорвало!
Без сомнения, post эпохи, шедевр!

-----
Give me a HANDLE and I will move the Earth.



 eXeL@B —› Основной форум —› Как обойти large fs:0 ???
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати