Почитал твою статью про обращения программ - это круто. Один раз я столкнулся с задачей по дешифрации, будучи не специалистом по криптографии, мне сразу пришла подобная идея, но я её откинул, споткнулся об те же сдвиги энды и оры. Что были наработки до тебя?
Наработок до меня опубликовано на русском не было вообще, на английском близкая тема - книга Perumala Introduction to reversible computing. Я взял в два проекта по обратимым вычислениям кое что из книги, после того как 500 страниц формулами по обращению операций исписал - логическими уравнениями. Книгу ОЧЕНЬ рекомендую. Также по реверсингу, кое-что получил: ntoskrnl MEMORY HEX DUMP (not binary string format): 3571 9329 1939 3739 3213 2714 7425 9078 5320 7024 4798 2723 7796 9094 7476 7585 9000 0000 5895 6758 5953 7790 5732 3004 7805 7250 0000 9057 3230 0990 9474 7193 9471 2393 7800 0000 2393 7893 9471 9051 5180 7591 7190 2732 3000 2390 5739 2139 3291 2077 4572 0231 0000 0000 2892 1379 0714 9714 3732 2490 9824 9000 0000 0628 9125 4779 4249 0379 0714 1574 5000 0000 7168 9173 7207 1775 0220 1244 0282 4900 0000 5417 1149 4240 2821 7321 0000 0000 0000 0000 1494 2541 7140 2821 7321 0000 0000 0000 0000 2441 2471 2490 2547 9827 0000 0000 0000 0000 8232 1444 4719 0921 9000 0000 0000 0000 0000 4719 0921 9444 9214 5706 0920 0000 0000 0000 9460 7822 2239 3719 4223 9371 9460 7471 0000 2450 2512 0658 9932 1354 7645 4502 5120 0000
ДЕРЖИТЕ МОЙ BTC КОШЕЛЬ ДЛЯ ПОЖЕРТВОВАНИЙ АВТОРУ СТАТЕЙ, ЗА ДВЕ НЕДЕЛИ НАДЕЮСЬ КТО-ТО ПОЖЕРТВУЕТ BTC: 1ProHxWHZDjVyMZ4cdh3kg1cdcoz6CfmZA Простая матрица, сам сейчас Яворского курс физики читаю, на векторах позиция чтения.
Ты пока не выложил ничего что тянет даже на 1 доллар пожертвований. Тема про обращения программ интересная, но твое утверждение что с помощью него можно обращать хэш-функции (что в принципе противоречит самому условию хеширования) смахивает на мошенничество. Што это за таинтственные цыфры? Давай действующий концепт
Насчёт пожертвований - это было не тебе. Добавь поиск на графе состояний, как сказано в статье, и будет тебе действующий концепт. У меня 4 дня выходных, попробую успеть это сделать за 4 дня. Просто A* в объёмном изложении, попробую вначале алгоритм Дейкстры, он когда-то лям зелени моей компании принёс в белом проекте, заказ на два года получили благодаря демке на этом алгоритме. Всем пока, завтра спишемся обязательно.
прикольно читать крема ) я уже фанат этого психа )) этож как так нужно логику в голове миксером взбить чтобы такая муть оттуда вылетала?
Тоже много читаю, во всяком случае пытаюсь не только писать. Фрагмент дампа памяти: 9393 7094 7425 4194 9074 3200 0000 0000 0000 2451 2432 2460 7890 5739 3237 0940 0000 0000 Увидишь 300К ботов - поймёшь какой миксер надо
Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using BinaryCode; namespace SHA { public class SHA256 : Emulator { public uint[] buffer76 = new uint[76]; public SHA256() { buffer76 = new uint[76]; for (int i = 0; i < 76; i++) buffer76[i] = (uint)i; Compile(); } public override void Code() { SetInput("nonce0", 0); SetInput("nonce1", 1); SetInput("nonce2", 2); SetInput("nonce3", 3); Name("sha256_init"); MoveConst("datalen", 0); MoveConst("bitlen", 0); MoveConst("state0", 0x6a09e667); MoveConst("state1", 0xbb67ae85); MoveConst("state2", 0x3c6ef372); MoveConst("state3", 0xa54ff53a); MoveConst("state4", 0x510e527f); MoveConst("state5", 0x9b05688c); MoveConst("state6", 0x1f83d9ab); MoveConst("state7", 0x5be0cd19); Name("sha256_update"); int dl = 0; // datalen for (int i = 0; i < buffer76.Length; i++) { MoveConst("data" + dl, buffer76[i]); dl++; if (dl == 64) { AddConst("datalen", 64); sha256_transform(); Name("after_sha256_transform"); AddConst("bitlen", 512); SubConst("datalen", 64); } } AndConst("nonce0", 0xff); AndConst("nonce1", 0xff); AndConst("nonce2", 0xff); AndConst("nonce3", 0xff); Move("data" + 76, "nonce0"); Move("data" + 77, "nonce1"); Move("data" + 78, "nonce2"); Move("data" + 79, "nonce3"); AddConst("datalen", 16); Name("sha256_final"); MoveConst("data" + 80, 0x80); int q = 81; for (int i = 0; i < 56 - 17; i++, q++) MoveConst("data" + (81 + i), 0); AddConst("bitlen", 56 * 8); MoveConst("data" + (q++), (56 * 8) >> 56); MoveConst("data" + (q++), (56 * 8) >> 48); MoveConst("data" + (q++), (56 * 8) >> 40); MoveConst("data" + (q++), (56 * 8) >> 32); MoveConst("data" + (q++), (56 * 8) >> 24); MoveConst("data" + (q++), (56 * 8) >> 16); MoveConst("data" + (q++), (56 * 8) >> 8); MoveConst("data" + (q++), (56 * 8)); sha256_transform2(); Name("after_sha256_transform2"); List<string> outs = new List<string>(); for (int i = 0, j = 0; i < 8; i++) { CopyByte("hash"+j, "state"+i, 3); //ShiftRightConst("hash"+j, 24); outs.Add("hash" + j); j++; CopyByte("hash"+j, "state"+i, 2); //ShiftRightConst("hash"+j, 16); //AndConst("hash"+j, 0xff); outs.Add("hash" + j); j++; CopyByte("hash"+j, "state"+i, 1); //ShiftRightConst("hash"+j, 8); //AndConst("hash"+j, 0xff); outs.Add("hash" + j); j++; CopyByte("hash"+j, "state"+i, 0); //AndConst("hash"+j, 0xff); outs.Add("hash" + j); j++; } } protected void sha256_transform() { Name("sha256_transform"); int i, j; for (i = 0, j = 0; i < 16; i++, j += 4) { ShiftLeftConst("data" + j, 24); ShiftLeftConst("data" + (j + 1), 16); ShiftLeftConst("data" + (j + 2), 8); Or("data" + (j + 3), "data" + (j + 2)); Or("data" + (j + 3), "data" + (j + 1)); Or("data" + (j + 3), "data" + j); Move("m" + i, "data" + (j + 3)); } for (; i < 64; i++) { Copy("m" + i, SIG1("m" + (i - 2))); Add("m" + i, "m" + (i - 7)); Add("m" + i, SIG0("m" + (i - 15))); Add("m" + i, "m" + (i - 16)); } ++u; Copy("A" + u, "state" + 0); Copy("B" + u, "state" + 1); Copy("C" + u, "state" + 2); Copy("D" + u, "state" + 3); Copy("E" + u, "state" + 4); Copy("F" + u, "state" + 5); Copy("G" + u, "state" + 6); Copy("H" + u, "state" + 7); for (i = 0; i < 64; i++) { Move("t1" + u, "m" + i); Add("t1" + u, "H" + u); Add("t1" + u, EP1("E" + u)); Add("t1" + u, CH("E" + u, "F" + u, "G" + u)); AddConst("t1" + u, k[i]); Move("t2" + u, EP0("A" + u)); Add("t2" + u, MAJ("A" + u, "B" + u, "C" + u)); ++u; Move("H" + u, "G" + (u - 1)); Move("G" + u, "F" + (u - 1)); Move("F" + u, "E" + (u - 1)); Move("E" + u, "D" + (u - 1)); Add("E" + u, "t1" + (u - 1)); Move("D" + u, "C" + (u - 1)); Move("C" + u, "B" + (u - 1)); Move("B" + u, "A" + (u - 1)); Move("A" + u, "t1" + (u - 1)); Add("A" + u, "t2" + (u - 1)); } Add("state0", "A" + u); Add("state1", "B" + u); Add("state2", "C" + u); Add("state3", "D" + u); Add("state4", "E" + u); Add("state5", "F" + u); Add("state6", "G" + u); Add("state7", "H" + u); } protected void sha256_transform2() { Name("sha256_transform2"); int i, j; for (i = 0, j = 0; i < 16; i++, j += 4) { ShiftLeftConst("data" + (j + 64), 24); ShiftLeftConst("data" + (j + 1 + 64), 16); ShiftLeftConst("data" + (j + 2 + 64), 8); Or("data" + (j + 3 + 64), "data" + (j + 2 + 64)); Or("data" + (j + 3 + 64), "data" + (j + 1 + 64)); Or("data" + (j + 3 + 64), "data" + (j + 64)); Move("m" + (i + 64), "data" + (j + 3 + 64)); } for (; i < 64; i++) { Copy("m" + (i + 64), SIG1("m" + (i - 2 + 64))); Add("m" + (i + 64), "m" + (i - 7 + 64)); Add("m" + (i + 64), SIG0("m" + (i - 15 + 64))); Add("m" + (i + 64), "m" + (i - 16 + 64)); } ++u; Copy("A" + u, "state" + 0); Copy("B" + u, "state" + 1); Copy("C" + u, "state" + 2); Copy("D" + u, "state" + 3); Copy("E" + u, "state" + 4); Copy("F" + u, "state" + 5); Copy("G" + u, "state" + 6); Copy("H" + u, "state" + 7); for (i = 0; i < 64; i++) { Move("t1" + u, "m" + (i+64)); Add("t1" + u, "H" + u); Add("t1" + u, EP1("E" + u)); Add("t1" + u, CH("E" + u, "F" + u, "G" + u)); AddConst("t1" + u, k[i]); Move("t2" + u, EP0("A" + u)); Add("t2" + u, MAJ("A" + u, "B" + u, "C" + u)); ++u; Move("H" + u, "G" + (u - 1)); Move("G" + u, "F" + (u - 1)); Move("F" + u, "E" + (u - 1)); Move("E" + u, "D" + (u - 1)); Add("E" + u, "t1" + (u - 1)); Move("D" + u, "C" + (u - 1)); Move("C" + u, "B" + (u - 1)); Move("B" + u, "A" + (u - 1)); Move("A" + u, "t1" + (u - 1)); Add("A" + u, "t2" + (u - 1)); } Add("state0", "A" + u); Add("state1", "B" + u); Add("state2", "C" + u); Add("state3", "D" + u); Add("state4", "E" + u); Add("state5", "F" + u); Add("state6", "G" + u); Add("state7", "H" + u); } static int t = 0, s = 0, u = 0; protected string ROTRIGHT(string a, uint b) { ++t; Copy("a" + t, a); ShiftRightConst("a" + t, b); ++t; Copy("a" + t, a); ShiftLeftConst("a" + t, 32u - b); Or("a" + (t - 1), "a" + t); return "a" + (t - 1); } protected string CH(string x, string y, string z) { ++t; Copy("x" + t, x); And("x" + t, y); ++t; Copy("x" + t, x); Neg("x" + t); And("x" + t, z); Xor("x" + (t - 1), "x" + t); return "x" + (t - 1); } protected string MAJ(string x, string y, string z) { ++t; Copy("x" + t, x); And("x" + t, y); ++t; Copy("x" + t, x); And("x" + t, z); Copy("y" + t, y); And("y" + t, z); Xor("x" + (t - 1), "x" + t); Xor("x" + (t - 1), "y" + t); return "x" + (t - 1); } protected string EP0(string x) { ++s; Copy("s" + s, ROTRIGHT(x, 2)); ++s; Copy("s" + s, ROTRIGHT(x, 13)); ++s; Copy("s" + s, ROTRIGHT(x, 22)); Xor("s" + (s - 2), "s" + (s - 1)); Xor("s" + (s - 2), "s" + s); return "s" + (s - 2); } protected string EP1(string x) { ++s; Copy("s" + s, ROTRIGHT(x, 6)); ++s; Copy("s" + s, ROTRIGHT(x, 11)); ++s; Copy("s" + s, ROTRIGHT(x, 25)); Xor("s" + (s - 2), "s" + (s - 1)); Xor("s" + (s - 2), "s" + s); return "s" + (s - 2); } protected string SIG0(string x) { ++s; Copy("s" + s, ROTRIGHT(x, 7)); ++s; Copy("s" + s, ROTRIGHT(x, 18)); ++s; Copy("s" + s, x); ShiftRightConst("s" + s, 3); Xor("s" + (s - 2), "s" + (s - 1)); Xor("s" + (s - 2), "s" + s); return "s" + (s - 2); } protected string SIG1(string x) { ++s; Copy("s" + s, ROTRIGHT(x, 17)); ++s; Copy("s" + s, ROTRIGHT(x, 19)); ++s; Copy("s" + s, x); ShiftRightConst("s" + s, 10); Xor("s" + (s - 2), "s" + (s - 1)); Xor("s" + (s - 2), "s" + s); return "s" + (s - 2); } protected uint[] k = new uint[64] { 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 }; } } Не законченная версия, отлаживать и отлаживать. Обратимая функция SHA256!
тебя на сайте не забанят Только если расскажешь каким веществом упарываешься и в какой дозировке ))) и сколько ты весишь при этом интересный эффект и ты даже пользуешься при этом инетом...расскажи нам!
получить операции в обратном порядке можно и не прогоняя SHA256 через свой "чудо транслятор, чудо языка" а получится у тебя в итоге каша результат которой в SHA256 будет абсолютно другой а ключевой момент здесь - избыточность информации которой после подсчета хэша уже нет, и не какими способами её не восстановить тчк ну разве что с астрала достать
Вирус, я ничего из стимуляторов кроме чая и энергетиков (лимонадов с кофеином и витаминами) не беру, вес из-за диеты, диета нечто среднее между вегетарианством и фрукторианством. По обратимым вычислениям отвечу позже.
Избыточность информации, о которой Вы говорите, приводит к неоднозначности решения при обратном выполнении. При прямом выполнении информация теряется, в операциях AND OR SHIFTLEFT SHIFTRIGHT. При обратном выполнении эту информацию надо восстанавливать. Да, некоторые биты при обращении, например, операции SHIFTLEFT, могут принимать значения как 0 так и 1 в восстанавливаемой переменной. Если брать случайные значения, это может привести к тупиковым состояниям - невозможности продолжения обратного выполнения, или к ложному решению - хэш от такого решения уже будет другой. Поэтому надо подбирать оптимальные значения таких битов. Например, полным перебором комбинаций неоднозначных битов циклическим прибавлением к их строке единицы справа. Если операция SHIFTLEFT имеет параметр 15, сдвигает на 15, то имеем 15 неоднозначных битов, всего вариантов перебора около 32000. Перебираем битовую строку, порождая новые комбинации прибавлением единицы к строке справа, в двоичной системе с переносом переполнения из разряда в разряд вправо. Получаются все возможные битовые строки, которые и пробуются. Для текущего значения битовой строки делается проба обратного выполнения, и если удалось продолжить выполнение выше, чем до неудачных битовых строк, то биты подобраны правильно - вышли из проблемного участка кода и зашли во второй проблемный участок. Эскиз алгоритма приблизительно следующий. 1. Для всех значений неоднозначных битов инструкции 2. Пробуем выполнять обратно (вверх) до той строки, спуск с которой вниз приводит к ложному хэш-значению 3. Это текущая строка 4. Если на комбинации неоднозначных битов текущая строка стала выше, то биты в инструкции подобраны правильно 5. И так пока обратное выполнение не дойдёт до нулевой строки Уже подобранные биты отмечаются фиксированными и не перебираются дальше. Перебор не сложен, как стало видно на хэш-функции FAQ6, вместо перебора сотен неоднозначных битов нужно десятки раз перебрать строки из десятков битов, по одной строке для каждой инструкции. То есть можно перебирать N раз по 10 битов вместо перебора комбинации 10*N битов, сложность перебора колоссально меньше подразумеваемой авторами хэш-функции. Сложность перебора тут, образно говоря, N*2^10 вместо 2^(N*10). Проблема неоднозначных битов не так страшна. Сейчас остановился на проблеме обратимого присваивания, упёрся в неё. На этих выходных это все мои эксперименты, читаю дальше физику и электронику.
CommandorCream, ты разумные вещи говоришь, но ты даже коллизии не добьешься, я еще в техникуме лет 13 назад пытался повторить нечто подобное для MD5. Пару неудачных попыток и я наткнулся на статью про энтропию и понял что я ошибался в корне. Такой тип перебора как ты написал будет идти в разы дольше примерно в 2 степени дольше чем обычный брутфорс, ну да ладно, пытайся ) Вон вечные двигатели тоже до сих пор тысячами клепают и нечё )) запал не пропадает