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

 eXeL@B —› Программирование —› Контрольная сумма образа в памяти
Посл.ответ Сообщение

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

Создано: 17 ноября 2011 09:25
· Личное сообщение · #1

Как можно посчитать контрольную сумму (кс) уже загруженного и исполняющегося образа?

Мои соображения:
вариант 1: тупо считать КС секции кода (.text для MS) не подходит т.к. , например в .rdata хранятся vmt и указатели на ф-ции раскрутки стека. Лучше считать КС от .text + .rdata предварительно вытащив импорт и сгенерировав переходники в IAT + если есть релоки, отнимать дельту для каждого фиксапа. Что еще может меняться в .rdata/.text?

вариант 2: вытащить из .pdb весь код/константы, построить таблицу блоков и по ним считать + релоки.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 09:40
· Личное сообщение · #2

LdrVerifyImageMatchesChecksum().



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 17 ноября 2011 09:48 · Поправил: HiEndsoft
· Личное сообщение · #3

считать ее из загруженого в память PE-хидера если она там не обнулена конечно
bowrouco пишет:
LdrVerifyImageMatchesChecksum().

дык там кажись файл нужен
может LdrVerifyMappedImageMatchesChecksum --> Link <--

-----
продавец резиновых утёнков





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

Создано: 17 ноября 2011 09:50
· Личное сообщение · #4

Внутри кода тоже вполне могут быть релоки. Особенно в х86.
Лучше скажи, зачем это нужно. Возможно, есть другие варианты.



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

Создано: 17 ноября 2011 09:53
· Личное сообщение · #5

HiEndsoft
Delphi не считает, ставит 0.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 10:04 · Поправил: bowrouco
· Личное сообщение · #6

HiEndsoft
Файл есть. Если не годно, тогда простое решение - релокация оригинального образа. Грузим копию через загрузчик и вычисляем контрсумму. Причём алго подсчёта должно пересчитывать дельту для фиксапов. Могу запилить код, 100WMZ.



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 17 ноября 2011 10:06
· Личное сообщение · #7

а если нет файла, если он например в теле криптора?
хотя хз что топикстартеру надо

-----
продавец резиновых утёнков




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

Создано: 17 ноября 2011 10:21
· Личное сообщение · #8

ТСу нужно знать изменили-ли поведение кода в рантайме. к примеру указатель в вмт, либо безусловный переход в какой-нить функции. Понятно, что можно, к примеру, поставить хв бряк и ничего в коде не менять.



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 17 ноября 2011 10:28 · Поправил: HiEndsoft
· Личное сообщение · #9

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

-----
продавец резиновых утёнков




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

Создано: 17 ноября 2011 11:00
· Личное сообщение · #10

да, извиняюсь. задача сводится к проверки целостности кода. Слабо представляю как такие проверки кроме сверки контрольной суммы/ЭЦП можно реализовать.

Касательно 1го способа. TLS обладает собственной секцией + там ничего интересного. языковые сепшены либо в .rdata, либо .pdata. Расурсы не интересуют. Экспорт/Импорт не меняеться. остается IAT и релоки. По релокам отнимаем дельту, для IAT генерируем jmp вне проверяемых секций + свой импортер. В принципе проверяемые секции можно и склеить, но аверы начнут кричать.

По 2му: вроде в .pdb есть вся необходимая информация, но a) размер таблиц проверяемых блоков может быть очень значительным b) нет опыта работы с .pdb




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 17 ноября 2011 11:07
· Личное сообщение · #11

0x90h
Может свести задачу к простому и сделать проверку критических участков кода а не лопатить всё подряд?

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


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

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

Создано: 17 ноября 2011 11:57
· Личное сообщение · #12

ClockMan
Непременно лучше, так и сделано. Но хотелось бы иметь готовый инструмент для своих задач.



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 17 ноября 2011 13:06
· Личное сообщение · #13

0x90h пишет:
Но хотелось бы иметь готовый инструмент для своих задач.

bowrouco пишет:
Могу запилить код, 100WMZ.




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 17 ноября 2011 19:57
· Личное сообщение · #14

crc1
Ну да, сделаю код за пиво. Обычно я не связан с оплатой, но эта задача не представляет интереса, а решение я знаю. Так как мне поступить.. Ясно что за деньги мы сделаем код.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 17 ноября 2011 20:10 · Поправил: Hexxx
· Личное сообщение · #15

0x90h
Проверяем контрольную сумму файла на диске. Сравниваем что не совпадает в образе в памяти и образе на диске. Проверяем какие несовпадения связаны с релоками. Проверяем чтобы импорты вели куда заявлено. Остальное - видимо хуки. Ну и еще нужно учитывать что бывают "легальные хуки", когда приложение само себя хучит. Ну и с хуками данных ничего сделать нельзя. И конечно упакованные файлы тоже так не проверишь.

-----
Реверсивная инженерия - написание кода идентичного натуральному


| Сообщение посчитали полезным: 0x90h, Dart Sergius


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 18 ноября 2011 05:39
· Личное сообщение · #16

Hexxx винда может патчить NtHeaders, для совместимости с 9x.

-----
Yann Tiersen best and do not fuck




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

Создано: 18 ноября 2011 07:56
· Личное сообщение · #17

PE_Kill пишет:
Hexxx винда может патчить NtHeaders, для совместимости с 9x.

Можно подробней, какая винда что патчит и при каких условиях?

-----
PGP key <0x1B6A24550F33E44A>





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

Создано: 18 ноября 2011 14:25
· Личное сообщение · #18

Килл в бане за нехорошие слова, просил отписать за него.

ntldr пишет:
Можно подробней, какая винда что патчит и при каких условиях?

Смотри сорсы Win2k. Win2000, WinXP точно патчат, остальные думаю тоже, легко проверить.

Сорсы:
Code:
  1. NTSTATUS
  2. MiCreateImageFileMap (
  3.     IN PFILE_OBJECT File,
  4.     OUT PSEGMENT *Segment
  5.     )
  6. ********
  7.         // Fix for Borland linker problem.  The SizeOfRawData can
  8.         // be a zero, but the PointerToRawData is not zero.
  9.         // Set it to zero.
  10.         //
  11.  
  12.         if (SectionTableEntry->SizeOfRawData == 0) {
  13.             SectionTableEntry->PointerToRawData = 0;
  14.         }


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

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

Создано: 18 ноября 2011 15:13
· Личное сообщение · #19

Archer
У тебя не будет парочки файлов с этим самым "Borland linker problem"? Надо бы потестить кое-что из моих проектов. На дельфевых прогах ничего подобного не замечал.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 392.8 (мудрец), 108thx
Активность: 0.260.01
Статус: Участник
REVENGE сила, БеХоЦе могила

Создано: 18 ноября 2011 15:23 · Поправил: Maximus
· Личное сообщение · #20

ntldr там же написано в чем проблема, смоделируй вручную на любом файле:

//The SizeOfRawData can be a zero, but the PointerToRawData is not zero.

-----
StarForce и Themida ацтой!




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

Создано: 18 ноября 2011 15:32
· Личное сообщение · #21

Maximus
Если поискать строку "Borland" по исходникам винды, находится не одно это место. Еще есть:

Code:
  1.  //
  2.         // If the OriginalFirstThunk field does not point inside the image, then ignore
  3.         // it.  This is will detect bogus Borland Linker 2.25 images that did not fill
  4.         // this field in.
  5.         //
  6.  
  7.         if (ImportDescriptor->Characteristics < NtHeaders->OptionalHeader.SizeOfHeaders ||
  8.             ImportDescriptor->Characteristics >= NtHeaders->OptionalHeader.SizeOfImage
  9.            ) {
  10.             OriginalThunk = Thunk;
  11.         } else {
  12.             OriginalThunk = (PIMAGE_THUNK_DATA)((ULONG_PTR)LdrDataTableEntry_Import->DllBase +
  13.                             ImportDescriptor->OriginalFirstThunk);
  14.         }

Code:
  1. //
  2.     // Increase stack size for Wx86Tib, which sits at the top of the stack.
  3.     //
  4.  
  5.     //
  6.     // x86 Borland C++ 4.1 (and perhaps other versions) Rudely assumes that
  7.     // it can use the top of the stack. Even tho this is completly bogus,
  8.     // leave some space on the top of the stack, to avoid problems.
  9.     //
  10.     SizeWx86Tib = sizeof(WX86TIB) + 16;

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

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 18 ноября 2011 16:20
· Личное сообщение · #22

Могу сказать, что Borland Linker 2.25 это Delphi 5 как минимум.




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

Создано: 18 ноября 2011 16:44
· Личное сообщение · #23

Попробуй Borland linker problem на этом файле, например http://rghost.ru/30818141
Что касается OriginalFirstThunk, многие так делают.
Ватком ещё забавные файлы генерит, где Virtual Size везде 0.



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

Создано: 18 ноября 2011 19:11
· Личное сообщение · #24

Hexxx пишет:
упакованные файлы тоже так не проверишь

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

Archer
пустые секции не интересны - там кода нет. tls , на сколько мне известно, вообще пустая секция в памяти заполняемая tls_index`ами загрузчиком. NT_HDR аналогично, код не содержит.
Если VirtSize == 0 и RawSize == 0, образ не валидный.

ntldr
Давно известная проблема. В моем случае не актуально, борлендом никто не пользуется.


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


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