Сейчас на форуме: zds, kris_sexy (+7 невидимых)

 eXeL@B —› Крэки, обсуждения —› Подмена API функции
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 14 октября 2006 05:03
· Личное сообщение · #1

Доброго времени суток!

Немного занимаюсь крякингом, и тут попалась программа IconLover v4.12.
Программа триальная и работает только 30 дней.
Загоняю в SoftIce и натыкаюсь на следующее:

001B:0040B228 CALL KERNEL32!GetLocalTime
001B:0040B22D MOV CX,[ESP+0E]
001B:0040B232 MOV DX,[ESP+0A]
001B:0040B237 MOV AX,[ESP+08]

Т.е. запрашивается время(точнее число, месяц и год). Достаточно поменять например смещение на 0B(001B:0040B22D MOV CX,[ESP+0B]). В таком режиме программа будет бесконечно работать(только если ее крякнуть до первого запуска, т.к. она запоминает последнюю дату), считая, что у нас дата 0.0.0000. Лезем в exe файл hex редактором по адресу 0040B22D и .... ничего! Программа запакованна. Проверяем ее PEID-выдает asprotect. Распаковщик stripper 213b9 ее не берет - я так думаю одна из последних версий asprotect(2.22 или какая еще).

Теперь вопрос:
появились следующие мысли:
Вариант 1. Возможно ли подменить/перехватить API функцию GetLocalTime, не влезая в атакуемую программу?
Вариант 2. Возможно ли другой программой(допустим "виртуальным" кряком) изменить программу(точнее ее данные) прямо в памяти, после ее запуска. Но тут возникает следующая проблема, как сделать точку останова(остановить процесс) после распаковки, но до первого запуска функции GetLocalTime.

Саму прогу можно взять тут: www.aha-soft.com/iconlover/iconlove.zip
Особо строго не судите - я пока новичёк в этом деле
Всем заранее спасибо.




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 октября 2006 05:10 · Поправил: Rascal
· Личное сообщение · #2

Подменять ни к чему. Пишется laoder/ Он в памяти меняет данные програмпмы (когда она уже распаковалась) и всё. А остановка - октрываешь процесс и с интервалом читаешь по нужному адресу байты. Когда они те, что нужны, сюспендишь главный поток и меняешь байты.

[ADDED]
Точнее сюспендишь постоянно при проверке. Например слип 20, сюспендтрид, ридпроцессмемори, проверяешь, если распакованно, то райтпроцессмемори, резюмтрид. иначе просто резюмтрид. И это в цикле

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 14 октября 2006 05:11
· Личное сообщение · #3

Sparrow пишет:
Возможно ли другой программой(допустим "виртуальным" кряком) изменить программу(точнее ее данные) прямо в памяти, после ее запуска

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




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 14 октября 2006 05:15
· Личное сообщение · #4

Sparrow пишет:
Вариант 1. Возможно ли подменить/перехватить API функцию GetLocalTime, не влезая в атакуемую программу?

Можно, напиши драйвер перехватчик
Литература по сабжу www.books.ru/shop/books/448604

Ссылки по сабжу
rootkit.com/
www.wasm.ru/article.php?article=apihook_1
www.wasm.ru/article.php?article=apihook_2
www.wasm.ru/article.php?article=apihook_3
www.wasm.ru/article.php?article=1021007

-----
Nulla aetas ad discendum sera





Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 14 октября 2006 05:42
· Личное сообщение · #5

И еще в догонку. У себя на компе все подобные триалы убил очень просто: батник в Автозагрузку "date 21-08-2005" и все
З.Ы
В организациях такая хрень не прокатит, в сети аптек продлевал таким макаром триал Dr.Weba, через несколько дней позвонили и сказали какого хера я у них наделал - все накладные выбивались одним числом
Такая же ху#ня была и с местным отделом милиции

-----
Nulla aetas ad discendum sera





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 14 октября 2006 05:47
· Личное сообщение · #6

Flint пишет:
"date 21-08-2005"

Еще один минус - сертификаты для безопасного соединения связаны с датой, в результате постоянные pop-upы с подтверждением бесят.




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 14 октября 2006 05:56
· Личное сообщение · #7

HoBleen пишет:
Еще один минус - сертификаты для безопасного соединения связаны с датой, в результате постоянные pop-upы с подтверждением бесят.


А я то думаю, какого хера они у меня постоянно вылазиют

