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

Тема в разделе "WASM.RESEARCH", создана пользователем Alastor, 11 окт 2011.

  1. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Доброго времени всем, столкнулся с такой вот проблемой - препод, дал задание дизасмить программу, написанную им - найти и затереть в ней команду на преждевременное закрытие программы. Проблем нет - справился (затер функцию KERNEL32.ExitProcess)

    теперь та же цель, но только необходимо сделать это без модификации кода. подскажите хотя бы откуда начинать копать?

    проект dasm32 в архиве.
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Alastor
    импорт..
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alastor
    А прикладывать нужно бинарник, а не нерабочие файлы проекта дизассемблера, изжившего себя лет десять назад.
     
  4. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Вы имеете ввиду импорт библиотек??? Каких?


    Прикрепляю исполняемый файл.
     
  5. rozarom

    rozarom New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2011
    Сообщения:
    56
    импорт в ПЕ файле покалечить кто-то имеет в виду.
     
  6. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    не думаю что это может быть так, поскольку дается не тронутый исполняемый файл, для запуска которого необходимо создание внешних условий.


    думаю что нужно добавить какие-то DLL. Остается вопрос - какие???
    Код (Text):
    1. .text:00401000                 ;org 401000h
    2. .text:00401000                 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
    3. .text:00401000                 push    ebp
    4. .text:00401001                 mov     ebp, esp
    5. .text:00401003                 push    0FFFFFFFFh
    6. .text:00401005                 push    offset unknown_libname_3 ; MFC 3.1/4.0/4.2/8.0 32bit
    7. .text:0040100A                 mov     eax, large fs:0
    8. .text:00401010                 push    eax
    9. .text:00401011                 mov     large fs:0, esp
    10. .text:00401018                 sub     esp, 0Ch
    11. .text:0040101B                 push    0C8h
    12. .text:00401020                 call    sub_401180
    13. .text:00401025                 mov     [ebp-14h], eax
    14. .text:00401028                 mov     dword ptr [ebp-4], 0
    15. .text:0040102F                 cmp     dword ptr [ebp-14h], 0
    16. .text:00401033                 jz      short loc_401042
    17. .text:00401035                 mov     ecx, [ebp-14h]
    18. .text:00401038                 call    ??0_AFX_OLE_STATE@@QAE@XZ ; _AFX_OLE_STATE::_AFX_OLE_STATE(void)
    19. .text:0040103D                 mov     [ebp-18h], eax
    20. .text:00401040                 jmp     short loc_401049
    кто-нибудь может подсказать чего требует данная строка?

    .text:00401038 call ??0_AFX_OLE_STATE@@QAE@XZ ; _AFX_OLE_STATE::_AFX_OLE_STATE
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alastor
    Именно так. Предлагается, например, заменить импорт ExitProcess на импорт безобидной CloseHandle. И число символов такое же, и параметр тоже один, и при вызове с нулём ничего страшного не произойдёт.
     
  8. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    но напоминаю, что втором варианте к сожалению любая модификация кода запрещена. требование - создание внешних условий.


    l_inc, можете рассказать подробнее про возможность импорта без изменения кода.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alastor
    А строка в директории импорта — это не код. Это данные.
     
  10. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    l_inc
    Можно тогда у секции .text атрибут CODE снять, и она тоже станет данные содержать.
    Думаю, всё же, имелось в виду, что файл патчить нельзя и память тоже.
     
  11. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    l_inc, замена ничего не дала.

    Как без изменения программного кода отключить исползование библиотеки KERNEL32 ???
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ezrah
    Я под кодом понимаю то, что исполняется или может исполняться процессором. И атрибут CODE здесь не причём. Если же имеется в виду, что нельзя изменять образ вообще никак, то...
    Alastor
    Ну создайте reg-файлик со следующим содержимым:
    Код (Text):
    1. REGEDIT4
    2.  
    3. [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Banned]
    4. "NUMX"=dword:00000001
    и запустите его. Тогда программа будет обходить вызов ExitProcess.
    "Это невозможно". © Полицейский. Матрица.
     
  13. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    l_inc наверное я что-то не так делал. я через IDA заменил в NAMES ExitProcess на CloseHandle :O

    (не судите строго с инструментом не знаком, ровно как с дизассемблированием тоже. начинающий энтузиаст)


    совет с прописыванием бана в реестр - помог. можно подробнее про сам процесс бана. я так понял что данная запись запрещает запуск API ExitProcess?
     
  14. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    почему имя создаваемой в реестре записиси должно быть NUMX??? С другим именем нет эффекта.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alastor
    Не. Откройте в любом HEX-редакторе образ. Найдите поиском строку ExitProcess (она там всего одна прямо в директории импорта) и впишите поверх этой строки CloseHandle. Не забудьте сохранить изменения.
    :) Мысль, конечно, весёлая, но нет. Такого ключа в реестре не существует. Если Вы посмотрите на код чуть по-внимательнее, то заметите условный переход перед вызовом ExitProcess.
    Код (Text):
    1. Address   Command                                         Comments
    2. 004013ED  CMP DWORD PTR SS:[LOCAL.4],0
    3. 004013F1  JNE SHORT 004013FB
    4. 004013F3  PUSH 0                                          ; /ExitCode = 0
    5. 004013F5  CALL DWORD PTR DS:[<&KERNEL32.ExitProcess>]     ; \KERNEL32.ExitProcess
    6. 004013FB  MOV DWORD PTR SS:[LOCAL.23],1
    Как видно, проверяется значение локальной переменной на нуль. Сама локальная переменная заполняется при вызове RegQueryValueEx чуть выше по коду. Так вот она и читает значение NUMX в ключе Banned. Соответственно, если это значение будет присутствовать в реестре и иметь ненулевое значение, то вызов ExitProcess будет обходиться вышеупомянутым условным переходом.
     
  16. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Alastor
    импорт это не код. можете еще запустить эту прогу из под лоадера и запустив ее в суспендед состоянии изменить ей адрес перехода на ExitProcess в импорте на что нибудь другое. только прога все равно рухнет, тк предполагается, что поток из ExitProcess не выйдет

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

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    l_inc, чем открывали мой exe? у меня через dasm и ida мнемоника немного отличается, трудно сопоставить ваше объяснение и то что у меня на экране.
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alastor
    OllyDbg. Удобнее всего для беглого просмотра файла, если тот не представляет угрозы.

    Странно, что трудно сопоставить. Где ExitProcess вызывается, я полагаю, Вы нашли в IDA (если нет, то на вкладке imports двойной щелчок на ExitProcess, потом в коде ставите курсор на ExitProcess и жмёте x, после чего двойной щелчок на любую из двух строк в появившемся окошке).
    Чуть выше по коду найдёте следующие строки:
    Код (Text):
    1. .text:00401361                 lea     eax, [ebp+hKey]
    2. .text:00401364                 push    eax             ; phkResult
    3. .text:00401365                 push    offset SubKey   ; "Software\\Microsoft\\Windows\\Banned"
    4. .text:0040136A                 push    80000001h       ; hKey
    5. .text:0040136F                 call    ds:RegOpenKeyW
    Здесь открывается ключик. Сразу за этим считывается значение.
     
  19. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    что он конкретно понимает под этим хитровы*банный препод не уточнил :-D
    - лоадер
    - минидебагер
    - подмена дллки
    но все сводиться в итоге к модификации нужного куска памяти проги
     
  20. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    i_inc - огромное спасибо! :) много чего полезного узнал и радует сам факт выполненного задания. правда придется сказать что не самостоятельно :).

    что можете посоветовать полезного для прочтения, дабы развиться в IDA? (само собой мануал и руки с головой в первую очередь) :) а так же полезного по дизассемблированию.