Кто подсчитывал контрольную сумму образа файла с помощью вот этого?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 5 фев 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    http://www.wasm.ru/article.php?article=green2red02#_Toc100906478
    Там приведён исходный текст функции CheckSumMappedFile, по её завершении в регистре EAX исходная сумма. Слов нет, разобраться непросто, да ни от кого это и не требуется. Просто скажите, кто знает, ошибочный это алгоритм или нет.

    Но всё же на некоторые э... несоответсвия я не могу не указать.

    1) Натыкаемся в исходнике на строку
    Код (Text):
    1. mov ecx,dword ptr [eax].e_lfanew
    Смотрим в OllyDbg, что бы это значило. Видим
    Код (Text):
    1. MOV ECX,DWORD PTR DS:[EAX+3C]
    Угу. Смотрим там же значение EAX. Оно равно нулю. То есть процессор должен по считать с адреса 3C число типа DWORD и переслать его в регистр ECX. Всё бы ничего, но программа загружается начиная с адреса 400000, адреса 3C просто нет!
    Неудивительно поэтому, что в отладчике программа на этом месте стопорится.

    Ладно, я допускаю мысль, что иногда программа всё же заружается по адресу 0 и исходник писан именно для таких разов. Жму плечами и вручную переписываю (приготовившись отследить все подобные случаи). Получается.

    Код (Text):
    1. MOV ECX,DWORD PTR DS:[400000+3C]
    Жму на F9

    2) Дальше ещё интереснее. Читаем в исходнике

    Код (Text):
    1. add   esi, 00000058h
    2.         mov   edx, 00000001h
    3.         mov   eax, dword ptr [esi]
    ...То есть используется адрес 58. Я бы и здесь заменил его на 400058, но, думаю, дай-ка посмотрю, что по этому адресу находится. Посмотрел. Во всех исполняемых файлах по этому адресу находится такая вот строка

    Код (Text):
    1. am cannot be run in DOS mode
    Ну, то есть в DOS-MZзаголовках присутствует строка This program cannot be run in DOS mode. И почему-то адрес середины этой строки кладётся в esi, потом в eax и так далее. Я не стал дальше разбираться, какой интерес представляет адрес середины стоки, а решил спросить у вас, что вы знаете про этот исходник и стоит ли его использовать. Спасибо
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    тема - бред.
    просто файл не маппируется из-за жеско защитого имени файла в переменной Name1.
    советую сначала изучить матчасть, в том числе ассемблер, вызовы WinAPI, структуру PE.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А я что по-Вашему делаю, как не изучаю структуру PE? Статья-то как называется?
    "Формат исполняемого файла ОС Windows. PE32 и PE64"

    Но как бы то ни было- дело в исходнике, получается? Странно.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    n0name
    Автору не мешало бы сделать проверку на то, что файл не открылся.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Не знаю я.
    Есть функция, передаём ей параметры, на выходе (в EAX) должны быть искомые данные. Что не так?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    amvoz
    Найди в исходнике строку - Name1 db "C:\\kernel32.dll",0
    И замени "C:\\kernel32.dll", на имя файла, сумму которого тебе надо найти.
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Для этого файла мне надо найти. kernel32.dll

    Более того, полезно будет найти сумму именно этого файла, а не какого-нибудь другого. Потому, что она отображается (должна быть корректной, так в той же статье написано) в соответствующем поле опционального заголовка. Я смогу сравнить эти 2 цифры (значение EAX и IMAGE_OPTIONAL_HEADER.CheckSum ) и делать выводы.

    А если я предложенным Вами способом найду сумму какого-нибудь простенького экзешника... Как я буду знать, что она верна, что я не ошибся, если мне её не с чем сравнить? В соответствующем поле опционального заголовка может быть всё, что угодно.

    Да так оно и есть, у меня вот нули стоят для некоторых экзешников. Для CRACKME.EXE того же
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ё моё, ну так исправь на это:
    C:\WINDOWS\system32\kernel32.dll
     
  9. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да... Моя вина, я не сказал. Я конечно же пути к файлам все свои указываю. Эта замена, про которую Вы говорите, несомненно, произведена. Давно.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тогда исправь на "kernel32.dll". И положи её в папку с прогой.
     
  11. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Просто скопируй файл kernel32.dll из системного каталога в корневой каталог диска C:

    И вобще исходник в студию...
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я положил в папку с OllyDbg.exe
    Зря старался только.
    Расчётная сумма оказалась равной 4100E8, а в MAGE_OPTIONAL_HEADER.CheckSum одни нули... Зря я пыхтел, получается... Выходит, загрузчик это поле не проверяет... Опять не с чем ни сравнить. Попробую ещё потом функцию, встроенную в Windows...

    Да там тоже формулировочка, знаете ли
    "Контрольная сумма образа файла. Для обычных исполняемых файлов контрольная сумма не проверяется, т.е. может быть любой. Если она нулевая, то она тоже может быть любой."

    Спасибо, что... А исходник вот он, где-то посредине страницы. Там и пояснения к нему. Могу переоформить, кому надо... Он длинный, его трудно не заметить. Называется "Реализация собственной функции CheckSumMappedFile" Там кроме всего прочего нужно свои пути к файлам прописать... Это в инклудах и в библотеках...
    От зелёного к красному.
     
  13. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    amvoz
    Я говорил про твой исходник, потому что ты 100% там напортачил...
    Да, и учение матчасти еще никому не повредило...
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я и учу.
    Начну я того же Крупника учить- нет-нет, да скажет кто-нибудь- изучай формат PE-файлов. Так что я ошибусь в любом случае, с чего бы не начинал.
    Моего исходника нет. Если моим не считать представленный с такими вот исправлениями:

    Код (Text):
    1. include C:\masm32\include\windows.inc
    2. includelib C:\masm32\lib\kernel32.lib
    3. include C:\masm32\include\kernel32.inc
    4. .data
    5.     hFile dd 0
    6.     hMapping dd 0
    7.     hMap dd 0
    8.     Name1 db "kernel32.dll",0
    9.     HeaderSum dd 0fffh
    10.     CheckSum dd 0
    Я всего-навсего прописал свои абсолютные пути к файлам и изменил NAME 1

    Теперь внимание! Вопрос возник другой! Неужели загрузчик и вправду не проверяет это поля и оно вопреки (!) автору может быть любым? Мне это очень странно, думаю и вам тоже. Оно у вас всех должно находиться по адресу 400102, размер DWORD- проверьте, кому интересно, там одни нули! А по автору "Для всех системных DLLдолжна быть корректная" Если бы не этот факт, стал бы я разве возиться? Любая да любая...
    Любая.
     
  15. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    amvoz
    Не важно загрузчику значение этого поля, его можно смело выставлять в 0.

    Вот ты сначала пишешь:
    Потом пишешь:
    Положить его надо в папку с программой, или прописать абсолютный путь.
    И смотри, что возвращают API функции. CreateFile должна возвратить хендл файла, если возвращает INVALID_HANDLE_VALUE, значит вызов неудачен. CreateFileMapping должна возвращать отличное от 0 значение. MapViewOfFile должна возвратить указатель на спроецированный файл (по адресу, возвращенному MapViewOfFile должны располагаться байты "MZ"...), если возвращает 0, значит вызов неудачен.
    Если неудачен вызов любой из этих функций, то бесполезно трассировать дальше...
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Всё верно, в папке OllyDbg лежат файлы: OllyDbg.exe kernel32.dll CheckSumMappedFile.exe

    Возвращаемые значения последовательно: 10, 1С, адрес MZP (410000)... При чём вот что интересно: этот адрес в OllyDbg открывается только по вызову MapViewOfFile! Но я не спрашиваю "Почему?" ибо это выходит за рамки нашей беседы.
    ...А вообще то, что я нашёл- 4100E8 (якобы найденная контрольная сумма)- бред. Это адрес сигнатуры PE. Но этот адрес содержится в EAX по выходу из CheckSumMappedFile (в этом месте по автору должна быть сумма). Вот в скриншоте всё видно. И где произошла остановка, и что находится в EAX и что находится по адресу, находящемуся в EAX. Потом ещё поразбираюсь.

    http://rapidshare.ru/916267
    Это скриншот. Что-то он большой (3,8 мегабайт) и скачивается долго. Ну, кому интересно, тот посмотрит.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    если это так уж важно чтобы проверить работоспособность того исходника, то чексуму можно проверить с помощью PETools.