-----
Nulla aetas ad discendum sera




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

Создано: 14 октября 2006 06:38
· Личное сообщение · #8

Всем спасибо за быстрый ответ. Думаю тема исчерпана.

P.S.: Если у кого есть исходник какого-нибудь лоадера, то пожалуйста киньте на sparrow_ppc@mail.ru




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 октября 2006 06:59 · Поправил: Rascal
· Личное сообщение · #9

Вот лоадер для солдата. Слать влом. Да и мож кому пригодится


507e_14.10.2006_CRACKLAB.rU.tgz - Soldat1.3.1Loader.rar

[ADDED]
Размер будет у ехе 4 килобайта. Проект на с++. Это сторонникам асма

-----
Недостаточно только получить знания:надо найти им приложение




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

Создано: 14 октября 2006 11:26
· Личное сообщение · #10

Отлично, лоадер написан, НО! .... Возникла проблема:

Принцип работы лоадера не расказываю, но хочу остановиться на небольшом ньюансе:
После того как мы запустили программу-жертву мы ждем ее распаковки, но надо учесть, что asprotect после распаковки пробегает по коду и если что-то найдет-выдаст ошибку(что-то там про защиту)!Следовательно, после того, как лоадер обнаружил, что код распакован, надо еще выждать sleep(x)... Но что ставить вместо x? Как подобрать задержку в зависимости от скорости компа? На виртуально машине хватает(как ни странно) 1000, а вот на реальном компе лоадер работает только после 2000 :-/
Как одаптировать кряк под любой комп, точнее как узнать, что asprotect закончил проверку?

Ниже приведу консольный код на делфе(он не оптимизирован, а набран по-быстрому для проверки. Исходник был взят с каого-та сайта, да простит меня автор той статьи ):


program Loader;

uses
Windows;

const buf:array[0..14] of byte=($66,$8B ,$48 ,$02 ,$90 ,$66 ,$8B ,$50 ,$02 ,$90 ,$66 ,$8B ,$40 ,$02 ,$90); //
filename='iconlover.exe'; // Èìÿ ôàéëà
appname='Loader for ReGetDelux';
var
i:cardinal;
sti:tstartupinfo;
lpPi:tprocessinformation;

begin
if not CreateProcess(nil,filename,nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StI,lpPI) then
begin
messageboxa(0,'À ãäå '+filename+' ?','Loader for ReGetDelux',MB_ICONQUESTION);
halt;
end
else
while true do
if readprocessmemory(lppi.hProcess,pointer($40B22D),@buf[0],1,i) // ×èòàåì îäèí áàéò ïî àäðåñó 00441785
then
if buf[0]<>$66 then
begin

sleep(2000);

suspendthread(lppi.hThread);
writeprocessmemory(lppi.hProcess,pointer($40B22E),@buf[1],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B22F),@buf[2],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B230),@buf[3],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B231),@buf[4],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B232),@buf[5],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B233),@buf[6],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B234),@buf[7],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B235),@buf[8],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B236),@buf[9],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B237),@buf[10],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B238),@buf[11],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B239),@buf[12],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B23A),@buf[13],1,i);
writeprocessmemory(lppi.hProcess,pointer($40B23B),@buf[14],1,i);
resumethread(lppi.hThread);
closehandle(lppi.hprocess);
halt;
end;
end.




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

Создано: 14 октября 2006 11:55
· Личное сообщение · #11

это для любителей C++


8c59_14.10.2006_CRACKLAB.rU.tgz - loader-asm.zip




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 октября 2006 12:10 · Поправил: Rascal
· Личное сообщение · #12

r99
Это я так понимаю в мою сторону. Опять развязывание священных войн? Я показал что размер ехе будет 4 кило, это тем кто говорит что С++ большие ехе компилит. К чему твой наезд? Поясни.

Sparrow
Для кого придумали подсветку кода???
Как вариант запускать лоадер, искать окно сообщения, если есть килять процесс, увеличивать интервал и запускать снова. Когда интервал найдёшь записать в реестр и всё

-----
Недостаточно только получить знания:надо найти им приложение





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

Создано: 14 октября 2006 13:06
· Личное сообщение · #13

Rascal
не преувеличивай того чего нет - против C++ я ничего не говорил
и вообще это пустой топик - без отладчика к аспру лоадер не сделаешь



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

Создано: 14 октября 2006 13:11 · Поправил: asd
· Личное сообщение · #14

К чему такие извраты со слипами. Не проще-ли действительно перехватить функцию. Если всё только в неё упирается.




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 октября 2006 13:43
· Личное сообщение · #15

asd
Просто писать хук библу отнюдь не проще.

-----
Недостаточно только получить знания:надо найти им приложение




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

Создано: 14 октября 2006 20:29 · Поправил: S_T_A_S_
· Личное сообщение · #16

Rascal пишет:
Размер будет у ехе 4 килобайта. Проект на с++. Это сторонникам асма

Раз выкинул CRT, не забудь исправить сигнатуру для точки входа.

int APIENTRY New_WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox ( hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC)DLG_Main );

return (int) 0;
}

код упадёт на return (int) 0;. В реале это не происходит, т.к. выход делается в другом месте через ExitProcess. Хотя как для DialogBox заместо hInstance подходит левый адрес из kernel32 хз.


Sparrow пишет:
Следовательно, после того, как лоадер обнаружил, что код распакован, надо еще выждать sleep(x)... Но что ставить вместо x?


Sleep не гарантирует что код пробудится черех время X. Возможно подойдет WaitForInputIdle, хотя это тоже криво.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 14 октября 2006 23:52
· Личное сообщение · #17

S_T_A_S_ пишет:
Sleep не гарантирует что код пробудится черех время X.

Поэтому я рекомендую погружать библиотеку.

Rascal пишет:
Просто писать хук библу отнюдь не проще.

Чем же сложнее?
Ставишь thunk на одну из первых API проги. Подменная ф-я изменяет что надо и возвращает код перехваченной ф-и на место. И никаких проблем с синхронизацией!



Ранг: 50.3 (постоянный), 2thx
Активность: 0.020
Статус: Участник

Создано: 15 октября 2006 00:10
· Личное сообщение · #18

Сорс моего триал фризера я думаю будед в тему.

slippage.narod.ru/files/tfsrc.rar



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

Создано: 15 октября 2006 04:23
· Личное сообщение · #19

Не один из методов нормально не работает, т.к.:
Программа Сразу после распаковки только однажды запрашивает GetLocalTime, поэтому, что касается лоадера, то надо попасть в момент после распаковки и проверки... Задержкой(к примеру слипом) нормально интевал подобрать не выйдет, т.к. все зависит от загруженности проца и т.п. факторов. Пробовал делать в алгоритме кряка следующее: инзначально ставить задержу по минимуму, а потом отлавливать окно предупреждения о защите, далее, если оно появилось, то увеличиваем задержу(скажем на 50) и все заново... Но при разных условиях задержка в диапазоне от 100 до 2000, т.е наращивать ее нет смысла, т.к. окошко защиты появляется только через 2-5 сек после старта процесса. Получаем, если мы начинаем перебирать задержку от 100 до 2000 с шагом 50 и на каждый шаг уходит от 2 до 5 сек....сами считайте... В таких темпах программа будет грузиться достаточно долго и не факт, что вообще правильно загрузится, т.к. возможно нагрузка на проц уменьшится и мы пролетим GetLocalTime.

Что касается загрузки специальной ДЛЛ в программу-жертву, то тоже не прокатит, т.к. ее так же надо сразу же записать после распаковки и проверки - иначе мы либо проскочим GetLocalTime, либо нарвемся на защиту протектора, который скорее всего проверяет CRC(ведь нам все-равно надо изменять данные в атакуемой программе, чтобы сделать "переадресацию" на нашу длл).

Я вижу только два пути:
1. самому распаковать asprotect, чего я делать не хочу, т.к. это займет уйму времени и не факт,что получится;
2. найти куда прога записывает дату-я этим сейчас и вожусь, но пока безуспешно

Может я в чем-то и ошибся - не судите строго новичка...

У кого-нибуть есть еще какие-нибудь мысли?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 октября 2006 04:27 · Поправил: Archer
· Личное сообщение · #20

Sparrow
Вообще то длл можно писать сразу же после старта, длл ставит хук на любую функцию, которая вызывается поле распаковки. Если она вызывается раньше, поставь счётчик. Хук ставь сразу в кернел.длл, КРК обломается. В общем обдумай и делай.




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

Создано: 15 октября 2006 05:07
· Личное сообщение · #21

Sparrow
во 1-х стриппер хоть и не берет эту прогу но выдает лог полезный (например адреса всякие)
во 2-х там есть unrar.dll и если в ней на EP прописать eb fe то тоже кое-что можно узнать
в 3-х "Знания без размышлений вредны, а размышления без знаний опасны"




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 15 октября 2006 05:15
· Личное сообщение · #22

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


Видимо ты не понял. Запускаем процесс в замороженном состоянии (флаг CREATE_SUSPENDED), при этом код проги НЕ ВЫПОЛНЯЕТСЯ. Далее подгружаем библу, кот. изменяет ВИНДОВУЮ API GetLocalTime, не трогая код проги. Т.е. CRC проги остается тем же. И после запускаем основной поток проги с помощью SuspendThread. Только после этого начинает выполняться код проги с распаковкой, проверкой CRC и т.д.

Очевидный способ противостоять этому - проверка CRC библиотеки, что также легко перехватывается на всяческих CreateFile и т.д.



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

Создано: 15 октября 2006 10:38
· Личное сообщение · #23

Прочитал достоточно много документации по внедрению длл в процесс и подмене таким способом апи.
Если я все правильно понял, то механизм примерно такой: загружаем длл в адресное пространство потока и в таблице импорта заменяем адрес нужной функции на свою. Но как быть, если паковщик работает так, что в таблице иморта запакованной программы нет ссылки на нужную функцию(GetLocalTime)?

Может я что-то не так понял?




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 15 октября 2006 10:55
· Личное сообщение · #24

S_T_A_S_
да, есть такая тема. в этой проге не пофиксил. а в другой долго пытался понять, что же с созданием диалога.

HoBleen пишет:
Ставишь thunk на одну из первых API проги. Подменная ф-я изменяет что надо и возвращает код перехваченной ф-и на место. И никаких проблем с синхронизацией!

Ты сам понял, что написал?

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

Sparrow
Если всё именно так, то действительно самый логичный вариант это инжектить хук библу.

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 15 октября 2006 13:56
· Личное сообщение · #25

Щас полно развелось новых двухядерных процов. Интересно, никто случаем не пробовал использовать один их них для запуска подопытной проги? Виртуализация и все такое, наверняка это как-то можно заюзать в своих меркантильных целях. Заодно может научим ms-rem'а использовать спинлоки вместо cli/sti - а то так много его вкусностей не работает на многоголовых тачках




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

Создано: 15 октября 2006 15:52
· Личное сообщение · #26

DrGolova пишет:
Заодно может научим ms-rem'а использовать спинлоки вместо cli/sti - а то так много его вкусностей не работает на многоголовых тачках

Что именно не работает? Глючные примеры из статей чтоли? Дык мне на них наплевать.
Развиваться дальше будут только extreme dumper и hidetoolz. Они вроде работают везде нормально.

З.Ы. у меня самого 2х ядерный процессор.

-----
Скажем дружно - нафиг нужно.





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 16 октября 2006 02:11
· Личное сообщение · #27

Rascal пишет:
любом случае если код с апи забирается и не выполняется в другом месте а пишется на место, то тормозить потоки надо.

В случае GetLocalTime оригинальная функция не выполняется.
Я имел ввиду то, что если в функции-перехватчике выполнять только патчинг кода проги, то после возвращаем управление оригинальной API.

Если перехватывать одну из начальных API проги, поток будет ОДИН, который и будет делать патч после проверки CRC.

Sparrow
Почитай про сплайсинг:
wasm.ru/article.php?article=apihook_1




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 16 октября 2006 03:40
· Личное сообщение · #28

HoBleen
Кажись понял. Хук лишь для патчинга кода программы. Так вот аспр вызывает проверки времению. Так же библиотеки могут проверять время. то ИМХО плохой вариант. Апи должна работать. А ты её убиваешь. Не факт что вызовется первый то что надо.

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 16 октября 2006 03:54
· Личное сообщение · #29

Rascal пишет:
Так же библиотеки могут проверять время.

Тогда пишешь переходник, подменяющий результат, при этом на оригинальную ф-ю можно полностью забить.



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

Создано: 16 октября 2006 11:31
· Личное сообщение · #30

Всем спасибо, все вышло. Написал кряк-лоадер, который загружает длл в процесс и эта длл подменяет все вызовы GetLocalTime. Все работает на Ура


. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Подмена API функции
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати