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

 eXeL@B —› Дневники и блоги —› OOTT(Pashkin) blog: на пути истины
Посл.ответ Сообщение


Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 23 февраля 2010 14:52
· Личное сообщение · #1

Driver mod (on).
Интересы меняются - всего хочется попробовать, завело меня в степи ring0, захотелось ченить покодить. Начитался литературы, накачал инструментов, решил повелосипедить)))
Вобщем в этой теме хотелось бы задавать различные вопросы в облости крека и програмирования по мере появления новых интересов.
Вобще цель написать дампер, отточить навыки, получит незаменимый опыт




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 23 февраля 2010 15:30 · Поправил: Oott
· Личное сообщение · #2

1.
Что юзаю: DDK, notepad++, Dbgview, KmdManager.
Cи знаю таксе, вобщем фигово, но мне хватало)))
Для начала решил написать диспетчер процессов.
чёта всё как-то непривычно, вот велосипед:
Code:
  1.  
  2. бля, пока копировал код - нашёл ошибку - сорри
  3.  






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

Создано: 23 февраля 2010 22:07
· Личное сообщение · #3

Дампер? Процессов, видимо. Сразу 2 пути тогда: обходить VAD или PDE/PTE, выбирай.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

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

Да, процессов. А что насчёт +/- у этих способов? Я так думаю, существующих решения больше через VAD.

Чтобы не быть голословным вот кодец, который хотел выложить, но когда смотрел нет ли ошибок в сообщении, нашёл таки ошибку в коде.
надо заполнить буфер информацией о процессах, через ZwQuerySystemInformation
Code:
  1.  
  2. PVOID GetSysInfo(IN INT informationType)
  3. {
  4.  NTSTATUS status;
  5.  PVOID buffer = NULL;
  6.  ULONG size = 0;
  7.  
  8.  DbgPrint("MemTest Function Strat..\n");
  9.  
  10.  do
  11.     {
  12.      buffer = SNU_ALLOC_MEM(NonPagedPool, size);
  13.         if (buffer)
  14.                   {  
  15.                     
  16.          status = ZwQuerySystemInformation(
  17.                         informationType,
  18.                         buffer, size, NULL );
  19.                         
  20.                   if (status == STATUS_INFO_LENGTH_MISMATCH)
  21.                          {
  22.                               SNU_FREE_MEM(buffer);
  23.                          }
  24.                         else if (!NT_SUCCESS(status)) 
  25.                          {
  26.                               SNU_FREE_MEM(buffer);
  27.                               return NULL;
  28.                          }
  29.                  }
  30.          else { break;}
  31.          }
  32.     while (status == STATUS_INFO_LENGTH_MISMATCH);
  33.          DbgPrint("Size %x\n",size);
  34.          DbgPrint("Adr %x\n",buffer);
  35.     return buffer;
  36. }
  37.  
  38.  


найдите ошибку)




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 24 февраля 2010 16:10
· Личное сообщение · #5

ERROR 1: __out_opt PULONG ReturnLength = NULL

Code:
  1. PVOID GetSysInfo(IN INT informationType)
  2. {
  3.  NTSTATUS status;
  4.  PVOID buffer = NULL;
  5.  ULONG size = 0;
  6.  ULONG ReturnLength;
  7.  
  8.  DbgPrint("MemTest Function Strat..\n");
  9.  
  10.  do
  11.     {
  12.      buffer = SNU_ALLOC_MEM(NonPagedPool, size);
  13.         if (buffer)
  14.                   {  
  15.                     
  16.          status = ZwQuerySystemInformation(
  17.                         informationType,
  18.                         buffer, size, &ReturnLength );
  19.                         
  20.                   if (status == STATUS_INFO_LENGTH_MISMATCH)
  21.                          {
  22.                               SNU_FREE_MEM(buffer);
  23.                               size = ReturnLength;
  24.                          }
  25.                         else if (!NT_SUCCESS(status)) 
  26.                          {
  27.                               SNU_FREE_MEM(buffer);
  28.                               return NULL;
  29.                          }
  30.                  }
  31.          else { break;}
  32.          }
  33.     while (status == STATUS_INFO_LENGTH_MISMATCH);
  34.          DbgPrint("Size %x\n",size);
  35.          DbgPrint("Adr %x\n",buffer);
  36.     return buffer;
  37. }


