...

суббота, 11 апреля 2020 г.

[Из песочницы] Как я отказался от вычисления квадратного корня

Очень часто, при цифровой обработке сигналов необходимо вычислить длинну вектора, обычно это делается по формуле A=SQR(X^2+Y^2). Здесь возвести в квадрат значение не сложно, но операция вычисления квадратного корня не является простой операцией, особенно для микроконтроллеров. Кроме того, алгоритмы вычисления корня выполняются не стабильное время, и для алгоритмов, которых таких вычислений много, становится сложно прогнозировать время, необходимое для вычислений.

С такой задачей столкнулся и я. О том как я отказался от процедуры вычисления корня, читайте ниже.
Для начала, рассмотрим четыре вектора, они лежат в разных четвертях.

Сведем все в одну четверть — в первую. Для этого возьмем координату Y и если она отрицательная, то превратим ее в положительную. В случае если она и так положительная, то оставим все без изменений.

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

Здесь 2047 это виртуальный нуль, поскольку в проекте с которым я работал, когда изобретал этот велосипед, были АЦП 12 бит.

Посмотрим, что произошло.

И сделаем то-же самое для координаты X.

Кстати стоит заметить, что от двух 12ти битных значений, осталось два 11ти битных.

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

Следующий этап преобразований: «вывернем вокруг оси 45 градусов».

Векторы могут иметь угол от нуля и до 90 градусов, при этом если в координатах вектора Y>X, то угол вектора лежит в области 45-90 градусов, а если Y<X, то угол вектора меньше 45 градусов. Ну и если X=Y, то угол вектора равен 45 градусам.

Сведем векторы к 45 градусам.

Если Y>X, то TEMP=Y, Y=X, X=TEMP (меняем X и Y местами).
Если Y<=X, то ничего не делаем.

Смотрим, что произошло. Все векторы лежат в диапозоне углов от 0 и до 45 градусов.

Хочу заметить, что на этом этапе, у меня была идея проверить угол на 22,5 градуса и опять развернуть. А потом сделать проверку и выворачивание на 12,25 градуса. И так, далее, пока вектор не «ляжет» на ось X, а тогда его длинна и будет определяться координатой X, а Y станет равен нулю.

Но, я не пошел этим путем, я сделал ставку на другой метод, и как оказалось в последствии, не прогадал.

Если разделить Y на X, а потом взять арккосинус из этого частного, то получим угол. А если разделить X на косинус этого угла, то получим длину вектора.

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

Но все обошлось. Я решил, что можно сразу сделать таблицу, где отношение Y/X адресует ячейку, а в ней «лежит» коэффициент, на который надо разделить X, чтобы получить длинну вектора.

Понятно, что все K, для всех (Y/X), должны быть посчитаны заранее.

Просчитанная таблица содержит 2048 значений, каждое из которых 16 бит. То есть 4кБ данных.

Таблица

Magnitude_Table
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800
DCW 0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801
DCW 0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801
DCW 0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801,0x0801
DCW 0x0801,0x0801,0x0802,0x0802,0x0802,0x0802,0x0802,0x0802
DCW 0x0802,0x0802,0x0802,0x0802,0x0802,0x0802,0x0802,0x0802
DCW 0x0802,0x0802,0x0802,0x0802,0x0802,0x0802,0x0803,0x0803
DCW 0x0803,0x0803,0x0803,0x0803,0x0803,0x0803,0x0803,0x0803
DCW 0x0803,0x0803,0x0803,0x0803,0x0803,0x0803,0x0803,0x0803
DCW 0x0804,0x0804,0x0804,0x0804,0x0804,0x0804,0x0804,0x0804
DCW 0x0804,0x0804,0x0804,0x0804,0x0804,0x0804,0x0804,0x0805
DCW 0x0805,0x0805,0x0805,0x0805,0x0805,0x0805,0x0805,0x0805
DCW 0x0805,0x0805,0x0805,0x0805,0x0806,0x0806,0x0806,0x0806
DCW 0x0806,0x0806,0x0806,0x0806,0x0806,0x0806,0x0806,0x0806
DCW 0x0806,0x0807,0x0807,0x0807,0x0807,0x0807,0x0807,0x0807
DCW 0x0807,0x0807,0x0807,0x0807,0x0807,0x0808,0x0808,0x0808
DCW 0x0808,0x0808,0x0808,0x0808,0x0808,0x0808,0x0808,0x0808
DCW 0x0809,0x0809,0x0809,0x0809,0x0809,0x0809,0x0809,0x0809
DCW 0x0809,0x0809,0x080A,0x080A,0x080A,0x080A,0x080A,0x080A
DCW 0x080A,0x080A,0x080A,0x080A,0x080B,0x080B,0x080B,0x080B
DCW 0x080B,0x080B,0x080B,0x080B,0x080B,0x080B,0x080C,0x080C
DCW 0x080C,0x080C,0x080C,0x080C,0x080C,0x080C,0x080C,0x080D
DCW 0x080D,0x080D,0x080D,0x080D,0x080D,0x080D,0x080D,0x080E
DCW 0x080E,0x080E,0x080E,0x080E,0x080E,0x080E,0x080E,0x080E
DCW 0x080F,0x080F,0x080F,0x080F,0x080F,0x080F,0x080F,0x080F
DCW 0x0810,0x0810,0x0810,0x0810,0x0810,0x0810,0x0810,0x0810
DCW 0x0811,0x0811,0x0811,0x0811,0x0811,0x0811,0x0811,0x0811
DCW 0x0812,0x0812,0x0812,0x0812,0x0812,0x0812,0x0812,0x0813
DCW 0x0813,0x0813,0x0813,0x0813,0x0813,0x0813,0x0814,0x0814
DCW 0x0814,0x0814,0x0814,0x0814,0x0814,0x0814,0x0815,0x0815
DCW 0x0815,0x0815,0x0815,0x0815,0x0816,0x0816,0x0816,0x0816
DCW 0x0816,0x0816,0x0816,0x0817,0x0817,0x0817,0x0817,0x0817
DCW 0x0817,0x0817,0x0818,0x0818,0x0818,0x0818,0x0818,0x0818
DCW 0x0819,0x0819,0x0819,0x0819,0x0819,0x0819,0x0819,0x081A
DCW 0x081A,0x081A,0x081A,0x081A,0x081A,0x081B,0x081B,0x081B
DCW 0x081B,0x081B,0x081B,0x081C,0x081C,0x081C,0x081C,0x081C
DCW 0x081C,0x081D,0x081D,0x081D,0x081D,0x081D,0x081D,0x081E
DCW 0x081E,0x081E,0x081E,0x081E,0x081E,0x081F,0x081F,0x081F
DCW 0x081F,0x081F,0x081F,0x0820,0x0820,0x0820,0x0820,0x0820
DCW 0x0820,0x0821,0x0821,0x0821,0x0821,0x0821,0x0822,0x0822
DCW 0x0822,0x0822,0x0822,0x0822,0x0823,0x0823,0x0823,0x0823
DCW 0x0823,0x0824,0x0824,0x0824,0x0824,0x0824,0x0824,0x0825
DCW 0x0825,0x0825,0x0825,0x0825,0x0826,0x0826,0x0826,0x0826
DCW 0x0826,0x0827,0x0827,0x0827,0x0827,0x0827,0x0828,0x0828
DCW 0x0828,0x0828,0x0828,0x0829,0x0829,0x0829,0x0829,0x0829
DCW 0x082A,0x082A,0x082A,0x082A,0x082A,0x082B,0x082B,0x082B
DCW 0x082B,0x082B,0x082C,0x082C,0x082C,0x082C,0x082C,0x082D
DCW 0x082D,0x082D,0x082D,0x082D,0x082E,0x082E,0x082E,0x082E
DCW 0x082E,0x082F,0x082F,0x082F,0x082F,0x0830,0x0830,0x0830
DCW 0x0830,0x0830,0x0831,0x0831,0x0831,0x0831,0x0831,0x0832
DCW 0x0832,0x0832,0x0832,0x0833,0x0833,0x0833,0x0833,0x0833
DCW 0x0834,0x0834,0x0834,0x0834,0x0835,0x0835,0x0835,0x0835
DCW 0x0835,0x0836,0x0836,0x0836,0x0836,0x0837,0x0837,0x0837
DCW 0x0837,0x0837,0x0838,0x0838,0x0838,0x0838,0x0839,0x0839
DCW 0x0839,0x0839,0x083A,0x083A,0x083A,0x083A,0x083A,0x083B
DCW 0x083B,0x083B,0x083B,0x083C,0x083C,0x083C,0x083C,0x083D
DCW 0x083D,0x083D,0x083D,0x083E,0x083E,0x083E,0x083E,0x083F
DCW 0x083F,0x083F,0x083F,0x0840,0x0840,0x0840,0x0840,0x0840
DCW 0x0841,0x0841,0x0841,0x0841,0x0842,0x0842,0x0842,0x0842
DCW 0x0843,0x0843,0x0843,0x0843,0x0844,0x0844,0x0844,0x0844
DCW 0x0845,0x0845,0x0845,0x0845,0x0846,0x0846,0x0846,0x0847
DCW 0x0847,0x0847,0x0847,0x0848,0x0848,0x0848,0x0848,0x0849
DCW 0x0849,0x0849,0x0849,0x084A,0x084A,0x084A,0x084A,0x084B
DCW 0x084B,0x084B,0x084B,0x084C,0x084C,0x084C,0x084D,0x084D
DCW 0x084D,0x084D,0x084E,0x084E,0x084E,0x084E,0x084F,0x084F
DCW 0x084F,0x0850,0x0850,0x0850,0x0850,0x0851,0x0851,0x0851
DCW 0x0851,0x0852,0x0852,0x0852,0x0853,0x0853,0x0853,0x0853
DCW 0x0854,0x0854,0x0854,0x0854,0x0855,0x0855,0x0855,0x0856
DCW 0x0856,0x0856,0x0856,0x0857,0x0857,0x0857,0x0858,0x0858
DCW 0x0858,0x0858,0x0859,0x0859,0x0859,0x085A,0x085A,0x085A
DCW 0x085A,0x085B,0x085B,0x085B,0x085C,0x085C,0x085C,0x085C
DCW 0x085D,0x085D,0x085D,0x085E,0x085E,0x085E,0x085F,0x085F
DCW 0x085F,0x085F,0x0860,0x0860,0x0860,0x0861,0x0861,0x0861
DCW 0x0861,0x0862,0x0862,0x0862,0x0863,0x0863,0x0863,0x0864
DCW 0x0864,0x0864,0x0864,0x0865,0x0865,0x0865,0x0866,0x0866
DCW 0x0866,0x0867,0x0867,0x0867,0x0868,0x0868,0x0868,0x0868
DCW 0x0869,0x0869,0x0869,0x086A,0x086A,0x086A,0x086B,0x086B
DCW 0x086B,0x086C,0x086C,0x086C,0x086C,0x086D,0x086D,0x086D
DCW 0x086E,0x086E,0x086E,0x086F,0x086F,0x086F,0x0870,0x0870
DCW 0x0870,0x0871,0x0871,0x0871,0x0872,0x0872,0x0872,0x0873
DCW 0x0873,0x0873,0x0874,0x0874,0x0874,0x0874,0x0875,0x0875
DCW 0x0875,0x0876,0x0876,0x0876,0x0877,0x0877,0x0877,0x0878
DCW 0x0878,0x0878,0x0879,0x0879,0x0879,0x087A,0x087A,0x087A
DCW 0x087B,0x087B,0x087B,0x087C,0x087C,0x087C,0x087D,0x087D
DCW 0x087D,0x087E,0x087E,0x087E,0x087F,0x087F,0x087F,0x0880
DCW 0x0880,0x0880,0x0881,0x0881,0x0881,0x0882,0x0882,0x0882
DCW 0x0883,0x0883,0x0883,0x0884,0x0884,0x0885,0x0885,0x0885
DCW 0x0886,0x0886,0x0886,0x0887,0x0887,0x0887,0x0888,0x0888
DCW 0x0888,0x0889,0x0889,0x0889,0x088A,0x088A,0x088A,0x088B
DCW 0x088B,0x088B,0x088C,0x088C,0x088D,0x088D,0x088D,0x088E
DCW 0x088E,0x088E,0x088F,0x088F,0x088F,0x0890,0x0890,0x0890
DCW 0x0891,0x0891,0x0892,0x0892,0x0892,0x0893,0x0893,0x0893
DCW 0x0894,0x0894,0x0894,0x0895,0x0895,0x0895,0x0896,0x0896
DCW 0x0897,0x0897,0x0897,0x0898,0x0898,0x0898,0x0899,0x0899
DCW 0x0899,0x089A,0x089A,0x089B,0x089B,0x089B,0x089C,0x089C
DCW 0x089C,0x089D,0x089D,0x089E,0x089E,0x089E,0x089F,0x089F
DCW 0x089F,0x08A0,0x08A0,0x08A1,0x08A1,0x08A1,0x08A2,0x08A2
DCW 0x08A2,0x08A3,0x08A3,0x08A4,0x08A4,0x08A4,0x08A5,0x08A5
DCW 0x08A5,0x08A6,0x08A6,0x08A7,0x08A7,0x08A7,0x08A8,0x08A8
DCW 0x08A9,0x08A9,0x08A9,0x08AA,0x08AA,0x08AA,0x08AB,0x08AB
DCW 0x08AC,0x08AC,0x08AC,0x08AD,0x08AD,0x08AE,0x08AE,0x08AE
DCW 0x08AF,0x08AF,0x08AF,0x08B0,0x08B0,0x08B1,0x08B1,0x08B1
DCW 0x08B2,0x08B2,0x08B3,0x08B3,0x08B3,0x08B4,0x08B4,0x08B5
DCW 0x08B5,0x08B5,0x08B6,0x08B6,0x08B7,0x08B7,0x08B7,0x08B8
DCW 0x08B8,0x08B9,0x08B9,0x08B9,0x08BA,0x08BA,0x08BB,0x08BB
DCW 0x08BB,0x08BC,0x08BC,0x08BD,0x08BD,0x08BD,0x08BE,0x08BE
DCW 0x08BF,0x08BF,0x08BF,0x08C0,0x08C0,0x08C1,0x08C1,0x08C1
DCW 0x08C2,0x08C2,0x08C3,0x08C3,0x08C3,0x08C4,0x08C4,0x08C5
DCW 0x08C5,0x08C5,0x08C6,0x08C6,0x08C7,0x08C7,0x08C8,0x08C8
DCW 0x08C8,0x08C9,0x08C9,0x08CA,0x08CA,0x08CA,0x08CB,0x08CB
DCW 0x08CC,0x08CC,0x08CD,0x08CD,0x08CD,0x08CE,0x08CE,0x08CF
DCW 0x08CF,0x08CF,0x08D0,0x08D0,0x08D1,0x08D1,0x08D2,0x08D2
DCW 0x08D2,0x08D3,0x08D3,0x08D4,0x08D4,0x08D4,0x08D5,0x08D5
DCW 0x08D6,0x08D6,0x08D7,0x08D7,0x08D7,0x08D8,0x08D8,0x08D9
DCW 0x08D9,0x08DA,0x08DA,0x08DA,0x08DB,0x08DB,0x08DC,0x08DC
DCW 0x08DD,0x08DD,0x08DD,0x08DE,0x08DE,0x08DF,0x08DF,0x08E0
DCW 0x08E0,0x08E0,0x08E1,0x08E1,0x08E2,0x08E2,0x08E3,0x08E3
DCW 0x08E4,0x08E4,0x08E4,0x08E5,0x08E5,0x08E6,0x08E6,0x08E7
DCW 0x08E7,0x08E7,0x08E8,0x08E8,0x08E9,0x08E9,0x08EA,0x08EA
DCW 0x08EB,0x08EB,0x08EB,0x08EC,0x08EC,0x08ED,0x08ED,0x08EE
DCW 0x08EE,0x08EF,0x08EF,0x08EF,0x08F0,0x08F0,0x08F1,0x08F1
DCW 0x08F2,0x08F2,0x08F3,0x08F3,0x08F3,0x08F4,0x08F4,0x08F5
DCW 0x08F5,0x08F6,0x08F6,0x08F7,0x08F7,0x08F8,0x08F8,0x08F8
DCW 0x08F9,0x08F9,0x08FA,0x08FA,0x08FB,0x08FB,0x08FC,0x08FC
DCW 0x08FD,0x08FD,0x08FD,0x08FE,0x08FE,0x08FF,0x08FF,0x0900
DCW 0x0900,0x0901,0x0901,0x0902,0x0902,0x0902,0x0903,0x0903
DCW 0x0904,0x0904,0x0905,0x0905,0x0906,0x0906,0x0907,0x0907
DCW 0x0908,0x0908,0x0908,0x0909,0x0909,0x090A,0x090A,0x090B
DCW 0x090B,0x090C,0x090C,0x090D,0x090D,0x090E,0x090E,0x090F
DCW 0x090F,0x0910,0x0910,0x0910,0x0911,0x0911,0x0912,0x0912
DCW 0x0913,0x0913,0x0914,0x0914,0x0915,0x0915,0x0916,0x0916
DCW 0x0917,0x0917,0x0918,0x0918,0x0918,0x0919,0x0919,0x091A
DCW 0x091A,0x091B,0x091B,0x091C,0x091C,0x091D,0x091D,0x091E
DCW 0x091E,0x091F,0x091F,0x0920,0x0920,0x0921,0x0921,0x0922
DCW 0x0922,0x0923,0x0923,0x0924,0x0924,0x0924,0x0925,0x0925
DCW 0x0926,0x0926,0x0927,0x0927,0x0928,0x0928,0x0929,0x0929
DCW 0x092A,0x092A,0x092B,0x092B,0x092C,0x092C,0x092D,0x092D
DCW 0x092E,0x092E,0x092F,0x092F,0x0930,0x0930,0x0931,0x0931
DCW 0x0932,0x0932,0x0933,0x0933,0x0934,0x0934,0x0935,0x0935
DCW 0x0936,0x0936,0x0937,0x0937,0x0938,0x0938,0x0939,0x0939
DCW 0x093A,0x093A,0x093B,0x093B,0x093C,0x093C,0x093D,0x093D
DCW 0x093E,0x093E,0x093F,0x093F,0x0940,0x0940,0x0941,0x0941
DCW 0x0942,0x0942,0x0943,0x0943,0x0944,0x0944,0x0945,0x0945
DCW 0x0946,0x0946,0x0947,0x0947,0x0948,0x0948,0x0949,0x0949
DCW 0x094A,0x094A,0x094B,0x094B,0x094C,0x094C,0x094D,0x094D
DCW 0x094E,0x094E,0x094F,0x094F,0x0950,0x0950,0x0951,0x0951
DCW 0x0952,0x0952,0x0953,0x0953,0x0954,0x0954,0x0955,0x0956
DCW 0x0956,0x0957,0x0957,0x0958,0x0958,0x0959,0x0959,0x095A
DCW 0x095A,0x095B,0x095B,0x095C,0x095C,0x095D,0x095D,0x095E
DCW 0x095E,0x095F,0x095F,0x0960,0x0960,0x0961,0x0961,0x0962
DCW 0x0962,0x0963,0x0964,0x0964,0x0965,0x0965,0x0966,0x0966
DCW 0x0967,0x0967,0x0968,0x0968,0x0969,0x0969,0x096A,0x096A
DCW 0x096B,0x096B,0x096C,0x096C,0x096D,0x096E,0x096E,0x096F
DCW 0x096F,0x0970,0x0970,0x0971,0x0971,0x0972,0x0972,0x0973
DCW 0x0973,0x0974,0x0974,0x0975,0x0976,0x0976,0x0977,0x0977
DCW 0x0978,0x0978,0x0979,0x0979,0x097A,0x097A,0x097B,0x097B
DCW 0x097C,0x097C,0x097D,0x097E,0x097E,0x097F,0x097F,0x0980
DCW 0x0980,0x0981,0x0981,0x0982,0x0982,0x0983,0x0983,0x0984
DCW 0x0985,0x0985,0x0986,0x0986,0x0987,0x0987,0x0988,0x0988
DCW 0x0989,0x0989,0x098A,0x098B,0x098B,0x098C,0x098C,0x098D
DCW 0x098D,0x098E,0x098E,0x098F,0x098F,0x0990,0x0991,0x0991
DCW 0x0992,0x0992,0x0993,0x0993,0x0994,0x0994,0x0995,0x0996
DCW 0x0996,0x0997,0x0997,0x0998,0x0998,0x0999,0x0999,0x099A
DCW 0x099A,0x099B,0x099C,0x099C,0x099D,0x099D,0x099E,0x099E
DCW 0x099F,0x099F,0x09A0,0x09A1,0x09A1,0x09A2,0x09A2,0x09A3
DCW 0x09A3,0x09A4,0x09A4,0x09A5,0x09A6,0x09A6,0x09A7,0x09A7
DCW 0x09A8,0x09A8,0x09A9,0x09AA,0x09AA,0x09AB,0x09AB,0x09AC
DCW 0x09AC,0x09AD,0x09AD,0x09AE,0x09AF,0x09AF,0x09B0,0x09B0
DCW 0x09B1,0x09B1,0x09B2,0x09B3,0x09B3,0x09B4,0x09B4,0x09B5
DCW 0x09B5,0x09B6,0x09B7,0x09B7,0x09B8,0x09B8,0x09B9,0x09B9
DCW 0x09BA,0x09BA,0x09BB,0x09BC,0x09BC,0x09BD,0x09BD,0x09BE
DCW 0x09BE,0x09BF,0x09C0,0x09C0,0x09C1,0x09C1,0x09C2,0x09C2
DCW 0x09C3,0x09C4,0x09C4,0x09C5,0x09C5,0x09C6,0x09C7,0x09C7
DCW 0x09C8,0x09C8,0x09C9,0x09C9,0x09CA,0x09CB,0x09CB,0x09CC
DCW 0x09CC,0x09CD,0x09CD,0x09CE,0x09CF,0x09CF,0x09D0,0x09D0
DCW 0x09D1,0x09D1,0x09D2,0x09D3,0x09D3,0x09D4,0x09D4,0x09D5
DCW 0x09D6,0x09D6,0x09D7,0x09D7,0x09D8,0x09D8,0x09D9,0x09DA
DCW 0x09DA,0x09DB,0x09DB,0x09DC,0x09DD,0x09DD,0x09DE,0x09DE
DCW 0x09DF,0x09DF,0x09E0,0x09E1,0x09E1,0x09E2,0x09E2,0x09E3
DCW 0x09E4,0x09E4,0x09E5,0x09E5,0x09E6,0x09E7,0x09E7,0x09E8
DCW 0x09E8,0x09E9,0x09E9,0x09EA,0x09EB,0x09EB,0x09EC,0x09EC
DCW 0x09ED,0x09EE,0x09EE,0x09EF,0x09EF,0x09F0,0x09F1,0x09F1
DCW 0x09F2,0x09F2,0x09F3,0x09F4,0x09F4,0x09F5,0x09F5,0x09F6
DCW 0x09F7,0x09F7,0x09F8,0x09F8,0x09F9,0x09FA,0x09FA,0x09FB
DCW 0x09FB,0x09FC,0x09FD,0x09FD,0x09FE,0x09FE,0x09FF,0x09FF
DCW 0x0A00,0x0A01,0x0A01,0x0A02,0x0A03,0x0A03,0x0A04,0x0A04
DCW 0x0A05,0x0A06,0x0A06,0x0A07,0x0A07,0x0A08,0x0A09,0x0A09
DCW 0x0A0A,0x0A0A,0x0A0B,0x0A0C,0x0A0C,0x0A0D,0x0A0D,0x0A0E
DCW 0x0A0F,0x0A0F,0x0A10,0x0A10,0x0A11,0x0A12,0x0A12,0x0A13
DCW 0x0A13,0x0A14,0x0A15,0x0A15,0x0A16,0x0A16,0x0A17,0x0A18
DCW 0x0A18,0x0A19,0x0A1A,0x0A1A,0x0A1B,0x0A1B,0x0A1C,0x0A1D
DCW 0x0A1D,0x0A1E,0x0A1E,0x0A1F,0x0A20,0x0A20,0x0A21,0x0A21
DCW 0x0A22,0x0A23,0x0A23,0x0A24,0x0A25,0x0A25,0x0A26,0x0A26
DCW 0x0A27,0x0A28,0x0A28,0x0A29,0x0A29,0x0A2A,0x0A2B,0x0A2B
DCW 0x0A2C,0x0A2D,0x0A2D,0x0A2E,0x0A2E,0x0A2F,0x0A30,0x0A30
DCW 0x0A31,0x0A32,0x0A32,0x0A33,0x0A33,0x0A34,0x0A35,0x0A35
DCW 0x0A36,0x0A36,0x0A37,0x0A38,0x0A38,0x0A39,0x0A3A,0x0A3A
DCW 0x0A3B,0x0A3B,0x0A3C,0x0A3D,0x0A3D,0x0A3E,0x0A3F,0x0A3F
DCW 0x0A40,0x0A40,0x0A41,0x0A42,0x0A42,0x0A43,0x0A44,0x0A44
DCW 0x0A45,0x0A45,0x0A46,0x0A47,0x0A47,0x0A48,0x0A49,0x0A49
DCW 0x0A4A,0x0A4B,0x0A4B,0x0A4C,0x0A4C,0x0A4D,0x0A4E,0x0A4E
DCW 0x0A4F,0x0A50,0x0A50,0x0A51,0x0A51,0x0A52,0x0A53,0x0A53
DCW 0x0A54,0x0A55,0x0A55,0x0A56,0x0A57,0x0A57,0x0A58,0x0A58
DCW 0x0A59,0x0A5A,0x0A5A,0x0A5B,0x0A5C,0x0A5C,0x0A5D,0x0A5D
DCW 0x0A5E,0x0A5F,0x0A5F,0x0A60,0x0A61,0x0A61,0x0A62,0x0A63
DCW 0x0A63,0x0A64,0x0A64,0x0A65,0x0A66,0x0A66,0x0A67,0x0A68
DCW 0x0A68,0x0A69,0x0A6A,0x0A6A,0x0A6B,0x0A6C,0x0A6C,0x0A6D
DCW 0x0A6D,0x0A6E,0x0A6F,0x0A6F,0x0A70,0x0A71,0x0A71,0x0A72
DCW 0x0A73,0x0A73,0x0A74,0x0A75,0x0A75,0x0A76,0x0A76,0x0A77
DCW 0x0A78,0x0A78,0x0A79,0x0A7A,0x0A7A,0x0A7B,0x0A7C,0x0A7C
DCW 0x0A7D,0x0A7E,0x0A7E,0x0A7F,0x0A80,0x0A80,0x0A81,0x0A81
DCW 0x0A82,0x0A83,0x0A83,0x0A84,0x0A85,0x0A85,0x0A86,0x0A87
DCW 0x0A87,0x0A88,0x0A89,0x0A89,0x0A8A,0x0A8B,0x0A8B,0x0A8C
DCW 0x0A8D,0x0A8D,0x0A8E,0x0A8E,0x0A8F,0x0A90,0x0A90,0x0A91
DCW 0x0A92,0x0A92,0x0A93,0x0A94,0x0A94,0x0A95,0x0A96,0x0A96
DCW 0x0A97,0x0A98,0x0A98,0x0A99,0x0A9A,0x0A9A,0x0A9B,0x0A9C
DCW 0x0A9C,0x0A9D,0x0A9E,0x0A9E,0x0A9F,0x0AA0,0x0AA0,0x0AA1
DCW 0x0AA1,0x0AA2,0x0AA3,0x0AA3,0x0AA4,0x0AA5,0x0AA5,0x0AA6
DCW 0x0AA7,0x0AA7,0x0AA8,0x0AA9,0x0AA9,0x0AAA,0x0AAB,0x0AAB
DCW 0x0AAC,0x0AAD,0x0AAD,0x0AAE,0x0AAF,0x0AAF,0x0AB0,0x0AB1
DCW 0x0AB1,0x0AB2,0x0AB3,0x0AB3,0x0AB4,0x0AB5,0x0AB5,0x0AB6
DCW 0x0AB7,0x0AB7,0x0AB8,0x0AB9,0x0AB9,0x0ABA,0x0ABB,0x0ABB
DCW 0x0ABC,0x0ABD,0x0ABD,0x0ABE,0x0ABF,0x0ABF,0x0AC0,0x0AC1
DCW 0x0AC1,0x0AC2,0x0AC3,0x0AC3,0x0AC4,0x0AC5,0x0AC5,0x0AC6
DCW 0x0AC7,0x0AC7,0x0AC8,0x0AC9,0x0AC9,0x0ACA,0x0ACB,0x0ACB
DCW 0x0ACC,0x0ACD,0x0ACD,0x0ACE,0x0ACF,0x0ACF,0x0AD0,0x0AD1
DCW 0x0AD1,0x0AD2,0x0AD3,0x0AD3,0x0AD4,0x0AD5,0x0AD5,0x0AD6
DCW 0x0AD7,0x0AD8,0x0AD8,0x0AD9,0x0ADA,0x0ADA,0x0ADB,0x0ADC
DCW 0x0ADC,0x0ADD,0x0ADE,0x0ADE,0x0ADF,0x0AE0,0x0AE0,0x0AE1
DCW 0x0AE2,0x0AE2,0x0AE3,0x0AE4,0x0AE4,0x0AE5,0x0AE6,0x0AE6
DCW 0x0AE7,0x0AE8,0x0AE8,0x0AE9,0x0AEA,0x0AEA,0x0AEB,0x0AEC
DCW 0x0AED,0x0AED,0x0AEE,0x0AEF,0x0AEF,0x0AF0,0x0AF1,0x0AF1
DCW 0x0AF2,0x0AF3,0x0AF3,0x0AF4,0x0AF5,0x0AF5,0x0AF6,0x0AF7
DCW 0x0AF7,0x0AF8,0x0AF9,0x0AF9,0x0AFA,0x0AFB,0x0AFC,0x0AFC
DCW 0x0AFD,0x0AFE,0x0AFE,0x0AFF,0x0B00,0x0B00,0x0B01,0x0B02
DCW 0x0B02,0x0B03,0x0B04,0x0B04,0x0B05,0x0B06,0x0B07,0x0B07
DCW 0x0B08,0x0B09,0x0B09,0x0B0A,0x0B0B,0x0B0B,0x0B0C,0x0B0D
DCW 0x0B0D,0x0B0E,0x0B0F,0x0B10,0x0B10,0x0B11,0x0B12,0x0B12
DCW 0x0B13,0x0B14,0x0B14,0x0B15,0x0B16,0x0B16,0x0B17,0x0B18
DCW 0x0B18,0x0B19,0x0B1A,0x0B1B,0x0B1B,0x0B1C,0x0B1D,0x0B1D
DCW 0x0B1E,0x0B1F,0x0B1F,0x0B20,0x0B21,0x0B22,0x0B22,0x0B23
DCW 0x0B24,0x0B24,0x0B25,0x0B26,0x0B26,0x0B27,0x0B28,0x0B28
DCW 0x0B29,0x0B2A,0x0B2B,0x0B2B,0x0B2C,0x0B2D,0x0B2D,0x0B2E
DCW 0x0B2F,0x0B2F,0x0B30,0x0B31,0x0B32,0x0B32,0x0B33,0x0B34
DCW 0x0B34,0x0B35,0x0B36,0x0B36,0x0B37,0x0B38,0x0B39,0x0B39
DCW 0x0B3A,0x0B3B,0x0B3B,0x0B3C,0x0B3D,0x0B3D,0x0B3E,0x0B3F
DCW 0x0B40,0x0B40,0x0B41,0x0B42,0x0B42,0x0B43,0x0B44,0x0B45
DCW 0x0B45,0x0B46,0x0B47,0x0B47,0x0B48,0x0B49,0x0B49,0x0B4A
DCW 0x0B4B,0x0B4C,0x0B4C,0x0B4D,0x0B4E,0x0B4E,0x0B4F,0x0B50

Младшее значение 0x800h, что означает 2048. Cтаршее 0xB50, и оно означает 2896.

2896/2048 = 1.414, что соответствует 1/cos(45).

Для получения индекса массива, необходимо умножить Y на 2048 и разделить на Х.

Полученный индекс укажет на ячейку массива, из этой ячейки извлекаем значение, умножаем X на него и делим на 2048. Полученный результат есть длинна вектора.

Хочу заметить, что деление и умножение на 2048 выполняется сдвигом, и еще одно деление и умножение выполняется специальными командами или алгоритмами, если в используемой платформе нет команд умножения и/или деления.

В моем случае, применялся микроконтроллер STM32F103, который имел команды деления и умножения.

Подведем итог алгоритма.

Получившаяся программа на языке ассемблер для STM32F103.

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

Возьмем синий вектор (из третьей области).

Его координаты X=-45,Y=-126 (можно проверить по пикселям)

(-45)^2+(-126)^2=2025+15876=17901
SQR(17901)=133 (усечено до целого)

пункт 1: 2002>2047? -> нет. X=2047-2002=45
пункт 2: 1921>2047? -> нет. Y=2047-1921=126
пункт 3: 126>45 -> да. меняем местами X=126, Y=45
пункт 4: X=0 -> нет. продолжаем
пункт 5: Y=Y*2048, Y=45*2048=92160
пункт 6: I=Y/X, I=92160/126=731
Пункт 7: в таблице 255 строк по 8 значений, ищем 731е значение.
Это 91я строка и 3е значение, которое равно 0x087e, или 2174 в десятичном
виде.
Пункт 8: X=X*2174, X=126*2174=273924
Пункт 9: A=X/2048, A=273924/2048=133 (усечено до целого)

Ч.Т.Д.

Теперь возьмем зеленый вектор (из четвертой области).

Его координаты X=-170,Y=95 (можно проверить по пикселям).

(-170)^2+(95)^2=28900+9025=37925
SQR(37925)=194 (усечено до целого)

пункт 1: 1877>2047? -> нет. X=2047-1877=170
пункт 2: 2142>2047? -> да. Y=2142-2047=95
пункт 3: 95>170 -> нет. оставляем как есть.
пункт 4: X=0 -> нет. продолжаем
пункт 5: Y=Y*2048, Y=95*2048=194560
пункт 6: I=Y/X, I=194560/170=1144
Пункт 7: в таблице ищем 1144е значение.
Это 143я строка и 0е значение, которое равно 0x092A, или 2346 в десятичном виде.
Пункт 8: X=X*2346, X=170*2346=398820
Пункт 9: A=X/2048, A=398820/2048=194 (усечено до целого)

Ч.Т.Д.

Подобный алгоритм можно использовать в ЦОС (как я), например, можно заметно ускорить Быстрое Преобразование Фурье. Также можно использовать в компьютерной графике, где используется трассировка лучей. Возможно и еще есть применение.

На этом все. Спасибо за внимание.

Let's block ads! (Why?)

[Из песочницы] Автоматизированная квартира инженера. Часть 1: постановка задачи, выбор железа

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

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

  • управление светом;
  • управление микроклиматом (теплый пол, радиаторы отопления, кондиционеры);
  • управление шторами;
  • управление системой защиты от протечек;
  • автоматический учет потребления воды и электроэнергии;
  • интеграция мультирум;
  • управление телевизором;
  • возможность управления всем со смартфона;
  • гости не должны испытывать дискомфорт, управление элементами освещения должно быть, как в обычной квартире

Как видите, список хотелок значительно расширился, в связи с чем остро стал вопрос выбора железа для реализации. Как инженер промышленной автоматизации, я сразу же отмел варианты типа ардуино и всяких «умных» устройств на батарейках с Wi-Fi, которые предлагает Xiaomi. Только готовые ПЛК с модулями ввода вывода и проводные выключатели.

В итоге изучения всевозможной информации в течение нескольких месяцев пришел к выводу, что оптимальным будет использовать ПЛК в связке с платформой умного дома OpenHAB или Home Assistant. Но теперь краеугольным камней стоит выбор ПЛК. Выбор сейчас происходит из нескольких вариантов.

Вариант 1. Segnetics Matrix + модули ввода/вывода FMR


Среднебюджетный вариант.

image

Плюсы:

  • простая среда разработки SMLogix;
  • имеется форум и сообщество пользователей.

Минусы:
  • отсутствие встроенного WEB-сервера;
  • непонятно, можно ли будет подкрутить MQTT;
  • контроллер новый, могут быть косяки.

Вариант 2. ОВЕН ПЛК210 + модули ввода/вывода МВ210, МУ210


Среднебюджетный вариант.

image

Плюсы:

  • среда разработки Codesys 3.5 со встроенным WEB-сервером;
  • в перспективе поддержка MQTT;
  • есть форум и сообщество

Минусы:
  • новый необкатанный контроллер, возможны косяки;
  • нет доверия к производителю (имеется негативный опыт реализации проектов).

Вариант 3. ПЛК и модули ввода/вывода Berghof


Высокобюджетный вариант.

image

Плюсы:

  • среда разработки Codesys 3.5;
  • надежный испытанный контроллер;
  • модули ввода/вывода по EtherCAT.

Минусы:
  • цена (самый дорогой вариант из перечисленных);
  • нет поддержки MQTT.

Вариант 4. WirenBoard 6 и модули ввода/вывода


Низкобюджетный вариант.

image

Плюсы:

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

Минусы:
  • дизайн встроенного WEB-сервера нельзя конфигурировать;
  • язык программирования на основе JavaScript (будет тяжело реализовать все задумки, так как новая среда для меня);
  • мало документации по программированию и конфигурированию.
  • нет сообщества пользователей.

По большому счету из четырех вариантов, сейчас я выбираю между Овен и WirenBoard. На стороне WirenBoard сейчас стоит обилие протоколов и заявленная заточенность под умный дом, на стороны Овен стоит мой опыт работы с Codesys и гарантированная реализация управления с WEB-интерфейса без OpenHAB.

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

Let's block ads! (Why?)

HackTheBox. Прохождение Traverxec. RCE в веб-сервере nostromo, техника GTFOBins

image

Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox.

В данной статье получим RCE в веб-сервере nostromo, получим оболочку meterpreter из под активной сессии metasploit, покопаемся в конфигах nostromo, побрутим пароль шифрования SSH ключа и проэксплуатируем технику GTFOBins для повышения привилегий.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

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


Recon


Данная машина имеет IP адрес 10.10.10.165, который я добавляю в /etc/hosts.
10.10.10.165    traverxec.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 1000 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.165 --rate=1000

image

Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.

nmap -A traverxec.htb -p22,80

image

Таким образом мы имеем SSH и веб-сервер Nostromo.

Давайте проверим веб-сервер Nostromo на известные эксплоиты для версии 1.9.6. Для этих целей можно использовать searchsploit, данная программа предоставляет возможность удобной работы с эксплоитами, которые есть в базе exploit-db.

image

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

Entry Point


Загружаем msfconsole и выполним поиск эксплоита.

image

Теперь мы знаем полное имя эксплоита и можем его использовать. После загрузки эксплоита просмотрим информацию о нем. Так мы узнаем базовые опции для его использования и описание самого эксплоита.

image

image

Отлично! Данный эксплоит подходит для нашей версии nostromo. Задаем базовые опции и проверяем работу эксплоита.

image

Для удобства работы получим meterpreter оболочку. Для этого отправим сессию работать в фоне — Ctrl+Z и подтверждаем. И если посмотрим работающие сессии, то увидим ту, которую только что свернули.

image

Для получения оболочки meterpreter в работающей сессии можно использовать модуль пост эксплуатации post/multi/manage/shell_to_meterpreter. Быстро использовать этот модуль можно следующим образом.

image

Нам сообщают, что оболочка meterpreter открыта во второй сессии. Поэтому запускаем вторую сессию.

image

USER


И первым делом нужно осмотреться на хосте. Для этого загружаем на машину скрипт перечисления для Linux.

image

Далее вызываем шелл, даем право на исполнение и запускаем скрипт.

image

Анализируя вывод, находим хеш пароля из .htpasswd.

image

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

image

Далее просмотрим файл nhttp.conf.

image

Дело в том, что корневая директория в nostromo указывается в файле конфигурации как homedirs_public. То есть это директория public_www. Данная директория расположена в домашней (homedirs — /home) директории пользователя (serveradmin — david@traverxec.htb). Обобщая вышесказанное, файл index.html расположен в директории /home/david/public_www. Чтобы пользователи смогли обращаться к данной странице — директория должна иметь права на чтение для всех.

image

Догадки подтверждаются. К тому же мы видим какую-то директорию, давайте глянем что там.

image

Там находим бэкап SSH файлов. Скачаем их.

image

Разархивируем файлы.

image

И у нас есть приватный ключ пользователя, но при попытке подключиться, у нас спрашивают пароль. Это значит, что ключ зашифрован.

image

Но мы можем пробрутить его. Сначала приведем к нужному формату.

image

Сохраним хеш в файл и пробрутим по словарю rockyou.txt с помощью JohnTheRipper.

image

Так мы находим пароль шифрования ключа. С помощью него и ключа подключаемся по SSH.

image

ROOT


Смотрим, что у нас есть в директории пользователя.

image

В директории bin находим интересные файл. Разберемся, что за скрипт.

image

Данный скрипт выводить строки после чего из-под sudo выполняет команду, вывод которой передает в cat, что очень интересно. Выполним данную команду и увидим довольно массивный вывод.

image

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

Дело в том, что если мы сожмем окно терминала, и выполним команду без перевода вывода в cat, то вывод автоматически будет направлен в less, откуда мы можем получить шелл используя !/bin/sh. Так как команда выполняется под sudo, мы получим шелл с максимальными привилегиями.

image

image

image

image

Так мы получаем пользователя root в системе.

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

Let's block ads! (Why?)

IBM проведет бесплатные курсы по COBOL и выложит их на GitHub

Согласно информации портала INPUT, компания IBM на следующей неделе собирается провести бесплатные обучающие курсы по COBOL для программистов. Спустя шесть десятилетий после своего появления этот язык программирования до сих пор востребован. Вдобавок сейчас спрос на специалистов по COBOL резко увеличился. Тем более, что даже в настоящее время сейчас IBM выпускает и поставляет корпоративным заказчикам мейнфреймы с поддержкой COBOL, которые особо популярны в течение несколько десятилетий в государственном и банковском секторе многих стран мира.
Мероприятия по обучению и распространению курсов COBOL будут выполняться по инициативе IBM и Open Mainframe Project, а их оперативная цель — возрождение и поддержание сообщества программистов на COBOL.

Все обучающие материалы по курсы программирования COBOL будут через некоторое время выложены на GitHub на странице проекта Open Mainframe Project. Этот ресурс создан специалистами организации Linux Foundation и предназначен для создания проектов с открытым исходным кодом для запуска на мейнфреймах.

На портале Open Mainframe Project специально для программистов COBOL созданы несколько форумов, причем на одном из них актуализируется информация о текущих программистах, которые могут помочь многих компаниям в текущей проблемной ситуации с нехваткой специалистов по COBOL для обслуживании перегруженных систем многих организаций.

Пользователи на портале Reddit также поддержали инициативу IBM и Open Mainframe Project, причем некоторые даже объясняли, как важен COBOL в настоящее время.

Ранее в начале апреля 2020 года губернатор штата Нью-Джерси начал разыскивать программистов, знающих язык Cobol. Необходимость в таких специалистах очень срочно возросла из-за того, что мейнфреймы, которые до сих пор используются в правительственных учреждениях штата, не справляются с всплеском запросов на выплату пособий по безработице, причем объем запросов на получение пособий в штате вырос на 1600%. COBOL активно применяется не только в социальных государственных системах, но и в финансовых организациях, так около 43% приложений, используемых в банковских сферах, и 95% банкоматов по всему миру в тех или иных масштабах используют COBOL.

Десять лет назад на Хабре была такая публикация про COBOL, которая заканчивалась словами: «Теперь уже «Кобол» не является полем для проведения активных исследований и научных работ. Никто не идёт в колледж, планируя изучать язык «Кобол», да и вы скорее всего насмешками будете выгнаны из своего IT-отдела, если предложите следующий проект реализовать на этом языке программирования». Теперь же в 2020 году мир изменился, а программисты быстро адаптируются, изучая для себя новые, а по факту старые языки.

Let's block ads! (Why?)

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

[Из песочницы] Залечь на дно в Генте

Как я решил стать биологом

О смене поля деятельности я задумался примерно на восьмом году своей IT карьеры. За это время я успел побыть Android, iOS, Ruby разработчиком и менеджером, как на родных просторах, так и зарубежом. Не буду вдаваться в подробности поисков себя, скажу лишь что биология мне была интересна со школы(не в последнюю очередь из-за молодых и симпатичных учительниц!). В итоге я поступил в магистратуру Гентского университета(Gent University) по специальности Биоинформатика: Системная биология.

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


Почему Гент


В Генте дождливо, но по-своему уютно

У меня сложилось впечатление что о Генте за пределами Бельгии мало кто слышал, по крайней мере среди коллег на моей прошлой работе. Да и вообще, за 5 лет жизни в Германии я не встречал ни одного бельгийца, в отличие от поляков, французов, итальянцев и выходцев из бывшего СССР. Гент довольно небольшой город, и он не был первым в моем списке когда я выбирал место обучения. Однако, сыграли роль несколько факторов:


  • Стоимость обучения. Я не гражданин ЕС, поэтому в большинстве стран Евросоюза образование для меня дороже чем для местных. Например, в Швеции или Финляндии один год обучения в магистратуре стоит 14-18 тысяч евро. В Бельгии же эта сумма в несколько раз меньше: в UGent я плачу примерно 2000 евро в год.
  • Оказалось что Гент, да и вся Фландрия(часть Бельгии которая говорит по-голландски) довольно сильна в биотехнологиях. Кроме Гента здесь есть Католический университет Лёвена, исследовательский институт VIB, и другие. Все они тесно сотрудничают, участвуют в совместных проектах и дают начало многочисленным спин-оффам.

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


Поступление

Диплом бакалавра я получил в далеком 2012 году в Севастополе, причем вуза моего уже юридически не существует. СевНТУ прекратил свое существование в 2014 году, и поначалу у меня было подозрение что подтвердить подлинность своего диплома я никак не смогу. Например, в США требуется чтобы вуз, выдавший диплом, отправил физическое письмо с вашими оценками. Можно сказать что мне повезло и оказалось достаточно заполучить апостиль на диплом в одном восточноевропейском государстве. Пара сотен евро, несколько раундов пересылки документов по маршруту Киев-Берлин(а жил на тот момент в Берлине) и вожделенная красная ленточка апостиля украсила мой диплом и дала ему юридическую силу.

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

Я подал заявку в 8 университетов по всей Европе и поступил в 6. Подача документов в UGent бесплатная, в других вузах иногда необходимо заплатить 50-70 евро. В итоге легализация документов, подача заявок и сдача TOEFL обошлись примерно в 600-700 евро.

Прием заявок в вузы в Европе в основном начинается раньше чем мы привыкли, зачастую в ноябре. А заканчивается для кандидатов не из ЕС примерно в январе, так что стоит заранее все спланировать.


Переезд в Гент

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

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

Первым делом по приезду нужно зарегистрироваться в университете. Там вы показываете оригинал диплома, фотографируетесь и официально становитесь студентом.


Спустя 8 лет я опять студент. И да, не спрашивайте про имя

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

Университет устраивает мероприятия для студентов-иностранцев, где ректор дает напутственное слово и напоминает что девиз университета: "Dare to think". Есть возможность записаться на бесплатные экскурсии по городу с местными гидами.


Без соцсетей нынче никуда.

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

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

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


Учебный процесс

Я могу сравнивать только с тем, что было доступно в Севастополе в 2008-2012 годах, а учились мы тогда на приборах сталинских времен. Поэтому первое впечатление было довольно благоприятным.

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

Все общение с преподавателями, сдача работ и учебные материалы доступны через сайт Ufora(который является системой Brightspace), либо по электронной почте. Презентации и практические занятия по многим предметам довольно высокого качества.

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


Курс с колоритными коллегами

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

По прошествии пары месяцев начинаешь замечать некоторые огрехи. Качество материалов и преподавания очень сильно зависит от преподавателя(наверное как и везде). Некоторые профессоры не идут в ногу со временем и под видом "state of the art" подают технологии которые таковыми не являются. Для тех кто в теме, половина курса по анализу омиксных данных была посвящена различным микрочипам(microarray), а Hi-C, Nanopore и scRNA-seq были упомянуты лишь вскользь. Некоторые преподаватели приходят просто, что называется, "отчитать лекции". Курс молекулярной биологии в Генте был худшим что я когда либо проходил.

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

Отличительной особенностью является упор на групповые проекты. Группы из 3-5 человек собираются, самоорганизовываются, решают какую-либо задачу и пишут отчет. Такой вид заданий конечно же больше похож на то чем специалисты будут заниматься в реальном мире. Хотя тут нужно сделать оговорку. Ранее я упомянул что в бельгийский вуз может поступить любой с диплом бакалавра. Думаю не сложно догадаться что некоторые из поступивших местных студентов не имеют ни малейшего желания учиться, а лишь числятся студентами. Поэтому если в группе случайным образом окажутся такие "коллеги", то весь групповой проект придется делать самому.

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

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

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

Близость к индустрии вообще является ключевой особенностью UGent, многие университетские проекты делаются на базе UZ Gent — университетского госпиталя. Таким образом новые методы диагностики сразу используются на поле боя.

Главная проблема на моей специальности это разнородный опыт студентов. К примеру курс "Python for Bioinformatics" оказался просто базовым курсом по питону, на котором я появился один раз в начале и один раз в конце учебного года. Людям без особого опыта программирования этот курс показался очень сложным, не все сдали экзамен с первого раза и отправятся летом на пересдачу. С другой стороны, я иногда теряюсь когда разговор заходит о сложных феноменах молекулярной генетики.

Возрастной состав так же разнообразен. Я оказался даже не самым старшим в свои 28 лет, некоторым студентам — 30. Что интересно, местные практически не общаются с иностранцами. Не могу сказать дело ли в языке, "понаехали" или просто так сложилось.


Ну а как же вирус?

Университеты Фландрии решили перевести обучение в удаленный режим до конца этого семестра. Как будут проходить экзамены еще не ясно.


Семинары — только онлайн

Ранее я уже упоминал что качество материалов сильно зависит от преподавателя. Карантин усугубил проблемы некоторых лекторов, не имеющих хороших и подробных материалов. Некоторые из них, являющиеся учеными с мировым именем в своей области, вообще сказали что-то в духе "учите методичку к экзамену, как провести практические занятия я не знаю...". Хотя казалось бы, биоинформатика позволяет проводить практические занятия удаленно как нельзя проще, достаточно лишь написать инструкции и выложить код на гитхаб. Только сейчас я понял что хороший ученый != хороший учитель.

Для онлайн занятий используется Slack, Microsoft Teams и Skype for Business. К слову, университетская почта завязана на Microsoft аккаунт, да и вообще корпорация под руководством Сатьи Наделлы плотно засела в местной инфраструктуре. Поэтому студенты легально пользуются MS Office, а так же могут бесплатно попробовать Azure. Хотя продавить использование облака в исследованиях продажникам из Microsoft еще не удалось, тут есть свой суперкомпьютер и от существующей инфраструктуры отказываться не спешат.


Заключение

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

Если будет интересно, то смогу подробнее рассказать о задачах и методах биоинформатики.

Let's block ads! (Why?)

Защита и взлом Xbox 360 (Часть 2)


В прошлый раз мы оставили сцену Xbox 360 на моменте, когда разработчикам стало очевидно, что защита DVD-ROM легко обходится, и с этим точно нужно что-то делать. Попытки исправить ситуацию обновлением ПО самой приставки не увенчались успехом, и на поле битвы вступила компания Philips & Lite-On, DVD-приводы которой с каждой новой моделью становились всё более продвинутыми в плане защиты. Но и методы взлома с каждым разом становились всё более и более изощрёнными. В этой части я расскажу, как в Microsoft пытались исправить ситуацию с нелицензионными дисками, и до каких методов прошивки DVD-привода можно докатиться, когда закрыто буквально всё.

Встречаем — PLDS DG-16D2S 74850c


Привод Philips & LiteOn DG-16D2S начали ставить в игровые приставки в 2008 году, и ставили его аж до самого 2011 года, когда вышла новая, «slim» версия приставки. Вот наш герой:

Конечно же, исследователи сразу за него взялись и выяснили:
  • привод очень похож на прошлую модель, Philips & Benq VAD6038
  • прошивка хранится внутри контроллера, программатором не считать
  • в сервис-режим не заходит, даже на чипсетах VIA

Даже сам контроллер MT1319 на плате залит компаундом:

Было похоже, что Microsoft наконец сделали «невзламываемый» привод и всем придётся несладко. Однако спустя некоторое время разработчик модифицированных прошивок для Xbox 360 c4eva сообщил, что привод поддаётся и уже ведётся разработка кастомной прошивки:

c4eva: i have found some things that are not yet known about the lite-on, it will be done!

Не хочу ждать, меняем!


Пока кастомная прошивка разрабатывалась (а разрабатывалась она почти полгода), люди хотели прошивать «здесь и сейчас». И в конце августа 2008 исследователи нашли интересный трюк:
  • Включаем приставку
  • Открываем лоток DVD-привода
  • Выдергиваем питание DVD-привода
  • Задвигаем лоток на середину
  • Вставляем питание привода

После этих магических действий, привод выплёвывает в UART свой секретный ключ! Оставалось собрать простейший переходник COM-UART на одном транзисторе и ткнуть им в точку на плате в момент включения питания:
(исторически достоверная реконструкция с применением адаптера с тех самых времён)

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

Как только ключ получен, можно его записать в прошиваемый б/у привод, поменять ему имя на «PLDS DG-16D2S» и играть как ни в чём не бывало! (Первые ревизии Xbox 360 не славились надёжностью, потому на рынке было много б/у приводов TS-H943, снятых с полумёртвых приставок). Этот шаг сильно аукнулся в будущем, но на тот момент геймеры были довольны.


Во всей этой идиллии была проблема, причём пришла она оттуда, откуда не ждали. В чём суть — у Xbox 360 привода кабель питания нестандартный и короткий:

На штекере есть небольшие выступы для правильной ориентации в разъёме:

Операцию чтения ключа удобно проводить «на спинке», когда привод вверх тормашками. Но не слишком гибкий кабель питания при этом перевернуть забывали, длины ограничителей на штекере не хватало, в итоге 12 вольт уходило совсем не на те контакты, и из платы вылетал магический дымок…

Тем, кому «повезло» спалить привод, советовали аккуратно собрать приставку обратно и ничтоже сумняшеся сдать в магазин по гарантии. Часто магазин вообще не парился и принимал такие консоли, даже не проверив гарантийную пломбу.

Ура, прошивка!


Итак, почти после полугодового ожидания, на рождественские праздники c4eva выпустил релиз прошивки iXtreme 1.5, из которого мы узнали:
  • c4eva и его команда считали прошивку растворением корпуса чипа
  • Ключ читаем по-прежнему методом полузадвинутого лотка
  • Чтобы зайти в сервис-режим и записать прошивку, нужно стереть привод!

Я был уверен, что фотография с полурастворённым MT1319, подключенным к программатору, у меня имеется, но так и не смог её найти. Как только отыщу, добавлю её вот прям сюда (если у кого есть, пришлите, please).

Особенность «стереть перед записью» приводила к проблемам у народа — компьютер мог зависнуть, уйти в BSOD. Даже если всё «пошло так», после стирания привод, естественно, не определялся системой и входить в сервис-режим приходилось «вслепую». В общем, нервов с ним потрепали люди изрядно.
Встречались экспериментаторы, нажавшие кнопочку «стереть» просто из любопытства, не считав перед этим ключ, даже несмотря на предупреждения:


Но основная цель была достигнута — «непрошиваемый» LiteOn наконец стал прошиваемым, а умельцы с прямыми руками могли прошить привод самостоятельно.

DG-16D2S 83850c


Конечно же, в Microsoft спохватились и стали ставить в приставки привод с новой версией прошивки, 83850с, в которой функционал чтения ключа по UART уже не работал.

Удивительно, но обнаружилось, что LiteOn 83850c отдавал ключ по SATA, причём с тем же колдовством с полуоткрытым лотком! Foundmy.com выпустили утилиту LO83info, что читала ключ, но выдавала его в зашифрованном виде. Предлагалось отправить ключ авторам на почту и за $42 получить расшифрованный вариант.


Программа продержалась аж четыре дня, после чего Maximus и Geremia выпустили бесплатный дешифратор ключей :) Сколько за эти дни успели заработать авторы — неизвестно.

DG-16D2S 93450c


Халява с лёгким чтением ключей не могла долго продолжаться — вскоре начали попадаться LiteOn 83850c v2, которые не поддавались на уловки LO83Info, а затем в приставки и вовсе стали ставить LiteOn 93450c. Все способы чтения ключа закрыты, без ключа приставку не прошить…

Грустили недолго, энтузиасты обнаружили вот такую аппаратную багу:

  • отрезаем часть дорог питания
  • припаиваем через выключатель резистор 22 Ом
  • замыкаем питание через 22 Ом на GND!

В результате, напряжение на флешке внутри процессора настолько проседало, что вместо данных считывались одни 0xFF, привод был уверен, что прошивка уже стёрта и заходил в сервис режим! Ну а после входа в сервис-режим оставалось только разомкнуть резистор и считать флешку целиком:

Этот метод «прошивки» погубил ещё больше приводов, чем UART. Представьте, что может сделать школьник с советским паяльником в попытке припаять два проводка по схеме? Вот так это должно быть:

А вот такое можно было встретить на форумах:


Ну и поскольку уязвимость аппаратная, никаким обновлением прошивки Microsoft это поправить уже не могли, LiteOn DG-16D2S окончательно перешли в разряд прошиваемых приводов.

Совсем грустить перестали, когда обнаружили ещё более интересный хак:

  • включаем привод
  • отключаем линию питания 3.3в (линия 1.8в остаётся активной)
  • заземляем точку MPX01
  • включаем 3.3v
  • заходим в сервис и читаем ключ из ОЗУ!??


Точка MPX01 в приводе отвечает за то, будет ли расшифровываться прошивка при запуске. Замыкая её на GND, мы заставляем привод пропускать этап расшифровки, из-за чего он пытается запустить мусор и уходит в ошибку. И уже из этого состояния он разрешает зайти в ограниченный сервис-режим и считать ОЗУ! А за счет того, что 1.8v мы не убирали, ОЗУ не сбросилось и там до сих пор лежит наш ключ. Вот такие дела.

Новинка — PLDS DG-16D4S 9504


Вместе с Slim версией приставки в Xbox 360 обновился и DVD-привод. Изменился даже дизайн дисковода, у него пропали ноги и он стал ещё более похож на кирпич:

Контроллер привода также поменялся, теперь всем рулил чип MT1335

Удивительно, но новую модель, в отличие от предшественника, можно было считать и записать без каких-либо проблем. С этим быстро разобралась команда Maximus. Впереди планеты всей они выпустили утилиту для чтения/записи ключа/прошивки под названием «Tarablinda»:

И пока c4eva занимается разработкой… люди снова пихают прошиваемые б/ушные приводы старых моделей! Подрезав ноги и исковеркав корпус:

А вот возьмём и заблокируем!


На этот раз в Microsoft решили подойти с другой стороны. Раз люди всё равно находят способы прочитать ключ, давайте запретим его перезапись! В новых приставках начали обнаруживать приводы DG-16D4S версий 0225, 0401 и 1071, в которых внутренняя SPI флеш-память была залочена!
Блокировка была выполнена с использованием статус-регистра и ноги WP флеш-памяти:

Но и здесь придумали способ, очень похожий на то, как побороли LiteOn 93450c:
  • отрезаем дорогу питания
  • включаем привод, заходим в сервис
  • тыкаем резистором 18 Ом к отрезанному
  • подаём команду разблокировки!


Абсолютно аналогичным образом, напряжение питания SPI флеш-памяти проседало, что-то щёлкало у неё в электронных мозгах и разблокировка успешно завершалась. Работало такое только на флешках от фирмы MXIC:

Для Winbond же придумали ещё более безумный метод разблокировки.

Дело в том, что процессор DVD-привода не являлся цельным. Сверху на нём бутербродом был приклеен чип той самой флеш-памяти, соединённый с основным кристаллом тонкими проводками. И нужный нам проводок Write Protect (WP), несмотря на то, что был намертво заведен на заземление, довольно удачно находился выше всех остальных:


Возникла идея как-то его перерезать, а затем подать команду разблокировки. И да, именно здесь народ пошёл аккуратно и точно сверлить чип миллиметровым сверлом!

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

или так:

Но всё было не настолько плохо — чипы MT1335WE после (или вместо) неудачной разблокировки можно было перепаять на совместимые MT1339E с внешней флешкой, снятые с китайских дисководов:

Итог — снова победа не на стороне Microsoft, диски пишутся, приводы прошиваются.

AP 2.5, XGD3, ...


Microsoft не только улучшали прошивки приводов, но и дорабатывали защиту самих дисков с играми. И здесь они оторвались по-полной:

Во-первых, был изменён формат самого диска. Старый формат XGD2 вмещал, как и обычный двухслойный DVD, около 7.5 ГБ данных. Новый же XGD3 использовал чуть большую площадь диска, почти до самого края, за счёт чего влезало уже 8.5 ГБ данных. Обычными средствами «болванки» так записать нельзя.


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

Интересно, что этим способом были защищены только несколько популярных игр

В-третьих, для поддержи всех нововведений, все DVD-приводы на всех приставках были обновлены при очередном апдейте системы!

  • LiteOn D2S обновились и закрыли простые методы чтения ключа
  • Ранее прошиваемые LiteOn D4S 9504 обновились и заблокировались на запись
  • Тем, у кого приставки были «прошиты» нормально — пришлось «прошивать» заново
  • Кто менял привод на другую модель — получили ошибку и нерабочую приставку


В очень старых DVD-приводах Samsung TS-H943 нельзя было реализовать проверки AP 2.5, поэтому в их обновлении была добавлена только поддержка формата XGD3. Больше всего не повезло игрокам, кому при прошивке LiteOn заменили на Samsung — приходилось искать новый привод и менять обратно. Очень обидно было и владельцам LiteOn D4S 9504, им пришлось разблокировать чип для повторной прошивки.

Но и здесь всё обошли. Обнаружилось, что 7.5 ГБ не предел и на обычные двухслойные болванки вполне реально записать 8 ГБ и больше, что и требовалось для XGD3 игр. На обычных пишущих дисководах запись шла не до конца (на 97%), насколько хватит места — такие диски тоже работали, хоть и имелась угроза обнаружения и последующего бана. В дальнейшем c4eva выпустил программу с поддержкой некоторых компьютерных DVD-резаков, которая обманывала привод, снимала ограничения и заставляла его писать всю поверхность диска:


c4eva сделал и прошивку для приводов Xbox 360 — iXtreme LT+ для обхода новых защит — готовые ответы прямо из файла dae.bin записывались на диск с игрой, прошивка отвечала «по шаблону», все довольны. Но и в Microsoft поступили довольно очевидным образом — в очередном обновлении системы меняли dae.bin, пиратки переставали работать, диски приходилось патчить и записывать заново:

Спустя некоторое время, c4eva призадумался, и сказал, что придумал, как решить AP 2.5 раз и навсегда, мол, ждите iXtreme LT+ 3.0. Кстати, к тому моменту количество вопросов «ну когда уже новая прошивка??» в каналах IRC, где сидел c4eva настолько возросло, что кто-то сделал целый сайт c4evaspeaks.com, где сохранялись все его цитаты (буквально все!) и новости на тему прошивок:


В iXtreme LT+ 3.0 вместо ответа «по шаблону» использовались специальные данные о геометрии диска. По факту, лицензионный диск сканировали, генерировали и записывали на диск с игрой специальную «карту», по которой прошивка вычисляла и правильно отвечала на любые запросы AP 2.5.

На этом эпопея с AP 2.5 закончилась победой c4eva и его прошивок. Были попытки банить игроков, у которых сработали AP 2.5 проверки, но то ли баны зацепили и честных игроков, то ли доказать факт пиратства и 100% надёжности проверок не удалось, но баны тоже прекратились.

Легенда — PLDS DG-16D5S 1175


Финальную точку в борьбе за приводы поставил LiteOn DG-16D5S:

В нём стоял контроллер MT1332E, который не входил в сервис режим известными способами, и, по слухам, ключ хранил не в ПЗУ:

Были попытки чтения ПЗУ, растворив корпус и подпаявшись проводками:

Да, внутри него тоже находился бутерброд из проца и флешки:

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

Вместо этого c4eva разработал прошивку iXtreme LTU (Lite Touch Ultimate), которая использовала данные, извлечённые из самой приставки (через взлом самой системы) и требовала замены печатной платы привода. Кастомная печатная плата в точности повторяла плату от 16D5S, но процессор на ней можно было перепрошить:


Более предприимчивые «мастера по прошивке» самостоятельно выходили на поставщиков разблокированных MT1332 и просто перепаивали чип на плате. Эти чипы снимали с китайских DVD-проигрывателей на таком же чипе:

Вскоре чипы MT1332 банально закончились! Тогда команда Maximus разработала необычную вещь — Cryptocop:

Этот чип, присобаченный сбоку платы, делал магическую вещь — при старте грузил новый бутром в MT1335/MT1339, после чего прошивка LTU, предназначенная для MT1332 прекрасно запускалась и работала. Ну а чипов хватало — MT1335 снимали с б/у приводов предыдущей модели, 16D4S, MT1339 — с китайских дисководов или у поставщиков. Нормальную версию LTU под MT1339 c4eva компилировать отказывался (иначе люди просто ставили бы старые приводы и не покупали бы их платы).

А вот когда уже запасы LTU плат кончились, c4eva сделал потрясающий финт ушами — он скомпилировал прошивку iXtreme LTU2 под чип MT1319! Этот процессор стоял в самых первых LiteOn с «толстых» приставок. И да, они начали клепать и продавать новые LTU2 платы:


Ну и, наконец, к празднику подключились китайцы, начавшие делать платы на базе MT1309, более распространенного собрата MT1319 с внешней флешкой:

Эра прошивок Xbox 360 завершилась, когда вышла новая ревизия консоли, на которой нельзя достать ключ ни из системы, ни из DVD-привода. Но об этом в следующей части!

Защита и взлом Xbox 360, Часть 1
Защита и взлом Xbox 360, Часть 2

Любые детали, подробности, нюансы — спрашивайте в комментариях!

Let's block ads! (Why?)