Сейчас на форуме: subword, rtsgreg1989, zds, _MBK_ (+5 невидимых)

 eXeL@B —› Основной форум —› Разные адреса загрузки dll
Посл.ответ Сообщение

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

Создано: 31 января 2006 16:53
· Личное сообщение · #1

Чо то не везёт мне. Проги всё попадаются ... какая то.
Столкнулся с проблемой такого характера. Делаю лоадер для одной проги. Защита находится в длл. Так вот эта длл загружается в разное адресное пространство. И это видно в SI. Поэтому патч памяти не всегда срабатывает даже на моём компе. Можно ли узнать каким либо способом куда загрузилась длл, что бы подкорректировать адреса для WriteProcessMemory.



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

Создано: 31 января 2006 21:20
· Личное сообщение · #2

Bad_guy писАл в "Крутая защита или CRACKL@B CrackMe #1"

Помнится, что пару лет назад все в своих статья писали, что "на вашем компьютере адрес может быть и другой", но мой опыт в крэкерстве и знания формата PE позволяют мне сделать вывод, что адрес этот на всех компьютерах будет абсолютно одинаков, а даже если это и не так, то есть хитрые функции, которые позволяют узнать содержимое EIP (текущий логический адрес в исполняющемся коде), и тем самым подкорректировать значение RegAddr.




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

Создано: 31 января 2006 22:48
· Личное сообщение · #3

PalR
К чему ты это всё написал, это совсем с другой оперы.
Тут реч о динамической загрузке библиотек виндовс.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 31 января 2006 23:03
· Личное сообщение · #4

делай лоадер с DebugAPI, при загрузке DLL получишь оповещение, сверяй её имя и получай адрес

-----
EnJoy!





Ранг: 536.4 (!), 171thx
Активность: 0.660.13
Статус: Администратор
Создатель CRACKL@B

Создано: 31 января 2006 23:32
· Личное сообщение · #5

PalR пишет:
Bad_guy писАл
но не про DLL, а про EXE !

-----
Всем не угодишь




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

Создано: 31 января 2006 23:38
· Личное сообщение · #6

Jupiter
Если не сложно, может где знаешь почитать или примерчик.
Где про дебуг"апи прочитать.

Bad_guy
Просто это всё что попалось со схожей бедой.

Пасиб что помогаете. Ой чую тут 5 строчками кода не отделаться.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 01 февраля 2006 00:30 · Поправил: ToBad
· Личное сообщение · #7

Я в своём лоадере всё это сделал. Причём на VB. Но принцип один.
В лоадере храни только смещение относительно базового адреса.
Базовый адрес определяй по PID-у так:


Function GetDLLBase(pID As Long, DllName) As Long
Dim h As Long
Dim Ent As MODULEENTRY32
h = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID)
Ent.dwSize = 548
If Module32First(h, Ent) Then
rt: If InStr(LCase(Ent.szExePath), LCase(DllName)) > 0 Then GetDLLBase = Ent.modBaseAddr: CloseHandle h: Exit Function
Ent.dwSize = 548
If Module32Next(h, Ent) Then GoTo rt
End If
GetDLLBase = 0
CloseHandle h
End Function

baseaddr = GetDLLBase(main_pID, DllName)


Потом добавляй к смещению. В общем работает. Если есть вопросы - стучи на tobadko@mail.ru



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

Создано: 01 февраля 2006 08:25
· Личное сообщение · #8

ToBad
Заодно бы приаттачил бы исходник. Я правда только в паскаль-дельфи шарю.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 01 февраля 2006 16:47 · Поправил: DillerInc
· Личное сообщение · #9

PalR
Если на Delphi,то вот что-то наподобие:

const
WantedLibName = 'название.dll';
var
pInfo : TProcessInformation;
nMods : DWORD;
mods : array [0..1023] of Cardinal;
modName : array [0..MAX_PATH - 1] of Char;
cbNeeded : Cardinal;
i : Integer;
begin
if EnumProcessModules(pInfo.hProcess, @mods, SizeOf(mods), cbNeeded) then
begin
nMods := cbNeeded div SizeOf(DWORD); // Получаем кол-во модулей в актуальном процессе
for i := 0 to nMods do
if GetModuleBaseName(pInfo.hProcess, mods[i],
@modName, SizeOf(modName)) <> 0 then
begin
if lstrcmpi(modName, WantedLibName) = 0 then
begin
Base := Mods[i]; // Base = дескриптор модуля = базовый адрес его загрузки
end;
end else MessageBox(Handle, 'GetModuleBaseName failed', NIL, MB_OK);
end else MessageBox(Handle, 'EnumProcessModules failed', NIL, MB_OK);
end;


Только учти,что данный код будет работать только в том случае,если код жертвы,так сказать,уже готов к выполнению.
Проще всего тут поймать жертву на точке входа,поставив туда какой-нибудь интересный опкод.

-----
the Power of Reversing team





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 01 февраля 2006 18:55
· Личное сообщение · #10