ERROR 2:? возможно при size = 0 buffer = SNU_ALLOC_MEM(NonPagedPool, size); вернет NULL
и улетит по if (buffer) { } else { break;}

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 24 февраля 2010 16:43
· Личное сообщение · #6

OKOB,
1. Ну вобщем правильно!
Ток красивее было бы сделать так:
Code:
  1. PVOID MemTest(IN INT informationType)
  2. {
  3.  NTSTATUS status;
  4.  PVOID buffer = NULL;
  5.  ULONG size = 0;
  6.  
  7.  DbgPrint("MemTest Function Strat..\n");
  8.  
  9.  do
  10.     {
  11.      buffer = SNU_ALLOC_MEM(NonPagedPool, size);
  12.         if (buffer)
  13.                   {  
  14.                     
  15.          status = ZwQuerySystemInformation(
  16.                         informationType,
  17.                         buffer, size, &size );
  18.                         
  19.                   if (status == STATUS_INFO_LENGTH_MISMATCH)
  20.                          {
  21.                               SNU_FREE_MEM(buffer);
  22.                          }
  23.                         else if (!NT_SUCCESS(status)) 
  24.                          {
  25.                               SNU_FREE_MEM(buffer);
  26.                               return NULL;
  27.                          }
  28.                  }
  29.          else { break;}
  30.          }
  31.     while (status == STATUS_INFO_LENGTH_MISMATCH);
  32.          DbgPrint("Size %x\n",size);
  33.          DbgPrint("Adr %x\n",buffer);
  34.     return buffer;
  35. }
  36.  
  37.  


2. NULL он не вернёт, ну а вообще этичней было бы написать так: ULONG size = PAGE_SIZE;




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

Создано: 24 февраля 2010 17:13
· Личное сообщение · #7

В ВАДах не помню, какой минус, очень давно их смотрел. Не на любой участок есть ВАД, что ли, не помню точно.
ПДЕ/ПТЕ более низкоуровневая хрень, можно написать, раскурив ман интела+нагуглив пару смещений. Сложность будет со всякими выгруженными страницами в своп, которые помечены как отсутствующие, надо их подгружать, но делать на низком иркл.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 01 марта 2010 16:26
· Личное сообщение · #8

нубовопрос:
Вобщем, если я приаттачился к процессу, как тепрь его память от своей отличить? Как обращаться к адресам, для дальнейшего чтения. Гуглил, восновном примеры с ReadProcessMemory, что мне не нужно. Может кто кодом поделиться?




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

Создано: 01 марта 2010 18:04
· Личное сообщение · #9

Что значит от своей? Нет больше твоей. Память ядра 1 общая для всех, юзермод меняется при смене контекста процесса. Бери и прямо читай типа mov eax,[ebx]. Имей в виду, что они просвоплены могут быть, иркл нужен пассив.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 01 марта 2010 18:58
· Личное сообщение · #10

Не, я ктому, что как поиметь нужные адресса процесса, не зря ж я к нему для начала надо аттачиться, что через mov то понятно))) С иркл'ом потом мудрить буду, это самая жоская часть




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

Создано: 01 марта 2010 22:11
· Личное сообщение · #11

Да с ирклом как раз ничего особо сложного, отдельный тред спасёт отца демократии. Разве что синхронизация нужна. А про адреса всё равно не понял не фига, что ты хочешь. Обычно дамп-это тебе дана уже база и размер, только возьми да считай.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 02 марта 2010 21:57 · Поправил: Oott
· Личное сообщение · #12

Ну может есть какаянить структура с информацией о процессе, если например имеджбейс нестандартный попадётся, можно какнить это определить, не методом тыка. Или вот как в peetools, при дампе региона, есть что-то типа списка страничек их адресами и размером.




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

Создано: 02 марта 2010 22:03
· Личное сообщение · #13

