![]() |
eXeL@B —› Крэки, обсуждения —› Подмена API функции |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 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 Особо строго не судите - я пока новичёк в этом деле ![]() Всем заранее спасибо. ![]() |
|
Создано: 14 октября 2006 05:10 · Поправил: Rascal · Личное сообщение · #2 Подменять ни к чему. Пишется laoder/ Он в памяти меняет данные програмпмы (когда она уже распаковалась) и всё. А остановка - октрываешь процесс и с интервалом читаешь по нужному адресу байты. Когда они те, что нужны, сюспендишь главный поток и меняешь байты. [ADDED] Точнее сюспендишь постоянно при проверке. Например слип 20, сюспендтрид, ридпроцессмемори, проверяешь, если распакованно, то райтпроцессмемори, резюмтрид. иначе просто резюмтрид. И это в цикле ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 14 октября 2006 05:11 · Личное сообщение · #3 Sparrow пишет: Возможно ли другой программой(допустим "виртуальным" кряком) изменить программу(точнее ее данные) прямо в памяти, после ее запуска Называется лоадер. Запускается прога в остановленном состоянии (CREATE_SUSPENDED). Далее в твоем случае лучше подгрузить библиотеку, которая пропатчивает ф-ю - либо пишет код прямо на место функции, либо подменяет адрес в таблице экспорта. ![]() |
|
Создано: 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 ![]() |
|
Создано: 14 октября 2006 05:42 · Личное сообщение · #5 И еще в догонку. У себя на компе все подобные триалы убил очень просто: батник в Автозагрузку "date 21-08-2005" и все ![]() З.Ы В организациях такая хрень не прокатит, в сети аптек продлевал таким макаром триал Dr.Weba, через несколько дней позвонили и сказали какого хера я у них наделал - все накладные выбивались одним числом ![]() Такая же ху#ня была и с местным отделом милиции ![]() ----- Nulla aetas ad discendum sera ![]() |
|
Создано: 14 октября 2006 05:47 · Личное сообщение · #6 |
|
Создано: 14 октября 2006 05:56 · Личное сообщение · #7 |
|
Создано: 14 октября 2006 06:38 · Личное сообщение · #8 |
|
Создано: 14 октября 2006 06:59 · Поправил: Rascal · Личное сообщение · #9 Вот лоадер для солдата. Слать влом. Да и мож кому пригодится ![]() [ADDED] Размер будет у ехе 4 килобайта. Проект на с++. Это сторонникам асма ![]() ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 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. ![]() |
|
Создано: 14 октября 2006 11:55 · Личное сообщение · #11 |
|
Создано: 14 октября 2006 12:10 · Поправил: Rascal · Личное сообщение · #12 r99 Это я так понимаю в мою сторону. Опять развязывание священных войн? Я показал что размер ехе будет 4 кило, это тем кто говорит что С++ большие ехе компилит. К чему твой наезд? Поясни. Sparrow Для кого придумали подсветку кода??? Как вариант запускать лоадер, искать окно сообщения, если есть килять процесс, увеличивать интервал и запускать снова. Когда интервал найдёшь записать в реестр и всё ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 14 октября 2006 13:06 · Личное сообщение · #13 |
|
Создано: 14 октября 2006 13:11 · Поправил: asd · Личное сообщение · #14 |
|
Создано: 14 октября 2006 13:43 · Личное сообщение · #15 |
|
Создано: 14 октября 2006 20:29 · Поправил: S_T_A_S_ · Личное сообщение · #16 Rascal пишет: Размер будет у ехе 4 килобайта. Проект на с++. Это сторонникам асма Раз выкинул CRT, не забудь исправить сигнатуру для точки входа.
код упадёт на return (int) 0;. В реале это не происходит, т.к. выход делается в другом месте через ExitProcess. Хотя как для DialogBox заместо hInstance подходит левый адрес из kernel32 хз. Sparrow пишет: Следовательно, после того, как лоадер обнаружил, что код распакован, надо еще выждать sleep(x)... Но что ставить вместо x? Sleep не гарантирует что код пробудится черех время X. Возможно подойдет WaitForInputIdle, хотя это тоже криво. ![]() |
|
Создано: 14 октября 2006 23:52 · Личное сообщение · #17 S_T_A_S_ пишет: Sleep не гарантирует что код пробудится черех время X. Поэтому я рекомендую погружать библиотеку. Rascal пишет: Просто писать хук библу отнюдь не проще. Чем же сложнее? Ставишь thunk на одну из первых API проги. Подменная ф-я изменяет что надо и возвращает код перехваченной ф-и на место. И никаких проблем с синхронизацией! ![]() |
|
Создано: 15 октября 2006 00:10 · Личное сообщение · #18 |
|
Создано: 15 октября 2006 04:23 · Личное сообщение · #19 Не один из методов нормально не работает, т.к.: Программа Сразу после распаковки только однажды запрашивает GetLocalTime, поэтому, что касается лоадера, то надо попасть в момент после распаковки и проверки... Задержкой(к примеру слипом) нормально интевал подобрать не выйдет, т.к. все зависит от загруженности проца и т.п. факторов. Пробовал делать в алгоритме кряка следующее: инзначально ставить задержу по минимуму, а потом отлавливать окно предупреждения о защите, далее, если оно появилось, то увеличиваем задержу(скажем на 50) и все заново... Но при разных условиях задержка в диапазоне от 100 до 2000, т.е наращивать ее нет смысла, т.к. окошко защиты появляется только через 2-5 сек после старта процесса. Получаем, если мы начинаем перебирать задержку от 100 до 2000 с шагом 50 и на каждый шаг уходит от 2 до 5 сек....сами считайте... В таких темпах программа будет грузиться достаточно долго и не факт, что вообще правильно загрузится, т.к. возможно нагрузка на проц уменьшится и мы пролетим GetLocalTime. Что касается загрузки специальной ДЛЛ в программу-жертву, то тоже не прокатит, т.к. ее так же надо сразу же записать после распаковки и проверки - иначе мы либо проскочим GetLocalTime, либо нарвемся на защиту протектора, который скорее всего проверяет CRC(ведь нам все-равно надо изменять данные в атакуемой программе, чтобы сделать "переадресацию" на нашу длл). Я вижу только два пути: 1. самому распаковать asprotect, чего я делать не хочу, т.к. это займет уйму времени и не факт,что получится; 2. найти куда прога записывает дату-я этим сейчас и вожусь, но пока безуспешно ![]() Может я в чем-то и ошибся - не судите строго новичка... У кого-нибуть есть еще какие-нибудь мысли? ![]() |
|
Создано: 15 октября 2006 04:27 · Поправил: Archer · Личное сообщение · #20 |
|
Создано: 15 октября 2006 05:07 · Личное сообщение · #21 |
|
Создано: 15 октября 2006 05:15 · Личное сообщение · #22 Sparrow пишет: тоже не прокатит, т.к. ее так же надо сразу же записать после распаковки и проверки - иначе мы либо проскочим GetLocalTime, либо нарвемся на защиту протектора, который скорее всего проверяет CRC Видимо ты не понял. Запускаем процесс в замороженном состоянии (флаг CREATE_SUSPENDED), при этом код проги НЕ ВЫПОЛНЯЕТСЯ. Далее подгружаем библу, кот. изменяет ВИНДОВУЮ API GetLocalTime, не трогая код проги. Т.е. CRC проги остается тем же. И после запускаем основной поток проги с помощью SuspendThread. Только после этого начинает выполняться код проги с распаковкой, проверкой CRC и т.д. Очевидный способ противостоять этому - проверка CRC библиотеки, что также легко перехватывается на всяческих CreateFile и т.д. ![]() |
|
Создано: 15 октября 2006 10:38 · Личное сообщение · #23 Прочитал достоточно много документации по внедрению длл в процесс и подмене таким способом апи. Если я все правильно понял, то механизм примерно такой: загружаем длл в адресное пространство потока и в таблице импорта заменяем адрес нужной функции на свою. Но как быть, если паковщик работает так, что в таблице иморта запакованной программы нет ссылки на нужную функцию(GetLocalTime)? Может я что-то не так понял? ![]() |
|
Создано: 15 октября 2006 10:55 · Личное сообщение · #24 S_T_A_S_ да, есть такая тема. в этой проге не пофиксил. а в другой долго пытался понять, что же с созданием диалога. HoBleen пишет: Ставишь thunk на одну из первых API проги. Подменная ф-я изменяет что надо и возвращает код перехваченной ф-и на место. И никаких проблем с синхронизацией! Ты сам понял, что написал? Синхронизация нужна не такая. В любом случае если код с апи забирается и не выполняется в другом месте а пишется на место, то тормозить потоки надо. Sparrow Если всё именно так, то действительно самый логичный вариант это инжектить хук библу. ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 15 октября 2006 13:56 · Личное сообщение · #25 Щас полно развелось новых двухядерных процов. Интересно, никто случаем не пробовал использовать один их них для запуска подопытной проги? Виртуализация и все такое, наверняка это как-то можно заюзать в своих меркантильных целях. Заодно может научим ms-rem'а использовать спинлоки вместо cli/sti - а то так много его вкусностей не работает на многоголовых тачках ![]() ![]() |
|
Создано: 15 октября 2006 15:52 · Личное сообщение · #26 DrGolova пишет: Заодно может научим ms-rem'а использовать спинлоки вместо cli/sti - а то так много его вкусностей не работает на многоголовых тачках Что именно не работает? Глючные примеры из статей чтоли? Дык мне на них наплевать. Развиваться дальше будут только extreme dumper и hidetoolz. Они вроде работают везде нормально. З.Ы. у меня самого 2х ядерный процессор. ----- Скажем дружно - нафиг нужно. ![]() |
|
Создано: 16 октября 2006 02:11 · Личное сообщение · #27 Rascal пишет: любом случае если код с апи забирается и не выполняется в другом месте а пишется на место, то тормозить потоки надо. В случае GetLocalTime оригинальная функция не выполняется. Я имел ввиду то, что если в функции-перехватчике выполнять только патчинг кода проги, то после возвращаем управление оригинальной API. Если перехватывать одну из начальных API проги, поток будет ОДИН, который и будет делать патч после проверки CRC. Sparrow Почитай про сплайсинг: wasm.ru/article.php?article=apihook_1 ![]() |
|
Создано: 16 октября 2006 03:40 · Личное сообщение · #28 HoBleen Кажись понял. Хук лишь для патчинга кода программы. Так вот аспр вызывает проверки времению. Так же библиотеки могут проверять время. то ИМХО плохой вариант. Апи должна работать. А ты её убиваешь. Не факт что вызовется первый то что надо. ----- Недостаточно только получить знания:надо найти им приложение ![]() |
|
Создано: 16 октября 2006 03:54 · Личное сообщение · #29 |
|
Создано: 16 октября 2006 11:31 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Крэки, обсуждения —› Подмена API функции |