Конференция "Прочее" » Нужна вычитка статьи
 
  • Rouse_ © (28.02.16 01:13) [40]
    Да нормально, как мне статью то править, если я все мнения со стороны не услышу? Не для себя ж пишу :)
  • Германн © (28.02.16 01:25) [41]
    Ну тогда извини, что техническую часть я даже не читал. :(
  • NoUser © (28.02.16 23:59) [42]
    DWORD-ы в примерах (при работе с адресами) было бы поучительно (дженерики то внедрил) заменить на Pointer и/или IntPtr/UIntPtr.

    Тогда вместо, возможно ошибочного,
    '(плюс 2 дворда что в 32 битном, что в 64 битном варианте)'
    два слова сказать про отличия указателей в x64 и заменить '4' на
    const cbPtr = SizeOf(Pointer/IntPtr) ;)



    PS.
    В тексте многовато 'но' - можно попробовать заменить на 'а', 'и', 'а вот'  или просто убрать,
    но )) это так, - косметика.

    << Но_ это в Visual Studio, а вот в Дельфи такого сделать так сходу нельзя - не умеет она, но!!!
    Но_ есть небольшой трюк, связанный с тем что разработчики компилера_ Дельфи, уж не знаю по каким причинам, но_ немного нам помогли, создав неинициализированную TLS секцию в исполняемом файле. С какого времени это началось - я не знаю, но_ начиная … >>

    << то мы инициализирует_ ее >>
    << убиваем_ ее значение  >>

    PPS.
    http://pritchi.castle.by/ras-013-402.html (http://static2.ozone.ru/multimedia/books_covers/1007045216.jpg)
  • Rouse_ © (29.02.16 13:38) [43]

    > Тогда вместо, возможно ошибочного,
    > '(плюс 2 дворда что в 32 битном, что в 64 битном варианте)'
    > два слова сказать про отличия указателей в x64 и заменить
    > '4' на
    > const cbPtr = SizeOf(Pointer/IntPtr) ;)

    Нет тут код не ошибочный (2 дворда в структуре идет последними в обоих вариантах)

     _IMAGE_TLS_DIRECTORY64 = record
       StartAddressOfRawData: ULONGLONG;
       EndAddressOfRawData: ULONGLONG;
       AddressOfIndex: ULONGLONG;         // PDWORD
       AddressOfCallBacks: ULONGLONG;     // PIMAGE_TLS_CALLBACK *;
       SizeOfZeroFill: DWORD;
       Characteristics: DWORD;
     end;

     _IMAGE_TLS_DIRECTORY32 = record
       StartAddressOfRawData: DWORD;
       EndAddressOfRawData: DWORD;
       AddressOfIndex: DWORD;         // PDWORD
       AddressOfCallBacks: DWORD;     // PIMAGE_TLS_CALLBACK *;
       SizeOfZeroFill: DWORD;
       Characteristics: DWORD;
     end;


    А про указатели - для демо достаточно и такого, нельзя же все выкладывать на блюдечке с голубой каемкой, человек и сам должен немного мозг включить прежде чем использовать сторонний код.
    По остальному вечером попричесываю тем более тут один нюансик вскрылся, который придется подправить.
  • Rouse_ © (29.02.16 14:57) [44]
    Ну вроде как причесал - если за вечер никто ничего не найдет, завтра тогда на паблик выложу
  • Тимохов Дима © (29.02.16 15:06) [45]
    Прочитал. Идейно понятно.

    Чисто философский вопрос.

    Реверсер же сразу поймет при следующем запуске, что его пытаются обхитрить.
    Неужели он не найдет управу? Да хоть дампы в Parallels Desktop сделать с уже запущенной программой.

    Суть вопроса стоит ли делать подобную защиту (у реверсера же наверняка рука набита на противодействии таким трюкам)?
  • Rouse_ © (29.02.16 16:06) [46]

    > Тимохов Дима ©   (29.02.16 15:06) [45]
    > Реверсер же сразу поймет при следующем запуске, что его
    > пытаются обхитрить.

    Конечно поймет.


    > Неужели он не найдет управу? Да хоть дампы в Parallels Desktop
    > сделать с уже запущенной программой.
    >
    > Суть вопроса стоит ли делать подобную защиту (у реверсера
    > же наверняка рука набита на противодействии таким трюкам)?
    >

    Если код защиты под виртуальной машиной - очень долго искать придется.

    А так вообще - тут же только сам принцип, на практике антидамп в разы сложнее делается :)
  • Тимохов Дима © (29.02.16 16:29) [47]

    > А так вообще - тут же только сам принцип, на практике антидамп
    > в разы сложнее делается :)


    Не, ну все же чем Parallels тебе не нравится?
    Запустил, снял дамп, потом сколько хочешь восстанавливай.
    Ты же защищается от повторного запуска по снятому дампу. А тут и запуска не будет повторного.

    Я не в части критики, просто интересно.
    Я то в свое время поставил на виртуальную машину (чужую), которую натравил на некую свою виртуальную машину. Расчет на то - задолбаются 100мб мусора фильтровать.
    Может, обновляться придется. Вот, думаю - надо ли мне это.

    ЗЫ Саш, извиняй плз за оффтоп))
  • Rouse_ © (29.02.16 16:47) [48]

    > Тимохов Дима ©   (29.02.16 16:29) [47]
    > Не, ну все же чем Parallels тебе не нравится?
    > Запустил, снял дамп, потом сколько хочешь восстанавливай.

    Понятно - статью ты не читал, там описано почему нужно делать дамп :)
  • Тимохов Дима © (29.02.16 17:03) [49]

    > Понятно - статью ты не читал, там описано почему нужно делать
    > дамп :)

    Читал. Я все понял)) Правда.
    Я ж тебе говорю - запускаешь программу под виртуалкой, она распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с уже правильными "секретным числом".
    Потом из дампа сколько хочешь раз восстанавливай и работай - программа то уже запущена.
  • Rouse_ © (29.02.16 17:27) [50]

    > Тимохов Дима ©   (29.02.16 17:03) [49]
    > Читал. Я все понял)) Правда.
    > Я ж тебе говорю - запускаешь программу под виртуалкой, она
    > распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с
    > уже правильными "секретным числом".
    > Потом из дампа сколько хочешь раз восстанавливай и работай
    > - программа то уже запущена.

    Значит читал но не понял - там в BIN лежит экзешник - сдампь и запусти :)
  • Rouse_ © (29.02.16 17:31) [51]
    Можешь просто последнюю гифку посмотреть в статье - там показанно что будет и как работает "секретное число" :) (Напомню - при старте оно должно быть равно нулю, иначе никакого фокуса не получится :)
  • virex(home) © (01.03.16 07:59) [52]
    // сам колбэк
    VOID NTAPI tls_callback(HMODULE hModule,
    DWORD  ul_reason_for_call,LPVOID lpReserved)
    {
    MessageBox(0, L"TLS Callback Message", L"", 0);
    }
    на скрине MyTLS Callback Message
  • virex(home) © (01.03.16 08:14) [53]
    Writeln('Какая-то бяда в GetSectionDataList.');

    з.ы. "мясной рулет с черносливом" атмосферней будет
  • Rouse_ © (01.03.16 18:34) [54]

    > virex(home) ©

    Угу, код поправлял - картинка старая осталась. А с исключениями - ну ща ченить нормальное напишу, они там вообще по факту не сильно и нужны.
  • Rouse_ © (01.03.16 19:18) [55]
    Ну вроде все - всем спасибо, резная версия тут (правленные исходники там-же)

    http://alexander-bagel.blogspot.ru/2016/03/early-execution.html
  • Rouse_ © (01.03.16 19:30) [56]
    Блин, ребята с http://delphifeeds.ru/ меня убьют :)))
    Забыл CAT поставить и к ним в новостную ленту статья целиком залилась, вместо шапки - бггг, ппц :)
    Тот еще натюрморт :)))
  • Rouse_ © (01.03.16 19:33) [57]
    А, не - все поправили, оперативно работают - респект :)
  • Тимохов Дима © (02.03.16 10:59) [58]

    > Rouse_ ©   (29.02.16 17:31) [51]
    > Можешь просто последнюю гифку посмотреть в статье - там
    > показанно что будет и как работает "секретное число" :)
    > (Напомню - при старте оно должно быть равно нулю, иначе
    > никакого фокуса не получится :)


    Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).

    Еще раз.

    Чего ты добиваешься?

    Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии:
    1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код!
    2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной.
    3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной).
    4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2).
    5. В итоге программа не работает.
    6. Реверсер матерясь убивает себя об стену.

    Но реверес мог читать твою статью и не делать шаг 3.
    Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой.
    После чего он может восстанавливать ситуацию из snapshot'а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.

    Ну как-то так)))

    И где я не прав?
  • Тимохов Дима © (02.03.16 10:59) [59]

    > Rouse_ ©   (29.02.16 17:31) [51]
    > Можешь просто последнюю гифку посмотреть в статье - там
    > показанно что будет и как работает "секретное число" :)
    > (Напомню - при старте оно должно быть равно нулю, иначе
    > никакого фокуса не получится :)


    Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).

    Еще раз.

    Чего ты добиваешься?

    Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии:
    1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код!
    2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной.
    3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной).
    4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2).
    5. В итоге программа не работает.
    6. Реверсер матерясь убивает себя об стену.

    Но реверес мог читать твою статью и не делать шаг 3.
    Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой.
    После чего он может восстанавливать ситуацию из snapshot'а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.

    Ну как-то так)))

    И где я не прав?
 
Конференция "Прочее" » Нужна вычитка статьи
Есть новые Нет новых   [134434   +27][b:0][p:0.001]