Перейти к содержимому
Alexey383

Туториалы по хакингу Sonic (Genesis/Mega Drive)

Рекомендуемые сообщения

скажите пожалуйста код активации double jump только при наличии щита

Поделиться сообщением


Ссылка на сообщение

Блин, да это же проще простого. Учимся юзать поиск в текстовом редакторе. Буквально за минуту нашел это:

 

tst.b ($FFFFFE2C).w ; does Sonic have shield?

beq.w Obj38_Delete ; if not, branch

 

Вставляй в код дубльджампа, и все.

 

И да, ты не в той теме спросил.

Изменено пользователем Cool-Spot
  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Блин, да это же проще простого. Учимся юзать поиск в текстовом редакторе. Буквально за минуту нашел это:

 

 

 

Вставляй в код дубльджампа, и все.

 

И да, ты не в той теме спросил.

1)спасибо

2)сорри

Поделиться сообщением


Ссылка на сообщение

ВНЕЗАПНО я решил сделать несколько гидов, после крайне долгого отсутствия активности в этом деле. Нет, большой учебник по ассемблеру еще не готов, я уже думаю о том, как бы начать HTML-верстку (которую я к слову всегда делаю вручную, что займет время). А пока начнем с небольшого обновления весьма своеобразными и немаленькими гидами. В будущем надеюсь делать обновления чуть чаще, чем раз в год =)

 

Встречайте:

 

Как исправить баг с загрузкой Pattern Load Cues (Соник 1 и 2)

Как исправить баг со сдвигом очереди Pattern Load Cues (Соник 1 и 2)

Как исправить баги при смене уровней (Соник 1)

 

Последние два гида - мои собственные, они описывают экзотические неоткрытые ранее баги в Сониках, которые я обнаружил в последние месяцы.

 

Счастливых багфиксов!

  • Лайк 3

Поделиться сообщением


Ссылка на сообщение

ВНЕЗАПНО я решил сделать несколько гидов, после крайне долгого отсутствия активности в этом деле. Нет, большой учебник по ассемблеру еще не готов, я уже думаю о том, как бы начать HTML-верстку (которую я к слову всегда делаю вручную, что займет время). А пока начнем с небольшого обновления весьма своеобразными и немаленькими гидами. В будущем надеюсь делать обновления чуть чаще, чем раз в год =)

 

Встречайте:

 

Как исправить баг с загрузкой Pattern Load Cues (Соник 1 и 2)

Как исправить баг со сдвигом очереди Pattern Load Cues (Соник 1 и 2)

Как исправить баги при смене уровней (Соник 1)

 

Последние два гида - мои собственные, они описывают экзотические неоткрытые ранее баги в Сониках, которые я обнаружил в последние месяцы.

 

Счастливых багфиксов!

Интересные гиды. Было интересно почитать, может даже пригодиться.

Изменено пользователем SpeedMaster

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

Как-то ВНЕЗАПНО появились гиды :D

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

Поделиться сообщением


Ссылка на сообщение

Как добавить в Sonic 1 самонаводящуюся атаку.

Прежде чем испробовать эту особенность Соника, настоятельно рекомендую потереть старый JumpDash от vladikcomper'а. Если он у вас, конечно, стоит.

Переходим по ссылке Obj01_MdJump2. В самое её начало вписываем это:

   bsr.w Sonic_JumpDash

 

Далее, в любое свободное место вставляем следующий код. Я лично вставил его после Sonic_JumpHeight. Для этого найдите строчку «; End of function Sonic_JumpHeight». Сразу после нее вставьте новый код:


Sonic_JumpDash:
   cmpi.b #$02,($FFFFFFEB).w ; if STATE == HOMING
   beq.s Sonic_JD_ChkFramesCount ; checking frames
   tpress A+B+C,(SonicControl) ; if A, B or C pressed
   bne.s Sonic_JD_Init ; then initialize
   rts

Sonic_JD_ChkFramesCount:
   subq.b #01,$001F(a0) ; decrement count of remained frames
   bne.s Sonic_JD_ExecHoming ; if frames > 0, execute homing
   clr.b ($FFFFFFEB).w ; if not, then not
   rts

Sonic_JD_ExecHoming:
   move.w $003A(a0),a1 ; get address of object
   move.w $000C(a1),d1 ; get Y-pos of object
   sub.w $000C(a0),d1 ; get deltaY
   move.w $0008(a1),d2 ; get X-pos of object
   sub.w $0008(a0),d2 ; get deltaX
   jsr CalcAngle.l ; calculate Angle (A)
   jsr CalcSine.l ; get sin & cos of Angle (A)
   move.w #$00001000,d3 ; set homing speed (HS)
   muls.w d3,d0 ; get X-velocity (sin(A)*HS)
   muls.w d3,d1 ; get Y-velocity (cos(A)*HS)
   asr.l #8, d0 ; X-velocity / 256
   asr.l #8, d1 ; Y-velocity / 256
   move.w d1,$0012(a0) ; SET Y-velocity
   move.w d0,$0010(a0) ; SET X-velocity
   move.w d0,$0014(a0) ; SET Ground-velocity
   rts

Sonic_JD_Init:
   lea ($FFFFD800).w,a1 ; set address of Objects
   move.w #$005F,d6 ; set max count of Objects for checking
   moveq #$FFFFFFFF,d3 ; set minimal distanсe from Object to Sonic

Sonic_JD_CheckObject:
   tst.b $01(a1) ; check1
   bpl.w Sonic_JD_NextObject
   tst.b $20(a1) ; check2
   bne.w Sonic_JD_GoodObject

Sonic_JD_NextObject:
   lea $0040(a1),a1 ; select next Object block
   dbf d6, Sonic_JD_CheckObject ; repeat until reach last Object
   cmpi.l #$00006400, d3 ; check distance from Sonic to closest Object
   bhi.w Sonic_JD_ExecJumpDash ; if too far, execute JumpDash

Sonic_JD_InitHoming:
   move.b #$3C,$001F(a0) ; set count of frames for Homing Attack
   move.b #$02,($FFFFFFEB).w ; current STATE = HOMING
   move.w #$00BC,d0 ; select JD sound
   jmp (PlaySound_Special).l ; play JD sound

Sonic_JD_GoodObject:
   lea Sonic_JD_ObjectsDB,a2 ; get address of Objects' database
   move.b (a1),d0 ; get number of current Object

Sonic_JD_IsObjectInTheDB:
   cmp.b (a2)+,d0 ; if object number is there in the database
   beq.b Sonic_JD_GetDX ; if yes, calculate DX
   bhi.b Sonic_JD_IsObjectInTheDB ; else, repeat
   bra.w Sonic_JD_NextObject

Sonic_JD_GetDX:
   move.w $0008(a1),d1 ; get X-position of Object
   sub.w $0008(a0),d1 ; minus X-position of Sonic
   bpl.b Sonic_JD_ObjectToTheRight

Sonic_JD_ObjectToTheLeft:
   btst #0, $0022(a0) ; if Sonic looks left
   beq.w Sonic_JD_NextObject ; if not, go to the next Object
   bra.b Sonic_JD_GetDY

Sonic_JD_ObjectToTheRight:
   btst #0,$0022(a0) ; if Sonic looks right
   bne.w Sonic_JD_NextObject ; if not, go to the next Object

Sonic_JD_GetDY:
   move.w $000C(a1),d2 ; get Y-position of Object
   sub.w $000C(a0),d2 ; minus Y-position of Sonic

Sonic_JD_ChkClosestObject:
   muls.w d1,d1 ; DX^2
   muls.w d2,d2 ; DY^2
   add.l  d1,d2 ; DX^2+DY^2
   cmp.l  d3,d2 ; compare distanсes
   bcc.w Sonic_JD_NextObject

Sonic_JD_SetClosestObject:
   move.l d2,d3 ; set current Object as closest
   move.w a1,$003A(a0) ; set current Object for Homing Attack
   bra.w Sonic_JD_NextObject

; database of valid objects to do homing attack with
; numbers MUST BE in ascending order
Sonic_JD_ObjectsDB: dc.l $1E1F2226, $2B2C2D40, $42435055, $6078FF00

Sonic_JD_ExecJumpDash:
   tst.b ($FFFFFFEB).w ;if STATE == JUMPDASH
   bne.w Sonic_JD_Rts ; if not, branch
   move.b #$01,($FFFFFFEB).w ; current STATE = JUMPDASH
   move.w #$0A00,d0 ; set X-velocity to $A00
   btst #6,$22(a0) ; is Sonic underwater?
   beq.w Sonic_JD_ChkShoes
   move.w #$0600,d0 ; if underwater, set X-velocity to $60

Sonic_JD_ChkShoes:
   tst.b ($FFFFFE2E).w ; does Sonic have speed shoes?
   beq.w Sonic_JD_ChkOrientation ;
   addi.w #$0200,d0 ; set speed to $C00 or $800 if underwater

Sonic_JD_ChkOrientation:
   btst #0,$0022(a0) ; where Sonic looks to?
   beq.w Sonic_JD_SetSpeed; if not to right, then
   neg.w d0 ; reverse X-velocity

Sonic_JD_SetSpeed:
   move.w d0,$0010(a0) ; SET X-velocity
   move.w d0,$0014(a0) ; SET Ground-velocity
   move.w #$0000,$0012(a0) ; SET Y-velocity
   move.w #$00BC,d0 ; select JD sound
   jsr (PlaySound_Special).l ; play JD sound

Sonic_JD_Rts:
   rts

Sonic_JD_StopHoming:
   cmpi.b #$02, ($FFFFFFEB).w ; if STATE == JUMPDASH
   bne Sonic_JD_StopHoming_Rts ; if not, branch
   clr.b ($FFFFFFEB).w ; STATE = NORMAL
   move.w #$FA10,d0 ; set Y-velocity to -5F0
   btst #6,$22(a0) ; is Sonic underwater?
   beq Sonic_JD_StopHoming_ChkShoes
   move.w #$FCE0,d0 ; if underwater, set X-velocity to -320

Sonic_JD_StopHoming_ChkShoes:
   tst.b ($FFFFFE2E).w ; does Sonic have speed shoes?
   beq Sonic_JD_StopHoming_SetSpeed
   move.w #$F9E0,d0 ; set X-velocity to -620

Sonic_JD_StopHoming_SetSpeed:
   move.w #$0000,$0010(a0) ; SET X-velocity
   move.w d0,$0012(a0) ; SET Y-velocity

Sonic_JD_StopHoming_Rts:
   rts

 

В секции Sonic_ResetOnFloor в самое начало добавляем:

   clr.b ($FFFFFFEB).w ; STATE = NORMAL

 

Далее переходим к loc_1AF1E и после "addq.b #2,$24(a1)" вписываем:

   jmp Sonic_JD_StopHoming

 

И, наконец, в секции loc_1AF9C после "bsr.w AddPoints" вставляем:

   jsr Sonic_JD_StopHoming

 

Откомпилируйте и проверьте - работает!

 

Каждый кадр, покамест ёжик крутится в воздухе, процессор непроизвольно переходит по нашей ссылке, в который вписан практически весь сценарий выполнения усовершенствованного JumpDash'а.

Первой миссией нашей программы становится поиск объектов, удовлетворяющих следующим требованиям:

1) объект входит в список целей, разрешённых для выполнения самонаводящейся атаки.

Этот пункт можно отредактировать, изменив байты в следующем участке нашего кода:

Sonic_JD_ObjectsDB: dc.l $1E1F2226, $2B2C2D40, $42435055, $6078FF00

Здесь 1E, 1F, 22, 26, 2B, 2C и т.д. - это т.н. номера объектов, характеризующие вид объекта. К примеру 22 - это летающие осы. Какой номер что означает можно узнать из программы SonED2.

По умолчанию установлено 14 объектов. Вы можете увеличить их количество добавлением новых dc.l, dc.w, dc.b - как угодно, на ваше усмотрение.

Последний байт (00) ни в коем случае не менять. Программа должна знать, где закончить.

ВНИМАНИЕ! Байты должны идти в строго возрастающем порядке.

2) объект находится в поле зрения Ёжика, а не за ним.

 

Далее находится расстояние от Соника до объекта (точнее, квадрат расстояния) и сравнивается с кратчайшим расстоянием, таким образом вычисляется ближайший к герою объект.

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

 

Надеюсь, мой гайд окажется полезным.

Изменено пользователем Мимо проходящий
  • Лайк 3
  • Дизлайк 2

Поделиться сообщением


Ссылка на сообщение

*и тут по идее набегает толпа желающих* xD

Как по мне, хакинг Соников дошел до той точки, когда хоуминг стал не столь интересной штукой =)

Изменено пользователем Razor_ua

Поделиться сообщением


Ссылка на сообщение

Это был ответ vladikcomper'у на его заявление "Совершенно очевидно, что в России код Хоминга в ближайшее время никто не составит". На отладку хака Megahack Ultra и написание кода ушло всего три дня.

Изменено пользователем Мимо проходящий
  • Лайк 4
  • Дизлайк 1

Поделиться сообщением


Ссылка на сообщение

Не понял, это такая среда особая или Сеговские игрушки всегда игры на разновидности ассемблера писали? О_о

  • Дизлайк 1

Поделиться сообщением


Ссылка на сообщение
На отладку хака Megahack Ultra и написание кода ушло всего три дня.

МП, объясни.

Поделиться сообщением


Ссылка на сообщение

Нет, он сам написал.

Откуда вам это известно?

Поделиться сообщением


Ссылка на сообщение

*и тут по идее набегает толпа желающих* xD

Как по мне, хакинг Соников дошел до той точки, когда хоуминг стал не столь интересной штукой =)

Ты как всегда прав, но если в хаке где есть помимо хоминга ещё-что нибудь интересное, он не помешает (хоминг).

 

Откуда вам это известно?

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

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

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

Насколько я знаю, для написания своего кода нужно еще больше навыков и времени. Ах да, и мозги еще.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

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

При чем здесь написание своего кода и дизассемблирование уже готового? Это две разные вещи.

Изменено пользователем MrCech
  • Лайк 2

Поделиться сообщением


Ссылка на сообщение

Здорово, хоминг рабоает!

Изменено пользователем Suler_Maxwell
  • Лайк 2
  • Дизлайк 2

Поделиться сообщением


Ссылка на сообщение

Хоуминг? РАЗРАЗИ МЕНЯ ГРОМ! ЭТО ЖЕ ХОУМИНГ! ДРУГИЕ СПОСОБНОСТИ ИДУТ ЛЕСОМ! ВЫ КОГДА-НИБУДЬ ВИДЕЛИ ЧТО-НИБУДЬ ОРИГИНАЛЬНЕЕ ЭТОГО?! КОНЕЧНО ЖЕ НЕТ!!! ХОУМИНГ СОТВОРЁН КРУТЫМИ АСМ-ПРОГРАММИСТАМИ СПЕЦИАЛЬНО ДЛЯ ВАС!!! ДА ВЫ ХОТЬ РАЗ ТАКОЕ ВИДЕЛИ? СМОТРИТЕ: НЕ ЗАБРЫЗГАЙТЕ КЛАВИАТУРУ СЛЮНОЙ!!1

 

А если серьёзно, то это старо. Очень старо. Кому это надо? Хаки с хоумингом итак делаются в огромном количестве. Зачем ещё? Хаки-штампы скучны и неинтересны. Если бы это было выложено в 2005-2006 году, то несомненно было бы прорывом, но сейчас просто безделушка.

  • Лайк 2

Поделиться сообщением


Ссылка на сообщение

Как по мне так лудше сделать буст скажем к примеру в Sonic 1 в каком то хаке на Sonic 2 была подобная штука но это была неуязвимость+супер скорость и она тратила 1 кольцо в секунду...

Поделиться сообщением


Ссылка на сообщение

Что ж, друзья! Пора поставить точку в приключениях хоминга!

 

Это был ответ vladikcomper'у на его заявление "Совершенно очевидно, что в России код Хоминга в ближайшее время никто не составит". На отладку хака Megahack Ultra и написание кода ушло всего три дня.

 

Это ошеломительный ответ, я ждал, когда же такой ответ появится. Кто бы думал, что это случится сегодня.

Все было бы совсем идеально, если одно но не омрачало бы всю эту затею. Это не твой код, не ты его составлял. А я надеялся!

 

Судя по всему, код был получен путём дизассемблирования Megahack Ultra, ибо vladikcomper его сразу узнал.

Именно.

Это я уже говорил утром на irc канале #sonicscanf. К сожалению, я не мог ответить сразу, так как неудобно писать содержательные посты с мобильника.

 

Этот код байт в байт соответствует третьей версии Хоминг атаки, которую я написал и которая используется в Sonic 1 Megahack: Ultra Edition и еще в невышедшем Sonic Winter Adventures.

 

* * *

 

Чтобы там ни было,

 

Мимо проходящий, твой ответ действительно ошеломительный, я не шучу. Все в твоем гиде сделано на высшем уровне. Меня поразило, с какой точностью ты описал каждую команду моего кода и принцип действия в целом, не забыв кроме всего прочего про такие вещи, как очищение флага в ResetOnFloor, добавление дополнительного кода в TouchResponse. Ты даже понял такую мелку деталь, что "numbers MUST BE in ascending order" в массиве ID'ов объектов (с масивом, отсортированным в порядке возрастания я сильно оптимизирую цикл перебора его элементов). Это действительно круто. Твои познания в ассемблере и реверс инжиниринге великолепны.

 

Есть правда, небольшой ляп, который ты допустил, разбирая код:

Последний байт (00) ни в коем случае не менять. Программа должна знать, где закончить.

Тригер окончания списка -1 (FF), а не 00. Байт 00 получился в результате выравнения офсета следующей за списком инструкции (even). Здесь все нетривиально, так что бесспорно, об этом сложно догадаться.

 

В цикле перебора массива из ID'ов, я повторяю перебор, пока ID объекта больше рассматриваемого элемента массива. При достижении значения FF, цикл автоматически обрывается, так как нельзя подобрать ID такой, что он будет больше FF. Таким образом, я получаю наиболее быстрый алгоритм перебора элементов, который не требует ни обязательной проверки всех элементов массива, ни специальных условий для обнаружения конца списка.

 

Сближение по умолчанию производится в течение 31 кадра, после чего эта особенность отключается.

60 кадров, я задаю байту $1F значение 60. Условие окончания хоминга срабатывает, как только счетчик достигает значения 0.

 

А еще, только что заметил, ты удалил из основного кода несколько команд, использовавших регистры d4, d5 для запоминания dX, dY при поиске ближайшего объекта. Очень хорошо, потому что они не используются, это мертвый код, остатки от поисков лучшей реализации алгоритма, которые я забыл удалить.

 

* * *

 

В общем-то,

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

 

Но все же, должен согласится со всеми, кто говорит, что Хоминг уже не имеет такое большое значение в хакинге, что это что-то уникальное и что не стоит допускать его массового копирования. Мир меняется, меняются требования игр, и нещадно повышается планка качества для хакинга. Хакинг постоянно должен предлагать что-то новое, чтобы существовать. И я думаю, самое время.

 

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

 

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

 

Забирайте код, друзья! И да будут хаки ваши на 20% круче с хомингом, если вы его жаждите. При использовании кода, пожалуйста, укажите мое авторство.

Так же прилагаю оригинал моего кода, в том виде, в котором он был задействован в моих хаках, Sonic 1 Megahack: Ultra Edition и Sonic Winter Adventures: http://pastebin.com/A2n9n88Z (думаю, тебе МП, это будет особенно интересно).

 

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

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Как я ошибался! Не поймите меня неправильно, но я, поначалу, считал, что Мимо проходящий - это Влад.

Всё дело в том, что дисасемблирование сложно даже для про.

Может мы имеем дело с про? С про программистом, изучающем ассемблер не мало лет?

С человеком, способным на многое, с будущим ромхакинга.

Изучение АСМ - вот чем могут похвастаться люди сейчас.

Если мы не будем угнетать человека за воровство, а дадим ему второй шанс, он продвинет Россию вперёд, далеко-далеко.

  • Лайк 2
  • Дизлайк 2

Поделиться сообщением


Ссылка на сообщение

Если мы не будем угнетать человека за воровство, а дадим ему второй шанс, он продвинет Россию вперёд, далеко-далеко.

... Далеко-далеко в ж...

Нувыпонели...

Зачем? Это если не троллинг от Влада, то просто вор. Даже не ромхакер - просто вор.

Поделиться сообщением


Ссылка на сообщение

...Зато какой!

До него ещё 1 вор был, имени не помню. Из мегамикса своровал музыку и хоуминг. Ромхакер этот был русским. Однако все брызгались слюной, что он вор.

  • Лайк 2

Поделиться сообщением


Ссылка на сообщение
Если мы не будем угнетать человека за воровство, а дадим ему второй шанс, он продвинет Россию вперёд, далеко-далеко.

Мне кажется, или наличие в пустых головах у некоторых людей мысли, что вор может продвинуть Россию вперед - неважно, в каком контексте - само по себе свидетельствует о полной безнадёге?

Изменено пользователем Kknewkles
  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Мне кажется, что можно воздержаться от оффтопиков.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Всем отписавшимся отвечаю.

 

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

Если бы я хотел выдать код за свой, я мог бы изменить его до неузнаваемости: мог бы изменить регистры, участки памяти, структуру. Я не стал этого делать. Я специально оставил всё как есть, чтобы vladikcomper смог узнать своё детище.

 

Влад, надеюсь, ты не обижаешься на меня. В конце концов, настало время сказать НЯ.

  • Лайк 3

Поделиться сообщением


Ссылка на сообщение

Мне так никто и не ответил, в чем все это великолепие достигается, предположу, что HEX-эдитор, уже упоминавшийся, и на этом успокоюсь.

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×