Какой самый крутой взлом вы видели или делали?

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

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

Какой самый крутой аппаратный или программный взлом вы лично видели или делали? Над каким хаком вы сейчас работаете?


person Community    schedule 10.10.2008    source источник


Ответы (43)


Я помню, что этот хак был написан Бобом Смитом, который сделал старый менеджер памяти эпохи DOS под названием 386MAX (или «386 для Макса»). Это не было частью продукта, это была небольшая служебная программа, которую он состряпал и где-то разместил. Однако в Интернете единственное упоминание об этом методе, которое я могу найти, — это недокументированный уголок DDJ. колонка Роберта Коллинза ноябрь 1996 г..

Проблема

До того, как корпорация Intel представила инструкцию CPUID, было сложно проверить точный тип и уровни версии ЦП в вашей системе. Оказывается, в большинстве версий 386 и выше идентификатор процессора действительно был, но он был виден только в одно конкретное время: сразу после сброса процессора в регистре EDX. (Предполагалось, что BIOS компьютера будет единственным программным обеспечением, законно заинтересованным в этом).

Проблема: как нормальной программе получить значение этого регистра, если мы не биос?

Справочный материал

Этот взлом основывался на шести отличительных особенностях компьютеров, совместимых с IBM PC. Они были следующими:

  1. Начиная с IBM AT и более поздних версий, существует способ независимо отключать адресную строку A20 на автобус.
  2. Большинство компьютеров не имеют оперативной памяти, установленной по очень старшим адресам памяти чуть ниже ПЗУ BIOS.
  3. Большинство компьютеров с шиной IBM PC возвращают 0xFF, когда вы читаете область памяти, в которой не установлена ​​память.
  4. 0xFF 0xFF 0xFF и т. д. — недопустимый код операции на процессорах Intel.
  5. Если вы установите обработчик исключений в память, он выдержит мягкую перезагрузку на большинстве процессоров этой эпохи (с 386 по 486).
  6. При программном или аппаратном сбросе процессоры Intel переходят на адрес, который находится вверху адресуемой памяти, минус 16 байт, поэтому ПЗУ BIOS помещается туда.

Программа объединила знания всех этих мелочей для достижения цели.

Взлом

Результатом стала программа командной строки DOS, которая делала следующее:

  • Установлен недопустимый обработчик исключений кода операции.
  • Отключил адресную линию А20 в автобусе
  • Мягко перезагрузил процессор (я думаю, это было через вызов BIOS)

Когда происходила мягкая перезагрузка, процессор пытался перейти к верхней части памяти минус 16 байт, где находится код запуска ПЗУ. Однако, поскольку A20 был отключен, он фактически перешел бы к началу памяти минус 16 байт минус один мегабайт. На большинстве ПК нет оперативной памяти. Таким образом, он извлечет серию байтов 0xFF из этой несуществующей оперативной памяти и попытается выполнить ее. Это создаст исключение недопустимого кода операции.

Затем его обработчик исключений извлекает значение EDX (CPUID) и прячет его где-нибудь, где он может его найти. Затем он наведет порядок (снова включит A20, переключится из защищенного режима в реальный режим для DOS) и вернет управление исходному коду.

Когда это работало, это было гениально. Вуаля, вот простая DOS-программа из командной строки, которая даст вам значение CPUID.

Конечно, неизбежно были ПК, которые были «не совсем совместимы», которые ужасно зависали, когда вы запускали это. Ах хорошо.

person Tim Farley    schedule 10.10.2008
comment
Я работал над All Computers All Charge 386, небольшой платой, которая позволяла подключать 386SX к разъему 286, чтобы пользователи OS2 + Windows могли использовать расширенную память. Я работал над новым устройством с собственными часами процессора и встроенной оперативной памятью. - person Diodeus - James MacFarlane; 10.10.2008

обратный квадратный корень quake3 и переключатель MIT Magic/More Magic обычно составляют эти списки.

person Tom Ritter    schedule 10.10.2008
comment
Этот аппроксимационный хак Ньютона крут. - person Bob King; 10.10.2008
comment
И просто для удовольствия, потрясающая история о попытках найти того, кто написал эту функцию обратного квадратного корня: beyond3d .com/content/articles/8 - person koni; 30.03.2010
comment
Мы до сих пор не знаем, кто это придумал - person BlueRaja - Danny Pflughoeft; 28.04.2010

Ну, это не самое крутое, но точно смешное (программистам).

Мы создали специальный построитель запросов для проекта базы данных резюме. В нем были некоторые элементы ajax, и основная идея заключалась в том, что если вы изменяете что-либо на странице, поиск автоматически перезапускается. (Это было вызвано событием onBlur всех виджетов пользовательского интерфейса)

Таким образом, мы не использовали кнопку «Поиск» или «Выполнить запрос». Это окончательно запутало пользователей. Поэтому мы добавили кнопку поиска, которая ничего не делала. Он просто сидел там.

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

Это сделало нашу пользовательскую базу очень счастливой. Простые вещи.

person Zachary Yates    schedule 10.10.2008
comment
Честно говоря, я бы тоже был сбит с толку, если бы мне пришлось нажимать вкладку (или щелкать вне поля редактирования) вместо ввода, чтобы делать такие вещи, как активировать поиск. - person J c; 19.11.2008
comment
Вот почему мы изменили его! ;) (Нажатие ввода сработало) - person Zachary Yates; 24.11.2008
comment
особенно если вы просто хотели обновить текущий поиск - person 1800 INFORMATION; 04.02.2009

Это не был хак, который я сделал, а кто-то, с кем я работал давным-давно, рассказал мне об этом (он действительно сделал хак).

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

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

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

person Ferruccio    schedule 10.10.2008
comment
это было круто по трем причинам: - текст в шрифт Брайля - перевернутый шрифт Брайля - однократное чтение. - person Irwin; 20.05.2009
comment
Это сообщение самоуничтожится через...сейчас. - person LeopardSkinPillBoxHat; 03.03.2010

Работая над реинжинирингом iPhone, я обнаружил уязвимость в основной полосе частот (микросхеме, отвечающей за телефонию и привязку оператора связи), которая позволяла вам произвольно записывать нули. Хотя поначалу это казалось бесполезным, вскоре стало очевидно, что это может сделать гораздо больше, чем я изначально думал. С тем, как работает ARM, некоторые переходы могут быть аннулированы путем записи одного нуля в цель, в результате чего путь выполнения всегда продолжается вперед. Это позволило разблокировать программное обеспечение, но было быстро заменено более надежным взломом, который позволил вам полностью перепрошить основную полосу.

До сих пор чертовски горжусь этим взломом, несмотря на его бесполезность сейчас.

person Serafina Brocious    schedule 10.10.2008
comment
Я не думаю, что вы знаете, насколько такой хак помог таким людям, как я, живущим в странах, где мы могли сначала получить айфоны :) - person mslot; 02.11.2008

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

person Diodeus - James MacFarlane    schedule 10.10.2008
comment
+1 за умный выход из того, что я считаю скучным классом. - person MatrixFrog; 03.03.2010
comment
Что такое divide-by-eight counter? - person Omar; 01.03.2011

Это такая тривиальная вещь, но когда я впервые увидел этот код (от моего коллеги-разработчика), я был шокирован, потому что это то, о чем я никогда не подумал (комментарии добавлены мной):

cglobal x264_sub8x8_dct_sse2, 3,3  ;3,3 means 3 arguments and 3 registers used
.skip_prologue:
    call .8x4
    add  r0, 64                    ;increment pointers
    add  r1, 4*FENC_STRIDE
    add  r2, 4*FDEC_STRIDE
.8x4:
    SUB_DCT4 2x4x4W                ;this macro does the actual transform
    movhps [r0+32], m0             ;store second half of output data
    movhps [r0+40], m1             ;the rest is done in the macro
    movhps [r0+48], m2
    movhps [r0+56], m3
    ret

Он выполняет блок 8x8 из 4 преобразований, выполняя наборы 8x4 за раз. Но он не вставляет код дважды (что привело бы к потере размера кода), а также не имеет функции 8x4 и не вызывает ее дважды. У него также нет петли. Вместо этого он вызывает "функцию" и затем увеличивает указатели, а затем "попадает" прямо в нее и делает это снова.

Он сочетает в себе лучшее из обоих миров: никаких накладных расходов на вызов функций помимо исходных (поскольку указатели r0, r1 и r2 не увеличиваются в SUB_DCT4) и никакого дублирования кода, и em> без накладных расходов на цикл.

person Dark Shikari    schedule 19.09.2008

Этим летом я написал игру, которую назвал SatelliteRush. Это игра Breakout для мобильных телефонов с Java и GPS. В нее можно играть в двух режимах: «скучный режим» и «спутниковый режим». В скучном режиме вы используете кнопки для перемещения весла, как обычно, но в спутниковом режиме он использует GPS-приемник телефона. Вы бегаете взад и вперед, а весло движется вместе с вами.

Я тестировал его только на Sony-Ericsson W760i, и он работает достаточно хорошо, учитывая, что обновления местоположения GPS довольно медленные и неточные.

Пока что я сделал «техническую тестовую версию» этой игры, поэтому она не очень красива и проста в использовании. Но если у вас есть GPS-телефон с Java, вы можете скачать его здесь: http://www.lysator.liu.se/~padrone/temporary/SatelliteRushTest/

ИЗМЕНИТЬ:

Теперь доступно для Android в виде бесплатного приложения на Android Market: https://market.android.com/details?id=se.nekotronic.satelliterush

person Thomas Padron-McCarthy    schedule 10.10.2008
comment
...кого-то собьет автобус, пока он яростно играет в понг. - person Grank; 11.10.2008

Устройство Дафф. Это считается? :)

person Gabriel Isenberg    schedule 10.10.2008
comment
@Treb en.wikipedia.org/wiki/Duffs_device - person Kyle Cronin; 10.10.2008

устройство Duffs, для вышеуказанного вопроса.

История Мела. Хардкорный взлом.

person Paul Nathan    schedule 10.10.2008
comment
Вы, наверное, думаете об истории Мэла, программиста в Royal Bee. - person Paul Tomblin; 10.10.2008
comment
История Мела: catb.org/jargon/html/story-of -mel.html - person Graeme Perrow; 10.10.2008

У меня был ранний компьютер Commodore 64, и мне нужно было написать для него ассемблерный код.

Проблема была в том, что не было ассемблерной программы для C64 (либо это, либо я не мог себе ее позволить).

Итак, я написал ассемблер, найдя коды операций 6502 в книге и создав программу из необработанных байтов.

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

Мой друг написал дизассемблер для своего ПЭТ на Бейсике. Я использовал эту программу для дизассемблирования моего ассемблера, а затем смог использовать мой ассемблер для сборки новых версий самого себя.

Ох уж эти обручи, через которые нам приходилось прыгать в старые времена :)

person Alan    schedule 04.02.2009
comment
Настоящие мужчины писали нативный код. Остальным каким-то образом удалось откуда-то стащить ассемблер. Что вызывает довольно крутой хак миниассемблера в целых базовых прошивках ранних Apple II. На самом деле все ромы Apple II были довольно удивительными. - person stu; 19.01.2010

Самый крутой хак (и это не совсем хак в прямом смысле этого слова, но он проходит так же, как и некоторые из приведенных выше ответов), который я когда-либо создавал, был на моем Apple //e.

В справочном руководстве была одна строка, в которой говорилось, что $C010 — это флаг «нажатие любой клавиши».

Что оказалось правдой. Старший бит программного переключателя $C010 сообщит вам, была ли клавиша нажата или нет, несмотря на встроенное аппаратное обеспечение повторения клавиши.

Чего они не сказали вам, и все узнали на собственном горьком опыте, так это того, что не было надежного способа узнать, КАКАЯ клавиша была нажата.

Если бы вы написали небольшую программу сборки... (простите за мои ошибки, моя сборка 6502 сильно ржавая)

  :1
  lda $C010
  cmp #$80
  bcc :1  ; branch if less than? I forget how to do that.
  lda $C000
  jsr $FDF0   ;output the accumulator value to the screen

Таким образом, он будет зацикливаться, пока вы не нажмете клавишу, и выведет ключ, загрузив его с переключателя чтения клавиатуры $C000.

Но если вы запустите эту программу, она не будет работать правильно.

Он, безусловно, распечатывал что-то, пока вы удерживали клавишу, и ничего, когда вы этого не делали, но где-то в шине была небольшая задержка (я думаю, я не специалист по аппаратному обеспечению), поэтому, если вы нажмете «f» вы получил бы много "f". Но если вы остановитесь, а затем нажмете «g», вы получите кучу «f», прежде чем он переключится на «g».

Вы могли видеть доказательства этой проблемы в версии Gauntlet для яблока ][, вы двигались в одном направлении, а если вы пытались двигаться во втором направлении, вы немного двигались в исходном направлении, пока не прошли отставание.

На самом деле это не имело смысла, потому что чтение $C000 всегда было на 100% точным, если вы сначала не пропинговали $C010.

Я нашел эту проблему увлекательной, и после нескольких недель игры я, наконец, придумал то, что я до сих пор считаю самой крутой программой, которую я когда-либо писал.

Сама программа не имела никакого смысла, она сделала несколько бесполезных ORA, но по какой-то причине она работала и выдавала правильные значения из $C000 после запроса $C010.

Это было так круто, что я написал статью для журнала nibble, которую они приняли, но так и не опубликовали (либо потому, что они прекратили свою деятельность, либо потому, что статья читалась так, как будто она была написана 15-летним подростком, что так и было), где я написал замену программу ввода с клавиатуры и подключил ее к нулевой странице, которую все вызывают для получения ввода с клавиатуры, и я смог программно изменить задержку и частоту повторения с клавиатуры, что в противном случае было бы невозможно, поскольку это было встроено в аппаратное обеспечение. Конечно, в то время Apple //e уже уходил в прошлое, но по сей день это мой самый крутой лайфхак.

Обновление от 02.03.2010: Просматривая некоторые старые документы, я нашел распечатку моей небольшой процедуры сборки. Я публикую его здесь, чтобы посмотреть, сможет ли кто-нибудь понять, почему он работает, и поэтому он навсегда останется где-то в цифровой форме...

$0300  AD 10 C0  LDA $C010  ; load accumulator with any-key-down flag
$0303  29 80     AND #$80   ; keep only high bit flag
$0305  0D 00 C0  ORA $C000  ; OR accumulate with keyboard soft switch
$0308  10 F9     BPL $0303  ; erm, I forget exactly which branch this is
$030A  09 80     ORA #$80   ; turn the high bit on 
$030C  20 ED FD  JSR $FDED  ; print char in accumulator
$030F  4C 00 30  JMP $0300  ; start again.

Непонятно, почему это должно работать, но это работает. Или сделал. 25 лет назад.

person stu    schedule 04.02.2009

Быстрый обратный квадратный корень — причудливая маленькая процедура, которая каким-то образом ухитряется вычислить обратный квадратный корень из чего-то, но вы никогда не догадаетесь об этом, глядя на нее.

http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/

person Asmor    schedule 19.09.2008
comment
Прочитал статью... теперь голова болит! - person E.J. Brennan; 05.05.2009

Мой друг заменял материнскую плату в своем Dell на более новую и быструю материнскую плату OEM. Однако он не мог заставить работать кнопку питания и другие элементы на передней панели — разъемы были разных размеров и с разным расположением контактов. Я взял кучу запасных перемычек и запасных проводов и подключил нужные контакты один за другим. Паять не надо :)

С точки зрения кода я постоянно впечатлен. Я всегда думал, что не существует элегантного способа определить, успешно ли forked дочерний элемент execed, но на самом деле .

ребенок:

execvp(argv[0], argv);
errval = errno;
write(data->fd, &errval, sizeof(errval));

родитель:

socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
flag = fcntl(fds[1], F_GETFD) | FD_CLOEXEC;
fcntl(fds[1], F_SETFD, flag);
pid = clone(child, NULL, SIGCHLD, NULL);
if(pid < 0){
        ...
}
close(fds[1]);
/* Read the errno value from the child, if the exec failed, or get 0 if
 * the exec succeeded because the pipe fd was set as close-on-exec.
 */
n = read(fds[0], &ret, sizeof(ret));
if (n < 0) {
        ...
} else if(n != 0){
        /* exec failed */
} else {
        /* exec succeeded */
}
person ephemient    schedule 10.10.2008

контроллер диска Стива Возняка.

person Martin Cote    schedule 10.10.2008

Мы были скомпрометированы в небольшой компании, в которой я работал, какими-то предположительно русскими хакерами. Я и несколько других разработчиков хотели посмотреть, как это сделать, поэтому я снял с нашего сервера самый элегантный PHP-скрипт, который я когда-либо видел, и сразу же удалил его с нашей рабочей машины.

Это был троянский конь под названием c99shell, который делал так много с таким малым, что это было и ужасно и прекрасно одновременно. У этой штуки был встроенный графический интерфейс с изображениями, использующими base64 для вывода их из PHP, поэтому все было самодостаточным. Список функций был больным! Эта штука может запускать оболочки, сканировать строки подключения, блокировать себя и ряд других полезных вещей для злоумышленника.

Это было прекрасно.

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

person willasaywhat    schedule 10.10.2008
comment
Если вы живете в стране, где у вас много свободного времени, и вы действительно умны, и никто не заплатит вам за то, что вы сжигаете на них свой творческий потенциал, такие вещи имеют тенденцию проявляться. Я продолжаю говорить людям: вы никогда не слышали о вирусе, который не может правильно установиться. Может быть, этим ребятам следует писать весь софт, они знают, что делают. - person stu; 19.01.2010
comment
@stu: Вы также не слышали о вирусе, который не удается установить, потому что он не распространяется. Что-то вроде естественного отбора.. - person Andrei Rînea; 04.11.2010

Устройство Теслы установило рекорд искусственных молний (42 метра или 130 футов) и все огни в Колорадо-Спрингс погасли.

person Serhat Ozgel    schedule 10.10.2008

взлом Black Sunday.

person Community    schedule 27.10.2009
comment
Бьюсь об заклад, вы слышали это от Джеффа... - person Andrei Rînea; 04.11.2010

Я бы сказал вам, но они могут захотеть вернуть мой аттестат о среднем образовании, если я признаюсь в нем;)

person tloach    schedule 10.10.2008
comment
Хромой. Сеть безопасна. Пожалуйста, скажите. - person Omar; 03.03.2010
comment
тлоах на самом деле не твое имя, не так ли?! :П - person Andrei Rînea; 04.11.2010
comment
Это возможно связано с абсолютным отсутствием принудительных прав доступа к файлам и каталогам в MacOS 6 в сочетании с отсутствием у ИТ-отдела достаточного бюджета для разделения пользовательских папок учеников и учителей. - person tloach; 02.11.2015

Еще во времена DOS я написал программу-скрипт для демонстрации программного обеспечения моей компании. Эта скриптовая программа запускала приложение, а затем открывала всплывающие окна поверх приложения, описывала некоторые из его функций с помощью анимированного шрифта, затем закрывала окно, передавала нажатия клавиш приложению, ждала, пока приложение отобразит правильный экран, а затем всплывающие окна. У него был собственный язык сценариев и даже редактор сценариев, чтобы я мог прервать сценарий, отредактировать его, а затем возобновить его выполнение. Самое приятное то, что он работал поверх немодифицированной версии нашего приложения.

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

person Kluge    schedule 10.10.2008

Однажды я собрал простую командную строку в стиле DOS для Psion 3a во время университетской лекции. Он мог только выполнять базовый список каталогов, просматривать, копировать и перемещать, но выглядел вполне соответствующе — полноэкранный режим с мелким шрифтом.

О, и я запрограммировал понг для 68008 с потенциометрами на входе и осциллографом на выходе. Не так сложно использовать доску разработчика, но было что-то классное в том, чтобы играть в нее на osc.

person Draemon    schedule 10.10.2008

Делал не я, конечно, но наткнулся недавно и выглядело прикольно:

Игра жизни с самопечатанием на C#

«Игра жизни Конвея десятилетиями очаровывала ученых-компьютерщиков. Несмотря на то, что ее правила до смешного просты, вселенная Конвея порождает множество планеров, космических кораблей, осцилляторов, планерных пушек и других форм «жизни». Самораспечатывающиеся программы столь же любопытны и, что довольно удивительно, занимают важное место в теории вычислений.

Что произойдет, если вы объедините их? Вы скоро это узнаете, но одно можно сказать наверняка: фактор гиковства должен быть довольно высоким.

Я написал небольшую программу на C#, содержащую сетку Game-of-Life. Программа продвигает игровую сетку к следующему поколению и распечатывает свою копию с обновленной сеткой. Вы можете взять результат, скомпилировать его с помощью компилятора C#, запустить, и вы получите игру следующего поколения. Вы можете повторить процесс или изменить начальное состояние сетки вручную. "

Перейдите по ссылке выше для получения исходного кода.

person Evgeny    schedule 04.02.2009

Я написал простой пакетный файл для Windows, чтобы позволить мне быстро воспроизводить треки, соответствующие некоторому образцу из моей музыкальной библиотеки (на диске f:) на очень медленной машине (открытие iTunes на этой машине занимает около 3 минут!). Он поддерживает регулярные выражения с помощью команды findstr и использует mplayer для воспроизведения дорожек. Все, что мне нужно сделать, это нажать Windows + R и ввести:

play u2

or:

play "neighbo.+rhood"

or:

play "blink[0-9][0-9][0-9]"

Пакетный файл такой, в play.bat.

cd /d f:
findstr /I /R %1 dirlist.txt > playlist.txt
mplayer -playlist playlist.txt

И mplayer, и play.bat должны быть добавлены к вашему пути.

person Liam    schedule 10.10.2008

Я написал ассемблер для небольшой виртуальной машины (UDVM) с Excel и Visual Basic. Вы пишете свой ассемблерный код в ячейках Excel и свою схему памяти на другом листе, а затем внизу будут вычисляться двоичные строки машинного кода. Представьте себе ужас ручной сборки каждый раз, когда вы меняете свой ассемблерный код.

person yogman    schedule 10.10.2008
comment
У меня был друг, который написал интерпретатор ассемблера, используя пакетные файлы Windows; Ссылку скину позже, если найду - person BlueRaja - Danny Pflughoeft; 28.04.2010

После нескольких дней отладки коммутируемого сервера, на котором наблюдалось недопустимое количество сброшенных вызовов, я обнаружил проблему в доморощенном механизме аутентификации, который зависел от текстового представления PID работающего getty. getty сгенерирует ошибку и прервется, если его PID будет содержать четное число, за которым следует 9, что приведет к сбросу вызова и повторному появлению getty с новым PID.

После того, как проблема была выявлена, меня отстранили от проекта, а позже я обнаружил, что «исправление» заключалось в изменении преобразования числа в текст с

sprintf(strval, "%d", pid);

to

sprintf(strval, "%o", pid);

Вместо устранения неполадок в процедуре аутентификации кто-то решил преобразовать PID в восьмеричное, что сделало невозможным содержание 9!

person Adam Liss    schedule 02.11.2008

И программа самопечатания («quine») на C# длиной 149 символов:

C# Quine

class P{static void Main(){var S=“class P{{static void Main(){{var S={1}{0}{1};System.Console.Write(S,S,’{1}’);}}}}”;System.Console.Write(S,S,‘”‘);}}
person Evgeny    schedule 04.02.2009

Пару лет назад я разрабатывал веб-интерфейс и использовал несколько совершенно новых JS-библиотек для функциональности AJAX. Библиотека оценивала только JS, который был в заголовке html-документа, но было возвращено слишком много данных, чтобы поместиться в заголовке. Что делать?

Некоторые поиски показали, что JS в заголовке имеет доступ к телу html-документа, поэтому я написал общую функцию «eval the body», которая была возвращена в заголовке. Очень полезно в то время, особенно из-за другой JS-библиотеки, которую мы оценивали только в eval'd JS из тела, поэтому это было совместимо для обеих JS-библиотек и избегало любых ограничений размера из заголовка!

Да, просто, но я целый месяц чувствовал себя прекрасно после того, как понял это :)

person Jason Peacock    schedule 10.10.2008

Видел, как мой бывший напарник переписывает 3D-движок PlayStation One за три недели с нуля на ассемблере. Старый был медленным, и у нас больше не было времени менять графические активы. Он начал переписывать за два месяца до дедлайна.

Это был тот же самый парень (а также некоторые другие чуваки — это был акт командной работы), который проделал потрясающую работу, запихнув 10 минут графики и звука в исполняемый файл размером 64 КБ.

http://pouet.net/prod.php?that=1221

person Nils Pipenbrinck    schedule 19.09.2008

При рассмотрении того, как использовать TCP в 4D, я наткнулся на этот вариант устройства Duff в документации:

$SentOK:=False  //A flag to indicate if we made it through all of the calls
Case of 
   : (SMTP_New ($smtp_id)!=0)
   : (SMTP_Host ($smtp_id;<>pref_Server)!=0)
   : (SMTP_From ($smtp_id;vFrom)!=0)
   : (SMTP_To ($smtp_id;vTo)!=0)
   : (SMTP_Subject ($smtp_id;vSubject)!=0)
   : (SMTP_Body ($smtp_id;vMessage)!=0)
   : (SMTP_Send ($smtp_id)!=0)
Else 
   $SentOK:=True  //message was composed and mailed successfully
End case 
If ($smtp_id!=0)  //If a Message Envelope was created we should clear it now
   $OK:=SMTP_Clear ($smtp_id)
End if 

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

person 3Doubloons    schedule 28.10.2008

Не мной:

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
  int i;

  printf("((((");
  for(i=1;i!=argc;i++){
    if(     strcmp(argv[i], "^")==0) printf(")^(");
    else if(strcmp(argv[i], "*")==0) printf("))*((");
    else if(strcmp(argv[i], "/")==0) printf("))/((");
    else if(strcmp(argv[i], "+")==0) printf(")))+(((");
    else if(strcmp(argv[i], "-")==0) printf(")))-(((");
    else                             printf("%s", argv[i]);
  }
  printf("))))\n");
  return 0;
}
person Community    schedule 12.02.2009
comment
Анализатор приоритета операторов. См. en.wikipedia.org/wiki/Operator-precedence_parser. - person Brian; 22.10.2009
comment
вау, мне нравится этот код, он кажется простым, но из-за него мои приложения зависали на несколько минут (когда я пытаюсь открыть свои приложения, они зависают). Знаете ли вы, что именно делает этот код? Я один не могу понять, почему мои приложения ломаются при запуске этого кода на моем ПК. - person ; 15.07.2010

Если вам нужно много кода C с невероятными хаками, примите участие в Международном конкурсе запутанного кода C. Как правило, это не те вещи, за которыми вы бы хотели, чтобы вас застукали, но они все равно впечатляют.

person Community    schedule 12.02.2009

В первый раз мне пришлось попытаться понять и изменить кусок кода, написанный в функциональном стиле. Я потратил час, пытаясь понять, где что произошло, а затем обнаружил, что вся работа была сделана в строке, которая выглядела примерно так:

for my $row (@data) {
  push @formatted, join ",", map $format[$_]->($data->[$_]), 0..$#$data;
}

Я разыскал автора и воскликнул: «Почему ты не прокомментировал это???» Его ответ был: «Какой комментарий помог бы?» Я попытался придумать что-то одно и потерпел неудачу.

Этот код научил меня технике, которую я считаю очень полезной и по сей день. Однако я узнал, что это техника, которую следует использовать часто или никогда, но ни в коем случае не посередине. Потому что, действительно, никакие комментарии не помогут. Либо вы понимаете, что там есть строка, что она делает и что вам не нужно об этом беспокоиться, либо вы не поймете этот код.

Тот же программист регулярно делал и другие впечатляющие вещи. Например, на предыдущей работе он модифицировал библиотеку C таким образом, чтобы когда программа C выгружала дамп ядра, она не просто выгружала ядро. Вместо этого он создает дамп памяти, а затем отправляет электронное письмо команде разработчиков с трассировкой стека и прикрепленным дампом памяти. Это позволяло им замечать и исправлять ошибки в заданиях cron, в которых возникали проблемы.

person user11318    schedule 19.09.2008
comment
Впечатляющий код — это не обязательно хорошо. Я не утверждаю, что понимаю, что делает строка, но готов поспорить, что есть более понятный, хотя и более подробный способ сделать это. - person Asmor; 19.09.2008
comment
Тогда вы ошибетесь. Эта строка позволяет вам перенести логику с того места, где вы работаете, на настройку функций формата. Если вы знаете технику, обслуживание несложно. Если вы этого не знаете, переписывание не поможет. - person user11318; 23.09.2008

Я считаю, что приведение строки с помощью .ToString() всегда WTF.

person Aaron Powell    schedule 19.09.2008

Старенький, но для меня это был аппарат Даффа:

http://en.wikipedia.org/wiki/Duff

(по какой-то причине я не могу получить уценку, чтобы показать этот URL-адрес как ссылку)


strcpy(to, from, count)
char *to, *from;
int count;
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
               } while (--n > 0);
    }
}
person Michael Burr    schedule 19.09.2008
comment
Чтобы опубликовать ссылку, заключите ее в заостренные скобки ‹вот так›. Чтобы использовать текст, отличный от самого URL-адреса, поместите текст в квадратные скобки, а затем URL-адрес в круглых скобках рядом с ним вот так - person nickf; 19.09.2008
comment
Я перепробовал все различные варианты ссылок, показанных в справке по уценке, — она отображается в предварительном просмотре как ссылка, но не в самом ответе. Я сделал много ссылок в другом месте. Я не знаю, что здесь происходит... - person Michael Burr; 19.09.2008

Еще в старшей школе я очень гордился тем, что написал программу для трехмерной графики на своем ti-83, потому что мои родители не купили бы мне 89-й.

person Wyatt    schedule 10.10.2008
comment
В старших классах у меня был TI-85, и я понял, как добиться нажатия клавиш почти в реальном времени. Что-то, чего не могли сделать мои друзья, поэтому моя отстойная игра была более отзывчивой, чем игры, сделанные моими друзьями (которые, по общему признанию, были лучше в других отношениях). - person torial; 11.10.2008
comment
лол, это круто, бро. Придется поделиться ;). - person SD.; 05.02.2009

Делаем сканер из головки принтера. Современные версии включают Canon, но этот трюк на самом деле очень старый.

person Community    schedule 12.02.2009

Стихотворение TeX Дэвида Карлайла:

\let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
:76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR@oL
RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
I71Fo71dPA!!FRgiePBt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal,@i;@ TLRlogdLrDsW,@;G
LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;Rri@stW aHAHHFndZPqpa.rtMRrgeLinZ.irLtYer.W,:jbye

запустите pdftex для этого файла и удивитесь.

person Community    schedule 27.04.2010

Внутри цикла находится переключатель для раскручивания цикла, известный как устройство Duff.

dsend(to, from, count)
char *to, *from;
int count;
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
               } while (--n > 0);
    }
}

Это не НАСТОЛЬКО мощно, однако это хорошее злоупотребление синтаксисом C.

person Eric    schedule 10.10.2008

http://pida.co.uk/ Хак, который положит конец флеймовой войне Vim/Emacs! (!!11одиннадцать)

person Ali Afshar    schedule 02.11.2008

Загрузчик для ЦП, который не поддерживает загрузчики.

ЦП является производным от члена семейства ЦП Rockwell, который выполняет заданный ему код. Цепочка инструментов создает либо образы RAM (которые вы можете использовать JTAG и запускать для отладки), либо образы ROM.

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

На всякий случай я почувствовал себя творческим, ЦП не имеет инструкции JMP. (Я не шучу.) Инструкции RST тоже нет.

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

Файловая система находилась во флэш-памяти и работала только по тому адресу, по которому она была записана. (Это не перемещается)

Поэтому я загрузил ПЗУ загрузчиком, который загрузил бы загрузчик в нижнюю часть ОЗУ. Чем ЦП записывает в массив вентилей, тем

1) утверждает сброс. 2) меняет местами выбор микросхемы для ОЗУ и ПЗУ 3) отпускает сброс.

ЦП в конечном итоге работает из ОЗУ, готовый прочитать код из файловой системы в ОЗУ.

Это действительно работает. Меня "вдохновило" то, как IBM PC-AT выводит 286-й чип из защищенного режима.

person Community    schedule 26.02.2009

Простой. Один из моих первых наставников уехал на летние каникулы со своей семьей. Когда он вернулся, он сразу же сел за терминал и набрал процедуру GMAP, скомпилировал (чистил) и вытолкнул ее. Я спросил, могу ли я помочь с тестированием, и он сказал, что все в порядке, он «проверил его на песке». Хм? Видимо ему было скучно на пляже, поэтому нашел ровный кусок песка, закодировал и проверил - "песок проверен". Блестящий парень.

person jsfain    schedule 24.11.2008

Несколько лет назад я написал программу для отображения текста большими печатными буквами, чтобы поместить их в заголовок моих исходных файлов, чтобы я мог печатать их на нескольких страницах очень мелким шрифтом. Я построил небольшую таблицу с информацией о пикселях в квадрате 5x5 для печати символов. Там были только заглавные буквы и цифры. Итак, pa станет...

####    #
#   #  # #
####  #   #
#     #####
#     #   #

Некоторое время спустя я обнаружил в исходном листинге BIOS IBM PC, который шел с IBM PC Technigal Reference, что у него был генератор символов 8x8. Поэтому я нашел его и извлек из дампа памяти. Итак, я смог сгенерировать полный набор символов, чтобы использовать строчные буквы...

## ###   ####
 ##  ##     ##
 ##  ##  #####
 #####  ##  ##
 ##      ### ##
####
person Community    schedule 18.01.2010

Однажды я использовал кнопки в FoxPro (Windows) для создания гистограммы в самой первой написанной мною программе. Это было действительно круто для меня.

person Community    schedule 27.04.2010