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

 eXeL@B —› Программирование —› Отловить момент загрузки dll
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 04 апреля 2013 14:40 · Поправил: egorovshura
· Личное сообщение · #1

Собственно как это сделать? Перехват LoadLibrary не помогает. Через нее почему-то очень мало библиотек загружается. Каким образом еще библиотека может быть загружена в память процесса. Как этот момент отловить?



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

Создано: 04 апреля 2013 14:44
· Личное сообщение · #2

LoadLibraryA, LoadLibraryW
на крайняк поставить галку в оле "Break on Load DLL"



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 04 апреля 2013 14:50
· Личное сообщение · #3

если вручную грузить, то ловить надо
CreateFile - чтение файла
VirtualAlloc - выделение памяти под длл
VirtualProtect - раставление атрибутов секциям.

или что-то типа того.



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

Создано: 04 апреля 2013 15:12
· Личное сообщение · #4

LdrLoadDll еще
а к ручному способу загрузки еще MapViewOfFile или ZwCreateSection



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

Создано: 04 апреля 2013 15:17
· Личное сообщение · #5

Видимо перехват CreateFile будет самый надежный способ.




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 04 апреля 2013 15:21 · Поправил: hors
· Личное сообщение · #6

egorovshura пишет:
Видимо перехват CreateFile будет самый надежный способ.


Самый надежный способ, перехват NtCreateSection

-----
http://ntinfo.biz




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

Создано: 04 апреля 2013 15:55 · Поправил: VodoleY
· Личное сообщение · #7

а как вам вариант вмпрота? у него вообще формирование либы в памяти идет. есть такое мнение что человек на вмпрот и наступил. что мешает в память загрузить мусор.. расшифровать его.. и использовать? правильно.. особо ничего. ток процедура муторная

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




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

Создано: 04 апреля 2013 18:39
· Личное сообщение · #8

Человеку не мешало бы сразу всю инфу выложить а то сидим тут гадаем, а он может вообще не отпишется в этом топике.



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

Создано: 05 апреля 2013 02:01
· Личное сообщение · #9

это не вмпрот. Видимо там что-то самопальное используется.




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 05 апреля 2013 10:21
· Личное сообщение · #10

egorovshura пишет:

это не вмпрот. Видимо там что-то самопальное используется.


Если это не секрет, то может быть покажете файл?

-----
http://ntinfo.biz




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

Создано: 05 апреля 2013 22:36
· Личное сообщение · #11

hors пишет:
Если это не секрет, то может быть покажете файл?


Там 200 мб файлов. Если есть желание скачайте AQTime с сайта.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 05 апреля 2013 22:55 · Поправил: ELF_7719116
· Личное сообщение · #12

egorovshura пишет:
Если есть желание скачайте AQTime с сайта.

http://downloads.smartbear.com/AQtimeDemo.exe 229 Мбайт. демо?!

Там сетап что-то про HASP 12.49.1.14179 заикнулся и оказался прав. Есть еще
Code:
  1. 30361AEE  |.  B8 68584D56   MOV EAX,564D5868
  2. 30361AF3  |.  BB 00000000   MOV EBX,0
  3. 30361AF8  |.  B9 0A000000   MOV ECX,0A
  4. 30361AFD  |.  BA 58560000   MOV EDX,5658
  5. 30361B02  |.  ED            IN EAX,DX                                ; I/O command
  6. 30361B03  |.  81FB 68584D56 CMP EBX,564D5868
  7. 30361B09  |.  0F9445 E7     SETE BYTE PTR SS:[LOCAL.7+3]

Короче, граждане бандиты, качаем сию гадость 2009 года выпуска(как сервис -run) http://rghost.ru/45073472



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

Создано: 06 апреля 2013 01:37 · Поправил: egorovshura
· Личное сообщение · #13

ELF_7719116 пишет:
Короче, граждане бандиты, качаем сию гадость 2009 года выпуска(как сервис -run) http://rghost.ru/45073472


Это не в менеджере лицензий происходит, а в самой программе.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 06 апреля 2013 08:16 · Поправил: ELF_7719116
· Личное сообщение · #14

egorovshura пишет:
а в самой программе.

AQtimeCoreEx.dll тут ?
Code:
  1. offset +0x13320  |>  8B4E 40       /MOV ECX,DWORD PTR DS:[ESI+40]
  2. 02CF3323  |.  8D4424 10     |LEA EAX,[ESP+10]
  3. 02CF3327  |.  50            |PUSH EAX                                ; /Arg2
  4. 02CF3328  |.  51            |PUSH ECX                                ; |Arg1
  5. 02CF3329  |.  E8 4271FFFF   |CALL 02CEA470                           ; \AQtimeCoreEx.02CEA470
  6. 02CF332E  |.  8BF8          |MOV EDI,EAX

В функции по offset + E7B0 прослеживаются UNICODE строки типа Your License Has Expired, HASP forever...
Code:
  1. 02CF33AE  |.  50            |PUSH EAX                                                 ; /Arg3
  2. offset +133AF  |.  51            |PUSH ECX                                                 ; |Arg2
  3. 02CF33B0  |.  57            |PUSH EDI                                                 ; |Arg1
  4. 02CF33B1  |.  8BCE          |MOV ECX,ESI                                              ; |
  5. 02CF33B3  |.  E8 F8C3FFFF   |CALL 02CEF7B0                                            ; \AQtimeCoreEx.+ E7B0




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

Создано: 06 апреля 2013 17:34
· Личное сообщение · #15

ELF_7719116

Да, защита в AQtimeCoreEx.dll. Момент ее загрузки я и хочу отловить, чтобы пропатчить. Только там не все так просто. Даже если пропатчить вещи вроде License expired, прога работать не будет. Там используется шифрование. Т.е. просто пропатчить условные джампы недостаточно.




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

Создано: 06 апреля 2013 18:05
· Личное сообщение · #16

Забавно, но с LWE ниодин предложенный метод не сработает



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

Создано: 06 апреля 2013 20:03
· Личное сообщение · #17

Dr0p пишет:
Забавно, но с LWE ниодин предложенный метод не сработает


Что есть LWE?



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

Создано: 06 апреля 2013 21:01
· Личное сообщение · #18

egorovshura пишет:
Что есть LWE?


Конь сферический



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 06 апреля 2013 21:12
· Личное сообщение · #19

egorovshura пишет:
Момент ее загрузки я и хочу отловить, чтобы пропатчить.

оно не мудрено, там защита поработала - LoadLibraryExW(и ей подобные) похуканы. Вызовы идут через aqReporter.dll. Можно туть глянуть:
Code:
  1. offset+18844 |.  8B45 10       MOV EAX,DWORD PTR SS:[ARG.3]
  2. 3031883E  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[ARG.2]
  3. 30318841  |.  50            PUSH EAX
  4. 30318842  |.  51            PUSH ECX
  5. 30318843  |.  57            PUSH EDI
  6. 30318844  |.  FF15 FC303D30 CALL DWORD PTR DS:[303D30FC] // там в выделенке 2 PUSH и JMP в уже норм исполнение WinAPI
  7. 3031884A  |.  85C0          TEST EAX,EAX
  8. 3031884C  |.  8945 F8       MOV DWORD PTR SS:[LOCAL.2],EAX
  9. 3031884F  |.  74 55         JE SHORT 303188A6

Непосредственной загрузкой AQtimeCoreEx.dll занимается библиотека AQtimeCore.dll(кто бы мог подумать):
Code:
  1. offset+1160F9  |.  8BC8          MOV ECX,EAX
  2. 331160FB  |.  BA 509E1233   MOV EDX,OFFSET 33129E50
  3. 33116100  |.  B8 44611133   MOV EAX,33116144                                                 ; UNICODE "AQtimeCoreEx.dll"
  4. 33116105  |.  E8 DE74EFFF   CALL 3300D5E8

Что я думаю по этому поводу:
1) Можно попробовать самому подгрузить AQtimeCoreEx.dll и эпично наплевать на AQtimeCore.dll(который тоже подгружается в процессе)
2) aqReporter.dll загружается вместе с главным .exe - он хукает WinAPI, мы хукаем его.




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

Создано: 06 апреля 2013 21:30
· Личное сообщение · #20

egorovshura
..

cce2_06.04.2013_EXELAB.rU.tgz - lwe.zip



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 07 апреля 2013 00:28 · Поправил: ELF_7719116
· Личное сообщение · #21

Короче, взял и просто возвратил 0 в EAX (AQtimeCoreEx.dll) где
Code:
  1. .text:10013320 loc_10013320:                           ; CODE XREF: sub_100132F0+75j
  2. .text:10013320                 ; sub_100132F0+A2j ...
  3. .text:10013320                 mov     ecx, [esi+40h]
  4. .text:10013323                 lea     eax, [esp+18h+var_8]
  5. .text:10013327                 push    eax
  6. .text:10013328                 push    ecx
  7. .text:10013329                 call    sub_1000A470 // XOR EAX, EAX... оптимизируем + выпиливаем HASP )
  8. .text:1001332E                 mov     edi, eax
  9. .text:10013330                 add     esp, 8

и все запустилось И по хфиг, что служба засова не работает. Единственное, что отмечу - второе окошко все же появилось, но на него попросту забил (дело времени). Вообще wtf оно вылазит, баг чтоли?!
Прога - демо, часть функций недоступна.

3e26_07.04.2013_EXELAB.rU.tgz - show_main_window.PNG



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

Создано: 07 апреля 2013 01:47 · Поправил: egorovshura
· Личное сообщение · #22

ELF_7719116

Это только начало. Ты занопил вызов функции которая вызывает hasp_login. Надо еще патчить hasp_get_session_info. Но самое главное надо перехватывать hasp_decrypt и подсовывать нужное расшифрованное значение. Потому что hasp_decrypt возвращает GUID интерфейса, который потом используется в проге. И если не вернуть нормальное значение, прога просто ничего делать не будет.
Попробуй, например, загрузить какой-нить exe (тот же AQTime.exe) и запустить профайлинг нажав зелененькую кнопку "пуск". По идее ничего не должно произойти, хотя на самом деле должно запуститься профилируемое приложение.
На самом деле, с большой долей вероятности можно сказать, что trial и pro версии - это один и тот же бинарник. Отличие только в лицензии. Т.е. если hasp взращает trial, то приложение и ведет себя как триал, а если pro, то и приложение превращается в про.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 07 апреля 2013 09:35
· Личное сообщение · #23

Насколько я понимаю, hasp_login ещ хэндл возвращает и через него работает(типа CreateFile).
AQtimeCoreEx.dll. hasp_get_session_info ?
Code:
  1. .text:1000B5C0 sub_1000B5C0    proc near               ; CODE XREF: sub_1000D050+6Ap
  2. .text:1000B5C0                                         ; sub_1000E2B0+50p ...
  3. .text:1000B5C0
  4. .text:1000B5C0 lpMultiByteStr  = dword ptr -14h
  5. .text:1000B5C0 var_10          = dword ptr -10h
  6. .text:1000B5C0 var_C           = dword ptr -0Ch
  7. .text:1000B5C0 var_4           = dword ptr -4
  8. .text:1000B5C0 arg_0           = dword ptr  4
  9. .text:1000B5C0 arg_4           = dword ptr  8
  10. .text:1000B5C0 arg_8           = dword ptr  0Ch
  11. .text:1000B5C0 arg_C           = dword ptr  10h

hasp_decrypt тоже в AQtimeCoreEx.dll?! Типа выделяется динамически память, ложатся закриптованые байты и туда вызов идет?
Кстати, не заметил, что защита проверяла, патчены ли dll или нет. Опять же, свой загрузчик можно записать в aqReporter.dll(который постановку хуков выполняет)
egorovshura пишет:
Т.е. если hasp взращает trial, то приложение и ведет себя как триал