PETools получает наверняка через VirtualQueryEx. Если нужен весь список на более низком уровне, смотри мой первый пост. Но это тупо карта памяти и никаких записей, типа "вот тут начало нужного тебе образа" нет.




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 05 июня 2010 02:08 · Поправил: Oott
· Личное сообщение · #14

Ну в общем то, по теме которая поднималась окончено, написано несколько набросков, думаю в дальнейшем пригадитсо.
//////////////////////////////////
И так, поднималась тут темка одна по говнообфускатору DYAMAR OBFUSCATOR. Тема заросла срачем и её закрыли, ну не важно. Бытовало мнение, что (Full) это очень адская штука и сможет не мало попарить мозг реверсеру, чтобы всех в этом убедить автор выложил calc_Obfuscated . Но как и предпологалось, всё оказалось совсем не так и тут я попробую это показать. Обфускация достаточно линейная, есть пару фишек о которых писал int, но и они релизованы бестолково, посему всё легко снимается. В аттаче скрипт, который собствено это делает. Ну конечно в полный оригинал не приводит, но по большей части код востановлен так, как он выглядел до обфускации. Не 100% потому, что будут проскакивать инструкции типа TEST, но погоду это не делает, хоят убрать их тоже можно было проанализировав несколько инструкций идущих после.
Вот примеры кода в иде после деобфускации с ep:
Code:
  1.  
  2. .dtext:010617EA ; start
  3. .dtext:010617EF                 push    70h
  4. .dtext:010617F1 ; .dtext:010617F1
  5. .dtext:01061811                 push    offset dword_10015E0
  6. .dtext:01061816 ; .dtext:01061816
  7. .dtext:0106182D                 call    sub_10127C8
  8. .dtext:01061832 ; .dtext:01061832
  9. .dtext:01061849                 xor     ebx, ebx
  10. .dtext:0106184B ; .dtext:0106184B
  11. .dtext:0106186B                 push    ebx             ; lpModuleName
  12. .dtext:0106186C ; .dtext:0106186C
  13. .dtext:0106187C                 mov     edi, ds:GetModuleHandleA
  14. .dtext:01061882 ; .dtext:01061882
  15. .dtext:01061896                 call    edi ; GetModuleHandleA
  16. .dtext:01061898 ; .dtext:01061898
  17. .dtext:0106189B                 cmp     word ptr [eax], 5A4Dh
  18. .dtext:010618A0 ; .dtext:010618A0
  19. .dtext:010618A5                 jnz     loc_102FB77
  20. .dtext:010618AB ; ololo
  21. .dtext:010618D4                 mov     ecx, [eax+3Ch]
  22. .dtext:010618D7                 test    edi, esi
  23. .dtext:010618D9 ; .dtext:010618D9
  24. .dtext:010618DE                 add     ecx, eax
  25. .dtext:010618E0 ; .dtext:010618E0
  26. .dtext:01061937                 cmp     dword ptr [ecx], 4550h
  27. .dtext:0106193D ; .dtext:0106193D
  28. .dtext:01061952                 jnz     loc_102FB77
  29. .dtext:01061958 ; .dtext:01061958
  30. .dtext:01061978                 cmp     esi, edi
  31. .dtext:0106197A                 movzx   eax, word ptr [ecx+18h]
  32. .dtext:0106197E ; .dtext:0106197E
  33. .dtext:0106199F                 cmp     eax, 10Bh
  34. .dtext:010619A4 ; .dtext:010619A4
  35. .dtext:010619AA                 jz      loc_1059D7F
  36. .dtext:010619B0 ; .dtext:010619B0
  37. .dtext:010619B7                 cmp     eax, 20Bh
  38. .dtext:010619BC ; .dtext:010619BC
  39. .dtext:010619C4                 jz      loc_102CFDE
  40. .dtext:010619CA ; .dtext:010619CA
  41. .dtext:010619ED                 jmp     loc_102FB77


