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

 eXeL@B —› Программирование —› cws
Посл.ответ Сообщение

Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 13 апреля 2010 15:11 · Поправил: Clerk
· Личное сообщение · #1

Здрасте.
Откатывал лодер, мб кому интересно.
Используем семпл из пакета Хатчессона лежащий в \MASM32\EXAMPLE8\MOB\CWS
o Так как должна применяться релокация, а нормально к экзешникам она не применяется, то компилим с опцией /DLL.
o Нотификация длл выполняется при захваченной кс LdrploaderLock. Всякое обращение к загрузчику из другого потока при захваченной этой кс приведёт к деадлоку. Поэтому не используем InitRoutine(), соответствеено компилим с опцией /NOENTRY.
o Теперь нужен стартуп рантайм, вынесем его в экспорт с именем "Run", прежде поменяв в сурце имя "start" на "Run" и указав опцию линкеру /EXPORT:Run.
После этого компилим и получаем cws.dll размером 0x19C00. Теперь жмём это посредством NTLZ(RtlCompressBuffer()) и получаем дамп размером 0x604F. Теперь шифруем, допустим простейшая битовая инверсия. Образ готов.
Пишем небольшой стаб для загрузки, который расшифровывает образ, распаковывает, подгружает средствами тестируемого лодера и вызывает экспорт Run():
Code:
  1. .data
  2.          include Crypt.inc
  3. .code
  4.          include Ldr.inc
  5.  
  6. NTERR macro
  7.          .if Eax
  8.          Int 3
  9.          .endif
  10. endm
  11.  
  12. $Dll         CHAR "cws.dll",0
  13. $Run         CHAR "Run",0
  14.  
  15.          assume fs:nothing
  16. Entry proc
  17. Local ImageBase:PVOID, Startup:PVOID
  18. Local MapAddress:PVOID, MapSize:ULONG
  19. Local FinalUncompressedSize:ULONG
  20.          mov MapAddress,0
  21.          mov MapSize,19C00H
  22.          invoke ZwAllocateVirtualMemory, NtCurrentProcess, addr MapAddress, 0, addr MapSize, MEM_COMMIT, PAGE_READWRITE
  23.          NTERR
  24. ; Encrypt
  25.          mov ecx,604FH/4 + 1
  26. @@:
  27.          not dword ptr [offset gMap + ecx*4 - 4]
  28.          loop @b
  29. ; Unpack
  30.          invoke RtlDecompressBuffer, COMPRESSION_FORMAT_LZNT1, MapAddress, 19C00H, addr gMap, 604FH, addr FinalUncompressedSize
  31.          NTERR
  32.          lea eax,ImageBase
  33.          push eax
  34.          push 0
  35.          push offset $Dll
  36.          push MapAddress
  37.          xor eax,eax      ; #LDR_LOAD_DLL
  38.          Call LDR
  39.          NTERR
  40.          invoke ZwFreeVirtualMemory, NtCurrentProcess, addr MapAddress, addr MapSize, MEM_RELEASE
  41.          lea ecx,Startup
  42.          xor eax,eax
  43.          push ecx
  44.          push eax
  45.          push eax
  46.          push offset $Run
  47.          push ImageBase
  48.          inc eax ; #LDR_QUERY_ENTRY
  49.          Call LDR
  50.          NTERR
  51. ; Fix base.
  52.          mov eax,fs:[TEB.Peb]
  53.          mov ecx,ImageBase
  54.          push PEB.ImageBaseAddress[eax]
  55.          mov PEB.ImageBaseAddress[eax],ecx
  56.          Call Startup
  57. ; mov eax,fs:[TEB.Peb]
  58. ; pop PEB.ImageBaseAddress[eax]
  59.          ret
  60. Entry endp

http://indy-vx.narod.ru/Bin/cws.zip
Помним что приложение использует GetModuleHandle(NULL), а в этом случае возвращается база экзешника, определённая в PEB[+8]. Фиксим это загрузкой туда нашей базы.
Конпилим и получае экзешник размером 0x7200. Запускаем и видим битмапу с регионом наложенным на окно:

Аттачимся ольгой. Сразу ругается про отсутствие модуля на диске. Хек



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

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

Ещё можно пофиксить адрес базы перед Startup в LDR, что-то вроде:

Code:
  1.          // fix LDR
  2.          __asm
  3.          {
  4.                  mov         eax, dword ptr fs:[0x30]
  5.                  mov         eax, dword ptr ds:[eax+0xC]
  6.                  mov         eax, dword ptr ds:[eax+0xC]
  7.                  mov         ecx, dword ptr ds:[eax+0x18]
  8.                  mov         edx, 0x10000000 << база exe
  9. __1:
  10.                  cmp         dword ptr ds:[eax+0x18], edx
  11.                  je            __2
  12.                  cmp         dword ptr ds:[eax+0x18], 0
  13.                  mov         eax, dword ptr ds:[eax]
  14.                  cmp         dword ptr ds:[eax+0x18], ecx
  15.                  jne         __1
  16. __2:
  17.                  push     dword ptr ds:[NewBase]
  18.                  pop         dword ptr ds:[eax+18h]
  19.          }


-----
Shalom ebanats!





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 13 апреля 2010 15:37
· Личное сообщение · #3

Clerk
Круто расписал, ща буду эксперементы ставить

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 13 апреля 2010 18:51
· Личное сообщение · #4

Clerk пишет:
а нормально к экзешникам она не применяется, то компилим с опцией /DLL


/FIXED:NO чем не устроило?

-----
EnJoy!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 13 апреля 2010 19:22 · Поправил: Clerk
· Личное сообщение · #5

Jupiter
Так как лодер грузит длл. Собственно по теме чтонибудь есть ?



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 13 апреля 2010 19:23 · Поправил: Clerk
· Личное сообщение · #6

SLV
В контексте данной задачи излишне, модуль не ищет себя по имени.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 14 апреля 2010 12:12
· Личное сообщение · #7

Clerk пишет:
Так как лодер грузит длл


секундочку, не надо передёргивать
ты сказал: "должна применяться релокация, а нормально к экзешникам она не применяется"
именно на это я и отвечал


Clerk пишет:
Собственно по теме чтонибудь есть ?


я ответил, процитировав твою фразу в твоём же посте
если ты считаешь, что фразы в твоём посте - не по теме, то претензии не ко мне

или ты хотел сказать, что exe с реклоками грузить труднее, нежели dll? или ещё что-то? я не домысливаю за тебя, я процитировал конкретную фразу, не додумывая и не выдумывая.

в итоге, на мой вопрос по существу ты не ответил

проехали.



по поводу сборки сорса:

либо ты забыл про
Code:
  1. include  windows.inc

либо у тебя расширенный ntdll.inc

-----
EnJoy!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 14 апреля 2010 21:50
· Личное сообщение · #8

Jupiter
Смотрите шире, с моей точки зрения. Мне интересна сама задача, её решение и мнение. Все(абсолютно все) обсуждения проблем мне не интересны, ибо я лодер знаю лучше чем ктолибо здесь.
Личное ваше мнение, что можно улучшить и пр. мне интересно.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 14 апреля 2010 21:51
· Личное сообщение · #9

Jupiter
> по поводу сборки сорса:
> либо ты забыл про
Разумеется у меня расшаренный инклуд, где определён весь нэйтив.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 17 апреля 2010 17:30 · Поправил: Clerk
· Личное сообщение · #10

Расширения для лодера http://indy-vx.narod.ru/Bin/LdrExts.zip
Форум кривой, вобщем как и все


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


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