здесь?
Code:
  1. signed int __stdcall sub_1000DEB0(int a1, int a2)
  2. {
  3.   OLECHAR *v2; // edi@1
  4.   int v3; // esi@3
  5.   signed int result; // eax@4
  6.   int v5; // eax@1
  7.   UINT v6; // eax@6
  8.   OLECHAR *v7; // ST04_4@10
  9.   OLECHAR *v8; // ST04_4@12
  10.   BSTR lpsz; // [sp+10h] [bp-8h]@1
  11.   int v10; // [sp+14h] [bp-4h]@1
  12.  
  13.   lpsz = 0;
  14.   v5 = (int)SysAllocString(L"//hasp_info/feature/license/license");
  15.   v2 = (OLECHAR *)v5;
  16.   v10 = v5;
  17.   if ( !v5 )
  18.     loc_100021D0(-2147024882);
  19.   v3 = sub_1000D050((int)&v10, (OLECHAR *)&lpsz);
  20.   SysFreeString(v2);
  21.   if ( v3 >= 0 )
  22.   {
  23.     if ( SysStringLen(lpsz) )
  24.     {
  25.       v6 = SysStringLen(lpsz);
  26.       CharLowerBuffW(lpsz, v6);
  27.     }
  28.     if ( (unsigned __int8)loc_1000A650(&lpsz, L"trial") )
  29.     {
  30.       *(_WORD *)a2 = -1;
  31.       SysFreeString(lpsz);
  32.       result = 0;
  33.     }
  34.     else
  35.     {
  36.       if ( (unsigned __int8)loc_1000A650(&lpsz, L"expiration") )
  37.       {
  38.         v7 = lpsz;
  39.         *(_WORD *)a2 = -1;
  40.         SysFreeString(v7);
  41.         result = 0;
  42.       }
  43.       else
  44.       {
  45.         if ( (unsigned __int8)loc_1000A650(&lpsz, L"perpetual") )
  46.         {
  47.           v8 = lpsz;
  48.           *(_WORD *)a2 = 0;
  49.           SysFreeString(v8);
  50.           result = 0;
  51.         }
  52.         else
  53.         {
  54.           SysFreeString(lpsz);
  55.           result = -2147467259;
  56.         }
  57.       }
  58.     }
  59.   }
  60.   else
  61.   {
  62.     SysFreeString(lpsz);
  63.     result = v3;
  64.   }
  65.   return result;
  66. }




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

Создано: 07 апреля 2013 11:47
· Личное сообщение · #24

ELF_7719116

Да hasp_login возвращает хэндл, который потом во все функции передается.

Code:
  1. hasp_status_t hasp_login(hasp_feature_t feature_id,  hasp_vendor_code_t vendor_code, hasp_handle_t *handle);
  2. hasp_status_t hasp_get_sessioninfo(hasp_handle_t handle, const char *format, char **info);
  3. hasp_status_t hasp_decrypt(hasp_handle_t handle, void *buffer, hasp_size_t length);


Но если патчить, то можно на него забить.
Все hasp функции прилинкованы к AQtimeCoreEx.dll. hasp_decrypt тоже там. sub_1000DEB0 берет xml который возвращает hasp_get_sessioninfo
Code:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <hasp_info>
  3.          <feature>
  4.                  <featureid>320</featureid>
  5.                  <maxlogins>1</maxlogins>
  6.                  <concurrency>
  7.                         <export>network,display,local</export>
  8.                         <count>station</count>
  9.                  </concurrency>
  10.                  <vmenabled>false</vmenabled>
  11.                  <currentlogins>1</currentlogins>
  12.                  <license>
  13.                         <license>trial</license>
  14.                         <time_start>1364209198</time_start>
  15.                         <total_time>1209600</total_time>
  16.                  </license>
  17.          </feature>
  18. </hasp_info>


и используя msxml берет значение элемента license. Я пробовал подменять trial на perpetual, но это только изменяет текст в Help/About. Pro фичи не включаются. Я так и не понял где еще проверяется на триальность. Возможно hasp API есть и в других модулях.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 07 апреля 2013 13:12 · Поправил: ELF_7719116
· Личное сообщение · #25

Слово Demo мне не нравиться - может версия изначально урезана и pro фитчи тут попросту отсутствуют.
Одна зацепка есть еще в самом AQtime.exe:
Code:
  1. 00450DD1  |.  837D F8 00    CMP DWORD PTR SS:[LOCAL.2],0
  2. 00450DD5  |.  75 04         JNE SHORT 00450DDB
  3. 00450DD7  |.  B0 01         MOV AL,1
  4. 00450DD9  |.  EB 02         JMP SHORT 00450DDD //убило: AL = 1, но, блиа, надо все равно сравнить!
  5. 00450DDB  |>  33C0          XOR EAX,EAX //где оптимизация?
  6. 00450DDD  |>  84C0          TEST AL,AL
  7. 00450DDF  |.  74 2E         JE SHORT 00450E0F
  8. 00450DE1  |.  8B45 0C       MOV EAX,DWORD PTR SS:[ARG.2]
  9. 00450DE4  |.  E8 BF05FBFF   CALL <JMP.&AQtimeRTL_блаблабла
  10. 00450DE9  |.  68 01400080   PUSH 80004001
  11. 00450DEE  |.  6A 00         PUSH 0
  12. 00450DF0  |.  6A 00         PUSH 0
  13. 00450DF2  |.  6A 00         PUSH 0
  14. 00450DF4  |.  B9 0C0F4500   MOV ECX,00450F0C; ASCII "You are using AQtime Trial. This version cannot be controlled through COM."
  15. 00450DF9  |.  B2 01         MOV DL,1
  16. 00450DFB  |.  A1 5CD64600   MOV EAX,DWORD PTR DS:[<&AQtimeRTL_bpl.@Comobj@EOleException@>]
  17. 00450E00  |.  E8 D70DFBFF   CALL <JMP.&AQtimeRTL_bpl.ещеблаблабла>              
  18. 00450E05  |.  E8 6E03FBFF   CALL <JMP.&AQtimeRTL_bpl.@System@@RaiseExcept$qqrv>                                                  
  19. 00450E0A  |.  E9 8C000000   JMP 00450E9B




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

Создано: 07 апреля 2013 14:14
· Личное сообщение · #26

Думаю, что бинарник все-таки не урезан. Иначе зачем им делать проверку на perpetual в xml. About box не статичный, а изменяет "показания" в зависимости от лицензии. Также предыдущие версии были полноценными.
Это место из AQTime.exe похоже на один из методов COM интерфейса. При запуске не из-под COM брейк там не срабатывает.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 07 апреля 2013 14:48
· Личное сообщение · #27

Не совсем в тему, но все равно хочу спросить, ибо не понимаю. К примеру, в этой AQTime обычный WinAPI MessageBox(который потом вызывает MessageBoxTimeoutA и тд) вызывается через 100500 обёрток(wrappers), которые, в принципе, не нужны. Возможно я не модный или отстал от программистского прогресса, неужели вся эта ересь - нормальное явление?



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

Создано: 07 апреля 2013 16:10
· Личное сообщение · #28

Я так понимаю первая обертка - это чтобы WinAPI типы вроде LPSTR превратить в стандартные типы Delphi вроде string. Следующие обертки могут быть для того, чтобы выдавать определенный тип сообщений, например ошибку.
Дело в том что Delphi очень плохо инлайнит функции. С++ компилятор мог бы самостоятельно заинлайнить несколько слоев, а Delphi так не может.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 07 апреля 2013 19:02
· Личное сообщение · #29

Гм, может, qt framework используется? Вот и обёртки.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: Dr0p

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

Создано: 07 апреля 2013 20:11
· Личное сообщение · #30

UI написан на дельфи (VCL).


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


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