ну или вот например первая функа call sub_10127C8 востановилась полностью(скрытые поля убрал для ясности):
Code:
  1. push    offset loc_10128E2
  2. mov     eax, large fs:0
  3. push    eax
  4. mov     large fs:0, esp
  5. mov     eax, [esp+8+arg_4]
  6. mov     [esp+8+arg_4], ebp
  7. lea     ebp, [esp+8+arg_4]
  8. sub     esp, eax
  9. push    ebx
  10. push    esi
  11. push    edi
  12. mov     eax, [ebp-8]
  13. mov     [ebp-18h], esp
  14. push    eax
  15. mov     eax, [ebp-4]
  16. mov     dword ptr [ebp-4], 0FFFFFFFFh
  17. mov     [ebp-8], eax
  18. retn

Всё что нам нужно это опредеоить сигнатуры, по которым будет затираться мусор и попытаться сделать их наименее опасными, ибо можно подловится и затереть совсем не мусор.
Что касается мусора, который простой заменой не уберёшь, тут тоже ни чего сложного, всегда найдутся пару констант, ниже, выше, по котрым можно всё расчистить.
Пример(в закрытой теме брался во внимание):
Code:
  1. 010618B1    B9 6F7C0000     MOV ECX,7C6F
  2. 010618B6    81C1 373E0000   ADD ECX,3E37
  3. 010618BC    0F85 12000000   JNZ calc_Obf.010618D4
  4. 010618C2    09D5            OR EBP,EDX
  5. 010618C4    09C5            OR EBP,EAX
  6. 010618C6    33D3            XOR EDX,EBX
  7. 010618C8    2BF2            SUB ESI,EDX
  8. 010618CA    8BC3            MOV EAX,EBX
  9. 010618CC    5A              POP EDX
  10. 010618CD    03E1            ADD ESP,ECX
  11. 010618CF    57              PUSH EDI
  12. 010618D0    5F              POP EDI
  13. 010618D1    5F              POP EDI
  14. 010618D2    C9              LEAVE
  15. 010618D3    C3              RETN
  16. 010618D4    8B48 3C         MOV ECX,[DWORD DS:EAX+3C]
  17. ////////////////////////////////////////
  18. 0106634D    B8 45770000     MOV EAX,7745
  19. 01066352    81C0 A23B0000   ADD EAX,3BA2
  20. 01066358    0F85 08000000   JNZ calc_Obf.01066366
  21. 0106635E    21C5            AND EBP,EAX
  22. 01066360    8BEE            MOV EBP,ESI
  23. 01066362    5E              POP ESI
  24. 01066363    5B              POP EBX
  25. 01066364    C9              LEAVE
  26. 01066365    C3              RETN
  27. 01066366    B9 DD350000     MOV ECX,35DD
  28. 0106636B    81C1 EE1A0000   ADD ECX,1AEE
  29. /////////////////////////////////////
  30. 010665F1    BA 825E0000     MOV EDX,5E82
  31. 010665F6    81C2 412F0000   ADD EDX,2F41
  32. 010665FC    0F85 0A000000   JNZ calc_Obf.0106660C
  33. 01066602    51              PUSH ECX
  34. 01066603    09FC            OR ESP,EDI
  35. 01066605    53              PUSH EBX
  36. 01066606    09D5            OR EBP,EDX
  37. 01066608    5B              POP EBX
  38. 01066609    5B              POP EBX
  39. 0106660A    C9              LEAVE
  40. 0106660B    C3              RETN
  41. 0106660C    2BC6            SUB EAX,ESI
  42. 0106660E    C1C1 20         ROL ECX,20
  43.  
  44. и т.п.

Т.е. размер всегда не определён и инструкции после ret, могли быть не мусорными.
Ну и убираетсо как-то так:
Code:
  1. lp:
  2. find start,#B?????000081??????00000F85??000000#
  3. mov idc,$RESULT
  4. cmp idc,0
  5. jz end
  6. mov al,[idc+0D]
  7. add al,11
  8. fill idc,al,90
  9. jmp lp
  10. end:


т.е. тут мы опирались на условный перход jnz, котрый по сути jmp.

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


784a_04.06.2010_CRACKLAB.rU.tgz - calc_De_Obfuscated.7z


 eXeL@B —› Дневники и блоги —› OOTT(Pashkin) blog: на пути истины
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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