Просто создавай спящий процесс, далее проверяй подгрузилась длл или нет. Если нет то resumethread на небольшой промежуток времени, далее опять suspendthread и проверка. И так пару секунд. Если не найдёт, то выход по таймауту.



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

Создано: 01 февраля 2006 21:07
· Личное сообщение · #11

DillerInc
Блин. Не катит в моём случае. Твой код ищет dll в процессе который создает лодер. А у меня схема такая:
1. Запускается MyLoder.exe и запускает Zagruzchik.exe
2.Zagruzchik.exe запускает Program.exe
3.Program.exe загружает кучу dll и среди них crack.dll
Т.е. нужен доступ к процессу, который порожден процессом, который порожден лоадером. Я ж говорю что какая то.
Не уж ни у кого нет исходничка на такой случай.
ToBad
А твоя функция может эту dll с адресом выцепить. Не могу перевести в паскаль-дельфи.

Прога сломана, а лоадер написать не могу ............. .




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 01 февраля 2006 22:08
· Личное сообщение · #12

прогу в студию

про DebugAPI читай в MSDN, если у тя установлена локально - там есть примерчики на Сях

-----
EnJoy!





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 02 февраля 2006 01:43
· Личное сообщение · #13

PalR пишет:
А твоя функция может эту dll с адресом выцепить. Не могу перевести в паскаль-дельфи.


Эта функция типа того, что тебе дали на дельфях. Она возвращает адрес куда загружена длл. В твоём случае можно сделать двумя путями:
1) Если это реализовать в Zagruzchik.exe, то ищешь у Program.exe адрес куда загружена crack.dll, получаешь базовый адрес, добавляешь смещение и патчишь crack.dll. (я так понял её патчить нужно)
2) Если нужно патчить из MyLoder.exe, то пишешь так: baseaddr = GetDLLBase(GetPIDByExeName("Program.exe"), "crack.dll") и как только это не 0 - патчишь. То есть ждёшь появления запущенного Program.exe, и узнаёшь куда подгружена длл.

... и то, что наверняка сейчас скажут, что это криво, медленно, и не гарантированно - не слушай. На VB работает, а это говорит о многом. Все знают какой VB медленный. В общем если нужно выложу реализацию GetPIDByExeName.



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

Создано: 02 февраля 2006 11:27
· Личное сообщение · #14

ToBad
Выложи если не трудно. Хорошо б на паскале-дельфи.
Я правда сам кое чего пытаюсь наваять через tlhelp32, но пока КРИВО.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 02 февраля 2006 14:57
· Личное сообщение · #15

PalR
Вообще интересная какая-то система у тебя получается...почему не ограничиться чем-то одним - либо MyLoader.exe, либо Zagruzchik.exe ??
Но раз так,то я думаю,что хорошим вариантом было бы то,что предложил Jupiter - использование DebugAPI,а точнее отладочного цикла http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/waitfordebugevent.asp ,который бы контролировал создание процессов,загрузку библиотек и т.п.

-----
the Power of Reversing team




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

Создано: 02 февраля 2006 15:38
· Личное сообщение · #16

Zagruzchik.exe - это не моё изобретение, а разработчиков. Входит в состав пакета программы (Program.exe). Я назвал так условно.



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

Создано: 03 февраля 2006 09:55
· Личное сообщение · #17

Попробуй поправить Zagruzchik.exe так чтобы он запускал какой нибудь loader2.exe, а loader2.exe должен запускать Program.exe и патчить её.



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

Создано: 03 февраля 2006 13:34
· Личное сообщение · #18

Всем спасибо. Разобрался и сделал. Можно патчить любую длл в любом прцессе, кроме системных конечно.



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

Создано: 03 февраля 2006 13:36
· Личное сообщение · #19

PalR
системные тоже можно




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 03 февраля 2006 18:35
· Личное сообщение · #20

PalR
Ну,примерно опиши хоть,как реализовал?Какие функции использовал?
Интересно всё же... .

-----
the Power of Reversing team




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

Создано: 05 февраля 2006 20:50
· Личное сообщение · #21

Да всё просто.
Лодер делает CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Получаете список всех процессов.
Потом среди процессов ищет нужный.
Затем CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,нужного процесса);
Получаете список длл этого процесса. Ищете нужную и вытаскиваете данные. Всё.



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 12 декабря 2007 23:03
· Личное сообщение · #22

Может я не понял задачу, но:
Все еще проще - адрес загрузки dll всегда = GetModuleHandle("...dll");

-----
продавец резиновых утёнков





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 13 декабря 2007 12:20
· Личное сообщение · #23

HiEndsoft это если в своем процессе..

извращенный метод: ждем полного запуска, суспенд, инжект в процесс-жертву кодеса, который уже делоет GetModuleHandle, и патчит длл.. есле патч не большой, то и базонезависимого кода не много

-----
invoke OpenFire



 eXeL@B —› Основной форум —› Разные адреса загрузки dll
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати