Как стать автором
Обновить

Комментарии 48

потрясающе! использование таких методов хотя бы в части функционала (например, кодирование импортируемых функций при динамическом импорте) уже приведет к путанице реверсера (:

спасибо за статью, очень интересно!
Думаю, реверсер даже не заметит подмены. Ему-то в отладчике всё равно смотреть в эти байтики во всех возможных представлениях. Увидев что-то похожее на текст, он моментально переключится в режим отображения ASCII-символами и будет прав.
НЛО прилетело и опубликовало эту надпись здесь
Вы не учли возможность операций с числами. Синус там, косинус, интеграл…
Я предлагаю так писать финансовое ПО (щютка).
Вас уже заждались в команде разработчиков ProGuard :D
вот что бывает, когда программистам скучно :-D
C#
Console.WriteLine(
(new List {279544143478566788, 8437057322050937631})
.Aggregate("", (s, x) =>
{while(x>0){s=((x%34==33)?' ':(char)(x%34-1+'а'))+s;x/=34;}return s;}));
Патч Бармина?
Отлично) только List<long>
да правильно, там дженерик хабрапарсер съел
C#, для разнообразия на лямбде
Func〈ulong, string〉 f = null;
f=(n)=>""+((n==0)?"":f(n/34)+((n%34==33)?' ':(char)(n%34-1+'а')));
ulong[]code={814315,1196087757209127883,1402407386743198646,8253365425410800148};
Console.WriteLine(code.Aggregate("", (s, x) => f(x) + s));
Один раз действительно использовал похожее в курсовой работе, только там строчка была побольше, поэтому пришлось использовать массив чисел, к элементам которого применялись дополнительные преобразования
int A = 2037539149;
Бил бы ногами за несоблюдение диапазона…
long A должно быть, верно?
На *некоторых* платформах диапазон соблюдается. :P
Пусть соблюдаются, я не против. Но использование стандартов (наличие return'ов в функции не исключение) очень желательно, когда не идёт привязка к конкретному компилятору.
gcc — не конкретный компилятор?
Специально, чтобы сохранить свою драгоценную шкурку, написала disclaimer; у меня int такого размера.
Извиняюсь, забылся. Вопрос исчерпан.
По первому варианту: нет гарантии, что в АП процесса сразу после переменной A в стеке будут нули. Поэтому, в более общем случае в long (32-битный) можно поместить до 3 символов (включительно) плюс завершающий NULL. В 64-битный — до 7 (также включительно).
Вот уж не знал)))) Прикольно так над копирастами издеваются))))
Monolith (в статье «Незаконное число» упоминается, monolith.sourceforge.net/) — «коза» в адрес правообладателей.
Никогда и в мыслях не было, так подписываться :)
int A = 2037539149;
printf((char *)&A);


А откуда берется нолик в конце? O_O
У меня там вообще «Maryx (».
Соглашусь с более ранним комментарием — нет символа конца строки, поэтому выводится что-то из-за пределов переменной.
Ограничение этого метода — он выводит слова длиной до 4 букв, больше в int не поместится. 8 букв можно получить, если заменить int на unsigned long long:


Тогда, видимо, это утверждение неверно?
Ну почему же? Заявленные 4 и 8 букв выводятся. Иногда больше, но уж никак не меньше :-)
Тоесть access violation вас не смущает? :)
Не очень. Эти приемы заведомо нельзя использовать в реальной разработке (помните о читающим ваш код маньяке, который знает, где вы живете?), поэтому их побочные эффекты принципиального значения не имеют.
Это уже от машины зависит — если 64-битная платформа с соответствующим компилятором и little-endian, то int это 8 байт, и нолики там найдутся в старших разрядах
А вот с переносимостью такого кода — фигня-с™
В общем на самом деле уровень чисто школьный))))) мы как раз этим в школе баловались чтобы лучше понять суть строк ;)
НЛО прилетело и опубликовало эту надпись здесь
Объясните, пожалуйста, непросвещенному, как из 0x7972614D получается 2037539149.
Спасибо!
Первое — шестнадцатеричная запись, вторая — десятичная.
Эх… Мне стыдно…
пользователи ARM'а и SPARC v9 не одобряют этот пост!
пользователи MIPS одобряют.
у ARM endianness настраивается. У моего арма так вообще с интеловским порядком совпадает.
Напомнило преобразование ip адреса в число, тоже можно вставить в подпись.
НЛО прилетело и опубликовало эту надпись здесь
Ну да, ник тоже подбирать удобно :-)
Нулевой байт в конце строки и правда как-то упущен. зато при некоторых компиляторах и их параметрах можно использовать ситуацию когда переменные располагаются в памяти подряд:
int A = 2037539149;
int B = 2037539149;
int C = 0;
printf((char *)&A);
например такая махинация у меня (gcc 4.4.5, x86, опции по-умолчанию) вывела «MaryMary»
ну или просто массив определить, но это уже как-то слишком банально
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории