Посл.ответ |
Сообщение |
Ранг: 30.4 (посетитель) Активность: 0.02↘0.01 Статус: Участник
|
Создано: 31 января 2006 16:53 · Личное сообщение · #1
Чо то не везёт мне. Проги всё попадаются ... какая то.
Столкнулся с проблемой такого характера. Делаю лоадер для одной проги. Защита находится в длл. Так вот эта длл загружается в разное адресное пространство. И это видно в SI. Поэтому патч памяти не всегда срабатывает даже на моём компе. Можно ли узнать каким либо способом куда загрузилась длл, что бы подкорректировать адреса для WriteProcessMemory.
| Сообщение посчитали полезным: |
|
Ранг: 30.4 (посетитель) Активность: 0.02↘0.01 Статус: Участник
|
Создано: 31 января 2006 21:20 · Личное сообщение · #2
Bad_guy писАл в "Крутая защита или CRACKL@B CrackMe #1"
Помнится, что пару лет назад все в своих статья писали, что "на вашем компьютере адрес может быть и другой", но мой опыт в крэкерстве и знания формата PE позволяют мне сделать вывод, что адрес этот на всех компьютерах будет абсолютно одинаков, а даже если это и не так, то есть хитрые функции, которые позволяют узнать содержимое EIP (текущий логический адрес в исполняющемся коде), и тем самым подкорректировать значение RegAddr.
| Сообщение посчитали полезным: |
Ранг: 70.5 (постоянный) Активность: 0.03↘0 Статус: Участник
|
Создано: 31 января 2006 22:48 · Личное сообщение · #3
PalR
К чему ты это всё написал, это совсем с другой оперы.
Тут реч о динамической загрузке библиотек виндовс.
| Сообщение посчитали полезным: |
Ранг: 605.2 (!), 341thx Активность: 0.47↘0.25 Статус: Модератор Research & Development
|
Создано: 31 января 2006 23:03 · Личное сообщение · #4
делай лоадер с DebugAPI, при загрузке DLL получишь оповещение, сверяй её имя и получай адрес
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 536.4 (!), 171thx Активность: 0.66↘0.13 Статус: Администратор Создатель CRACKL@B
|
Создано: 31 января 2006 23:32 · Личное сообщение · #5
PalR пишет:
Bad_guy писАл но не про DLL, а про EXE !
----- Всем не угодишь | Сообщение посчитали полезным: |
Ранг: 30.4 (посетитель) Активность: 0.02↘0.01 Статус: Участник
|
Создано: 31 января 2006 23:38 · Личное сообщение · #6
Jupiter
Если не сложно, может где знаешь почитать или примерчик.
Где про дебуг"апи прочитать.
Bad_guy
Просто это всё что попалось со схожей бедой.
Пасиб что помогаете. Ой чую тут 5 строчками кода не отделаться.
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 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.02↘0.01 Статус: Участник
|
Создано: 01 февраля 2006 08:25 · Личное сообщение · #8
ToBad
Заодно бы приаттачил бы исходник. Я правда только в паскаль-дельфи шарю.
| Сообщение посчитали полезным: |
Ранг: 283.6 (наставник), 56thx Активность: 0.13↘0 Статус: Участник 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.2↘0 Статус: Участник
|
Создано: 01 февраля 2006 18:55 · Личное сообщение · #10
Просто создавай спящий процесс, далее проверяй подгрузилась длл или нет. Если нет то resumethread на небольшой промежуток времени, далее опять suspendthread и проверка. И так пару секунд. Если не найдёт, то выход по таймауту.
| Сообщение посчитали полезным: |
Ранг: 30.4 (посетитель) Активность: 0.02↘0.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.47↘0.25 Статус: Модератор Research & Development
|
Создано: 01 февраля 2006 22:08 · Личное сообщение · #12
прогу в студию
про DebugAPI читай в MSDN, если у тя установлена локально - там есть примерчики на Сях
----- EnJoy! | Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 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.02↘0.01 Статус: Участник
|
Создано: 02 февраля 2006 11:27 · Личное сообщение · #14
ToBad
Выложи если не трудно. Хорошо б на паскале-дельфи.
Я правда сам кое чего пытаюсь наваять через tlhelp32, но пока КРИВО.
| Сообщение посчитали полезным: |
Ранг: 283.6 (наставник), 56thx Активность: 0.13↘0 Статус: Участник 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.02↘0.01 Статус: Участник
|
Создано: 02 февраля 2006 15:38 · Личное сообщение · #16
Zagruzchik.exe - это не моё изобретение, а разработчиков. Входит в состав пакета программы (Program.exe). Я назвал так условно.
| Сообщение посчитали полезным: |
Ранг: 162.2 (ветеран) Активность: 0.09↘0 Статус: Участник
|
Создано: 03 февраля 2006 09:55 · Личное сообщение · #17
Попробуй поправить Zagruzchik.exe так чтобы он запускал какой нибудь loader2.exe, а loader2.exe должен запускать Program.exe и патчить её.
| Сообщение посчитали полезным: |
Ранг: 30.4 (посетитель) Активность: 0.02↘0.01 Статус: Участник
|
Создано: 03 февраля 2006 13:34 · Личное сообщение · #18
Всем спасибо. Разобрался и сделал. Можно патчить любую длл в любом прцессе, кроме системных конечно.
| Сообщение посчитали полезным: |
Ранг: 160.1 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 03 февраля 2006 13:36 · Личное сообщение · #19
PalR
системные тоже можно
| Сообщение посчитали полезным: |
Ранг: 283.6 (наставник), 56thx Активность: 0.13↘0 Статус: Участник Author of GeTaOEP
|
Создано: 03 февраля 2006 18:35 · Личное сообщение · #20
PalR
Ну,примерно опиши хоть,как реализовал?Какие функции использовал?
Интересно всё же... .
----- the Power of Reversing team | Сообщение посчитали полезным: |
Ранг: 30.4 (посетитель) Активность: 0.02↘0.01 Статус: Участник
|
Создано: 05 февраля 2006 20:50 · Личное сообщение · #21
Да всё просто.
Лодер делает CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Получаете список всех процессов.
Потом среди процессов ищет нужный.
Затем CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,нужного процесса);
Получаете список длл этого процесса. Ищете нужную и вытаскиваете данные. Всё.
| Сообщение посчитали полезным: |
Ранг: 237.0 (наставник), 20thx Активность: 0.13↘0 Статус: Участник sysenter
|
Создано: 12 декабря 2007 23:03 · Личное сообщение · #22
Может я не понял задачу, но:
Все еще проще - адрес загрузки dll всегда = GetModuleHandle("...dll");
----- продавец резиновых утёнков | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 13 декабря 2007 12:20 · Личное сообщение · #23
HiEndsoft это если в своем процессе..
извращенный метод: ждем полного запуска, суспенд, инжект в процесс-жертву кодеса, который уже делоет GetModuleHandle, и патчит длл.. есле патч не большой, то и базонезависимого кода не много
----- invoke OpenFire | Сообщение посчитали полезным: |