Голая большая грудь
»Фанфики(БЛ) Бесконечное лето Ru VN Алиса(БЛ) Семен(БЛ) Ульяна(БЛ) еще одна Ульяна(БЛ) очередной бред Дубликат(БЛ) Визуальные новеллы фэндомы
2 глава http://vn.reactor.cc/post/2740447
3 глава http://vn.reactor.cc/post/2744500
IV
Персуновы
– Сем, как спина?
– Как кисель, Рыжик. Так что зря мне Виола нагрузки ограничила, я и сам близко сейчас ни к чему тяжелому не подойду.
Гости неспешно шли по тропинке от медпункта к спортзалу и делились впечатлениями о прошедшем дне.
– Я за купальником заходила когда, Виола сказала что ты ностальгировать ушел.
– Ага. Сходил на пристань; к кибернетикам зашел; к Мику в кружок; на площади с Леной посидел, парой слов перекинулся, насколько это возможно с нераскрывшейся Леной. Даже с местной мелюзгой на спортплощадке мячик по пинал, и пожалел себя за то, что я на эту мелочь пузатую раньше внимания не обращал. Но, правда, тогда я тебя бы не встретил. А потом меня Славя выловила и мы в тренерской мебель переставляли. Вас я видел, но не стал догонять.
– А я девочек к нам вечером на чай пригласила.
– Молодец. И я даже не спрашиваю – кого. Знаешь, Уля, с вами, Рыжими, у меня почему-то всегда были хорошие отношения. Во всех узлах. И, вот я вернулся в родной лагерь, с которого у меня все начиналось. И не пионер, а, вроде как, один из... Один из не знаю кого, из местного начальства, что-ли, явного и тайного, но вот оказалось, что девочки мне ближе, мне с ними легче, чем с вожатой, с Виолой, с Толиком.
Ульяна долго молчала, не решаясь спросить, а Семен терпеливо ждал. И только когда Персуновы зашли в спортзал, и Ульяна, потрогав укрытую одеялом стопку матов, которая заменит им кровать на ближайшие три дня, одобрительно кивнула, разговор возобновился.
– Это лучше для твоей спины, чем кровать с провисшей сеткой. Семк, ты только не обижайся, пожалуйста.
– Что случилось, Рыжик?
– Вот ты здесь сто циклов прожил, так?
– Ну, плюс-минус, конечно, но так.
– И девочки здесь очень хорошие, я сегодня сама убедилась. Скажи… Скажи, у тебя что-то, серьезное для тебя, с ними было? Чтобы вот, сердце болело. Или, наоборот, улетало на небо от счастья?
А теперь настала очередь Семена держать паузу. Он поставил чайник на плитку, достал из рюкзака пару железных кружек, достал из шкафа пару стаканов для гостей, достал оттуда же литровую банку под заварку. Опять полез в рюкзак и выложил на стол бумажный пакет со стряпней Сашкиной выпечки. И только потом заговорил.
– Уля. Я очень хочу, чтобы было. Но я не помню, вот в чем беда. Я знаю, что было, я уверен, что было, но то, что я помню, это или как черно-белые фотографии в чужом альбоме, или же сухие факты, как в протоколе, или сон, где все перемешано и невозможно его толком описать. А что чувствовал в те моменты – не могу сказать вовсе, так иногда, как проблеск, проскакивает: вот Алиса сидит на пристани, свесив ноги в воду, а я замираю от неожиданной нежности к этой хамке, а вот мы с Леной стоим, прислонившись спинами к одной и той же березе и разговариваем и мне больно от того, что я не могу до нее докричаться, вот здешняя Ульяна, с глазами по пять рублей, слушает мою страшную историю, а я удивляюсь произведенному эффекту. Алиса, Лена, Славя, Мику… Нет, Мику не здесь, не в этом лагере, или здесь? Я не помню, не могу вспомнить, от Мику даже картинки не осталось, только ощущение ее руки, и знание что, если держать Мику за руку и смотреть ей в глаза, то она успокаивается и перестает трещать как пулемет, и помню, как мы купались на острове. Ульянка? Нет. Хотя дружили крепко, и на выручку мне она всегда бросалась не задумываясь, это, наверное, у вас, у всех Ульянок, в крови. Но это еще до моего пробуждения. Зря ты об этом спросила, Рыжик. Я уже почти смирился со своим беспамятством, а теперь опять буду себе мозги наизнанку выворачивать, пытаясь вспомнить хоть что-то, хоть на один бит памяти, но стать богаче. Ну, а про те циклы, которые я уже помню, ты про них все знаешь, повторяться не буду.
– Да знаю, Сем. Я почему спросила. Помнишь ты днем про здешнюю Лену сказал, а перед ужином еще про Славю? Я ревновать пыталась, честно. Не получилось. А сейчас, когда познакомилась с девочками здешними, и вовсе не получится. Потому что, если бы не эти девочки, ты бы не стал таким, каким ты есть, какого я люблю, понимаешь?. Ты сам не замечаешь, а в тебе есть какие-то черты от всех девочек, те, которыми они поделились с тобой, это надо просто увидеть. Ты, конечно, пропустил все, что тебе подарили, через свою личность и все изменил под себя, но они, эти черты, есть и никуда не делись, и я их вдруг увидела, что-то от Алисы, от Лены, от Мику, понимаешь? От тех девочек, которые еще не проснулись. Я не знаю Славю, но то, что я в ней успела заметить, есть и в тебе. Семка, они сделали тебя, а ты сделал нас, понимаешь?
Очень редко Ульяну пробивало на такие откровения, очень редко она так копалась в себе и в Семке, но когда это происходило девочка-ракета, самый лучший друг и товарищ, всегда веселый и озорной антипод внешне мрачному Семену, куда-то исчезали и всплывала Ульяна серьезная, с распахнутыми глазами, которые не отпускали, с дрожащим от волнения голосом, требующая понимания больше всего. И если однажды Семен ее не поймет, то кто тогда, если не он?
– Рыжик, думаю, мы все здесь делаем друг-друга. И раньше делали, и продолжаем делать, и ты продолжаешь, вот прямо сейчас. Но, о Славе, я что, тоже люблю подметать площадь?
– Ты этого терпеть не можешь! Но ты ни разу не прошел мимо нашей Алисы, когда она вспоминает о своих обязанностях, чтобы ей не помочь. И порядок в спортзале, тебе не охота его поддерживать, но ты всегда за ним следишь. И октябрята, тебе же нравится с ними возиться, вот даже сегодня. Так что живи пока, Семк. Не буду я тебе сколопендру в постель подбрасывать, тем более, это и моя постель тоже.
Ульяна прижалась к Семке, спрятав лицо на его груди.
– Семка, я совсем не ревнивая и совсем не дура, да? Я все боялась, что за те пять циклов, за десять недель, после твоего возвращения, повзрослела физически на пять лет, а сама осталась той же четырнадцатилетней дурочкой, понимаешь? Оказывается у меня не только сиськи на полтора размера выросли, но еще и мозги.
А Семка только прижимал Ульяну к себе, целовал в макушку и глупо улыбался.
– Рыжик мой, все хорошо. Ты такая, какая есть и именно такая, какая мне нужна. А когда ты меняешься, то становишься нужна такая, какая становишься. Думаешь я не понял, почему ты вдруг разбираться в себе, во мне, в наших отношениях захотела? Ты сейчас боишься, что забудешь меня в следующий раз, в следующую активную фазу, или, что не нужна мне окажешься, как уснешь. Вот и пытаешься все понять и все запомнить, чтобы хоть что-то осталось. А ты не бойся, ты, когда опять проснешься, все вспомнишь. А если не вспомнишь, то я тебе напомню, обещаю. И пока ты спишь, тоже напоминать буду, каждый день, в каждом цикле. Только не вздумай впасть в детство и вернуться в свои четырнадцать лет. Иначе мне придется опять ждать, пока ты не подрастешь. Не хочу, одного раза мне хватило.
– Да, а кто тебе спину лечить будет, пока я сплю? Будешь сюда к Виолке этой бегать, знаю тебя, ходока налево. Карий глаз-то ты от нее подцепил. Придется, наверное, мне в активной фазе оставаться.
– Ну конечно, только я предвкушать свободу начал, как вот он, облом.
И эта шутливая разрядка после момента откровения, продолжалась бы еще, если бы дверь в тренерскую не открылась и в комнату не заглянули.
Алиса долго сомневалась, откликаться или нет на приглашение Ульяны-большой. Если бы компания ограничилась только двумя Ульянами, то пошла бы не задумываясь: Ульяна-большая ей нравилась, даже не смотря на недавний неловкий момент, но Семен был личностью непонятной.
– Уля, ты пойдешь?
– А то, Алиска. Где еще чаем напоят? А может и чего интересного расскажут. А ты что, Семена Ульяниного стесняешься?
– Я!? Да, есть немного. Сегодня, когда вечером встретились на площади, он так улыбнулся, как старой знакомой. И потом, пока к столовой шли, все поглядывал на нас. Поглядит – улыбнется, поглядит – улыбнется, как будто убеждался, что все у нас хорошо. Или вот это вот чувство, что мы обе его знаем. А как на него другие смотрят ты видела? У других тот же вопрос на физиономиях: «Где мы его видели?», – даже у вожатой. Хотя Ольга здесь же в детстве отдыхала и должна его знать, раз они ровесники.
– Вот и спросишь его сама. Ну, пойдешь?
Пошла конечно. И люди интересные, и чтобы самой себе, Семену и Ульяне-большой доказать, что никого не стесняется. Подумала еще, не взять ли гитару, но решила не брать, все-таки не настолько еще сложившиеся отношения с гостями, чтобы им что-то показать захотелось. А пока шла, все думала – какой же вопрос гостям задать и не опозориться, как два часа назад с Ульяной. Ведь хотелось же спросить о многом, но вдруг, когда уже Ульяна-большая не просто разрешила, а даже сама попросила задавать вопросы – как будто стыдно стало спрашивать, и язык не повернулся. И надо на этот раз пересилить себя и спросить.
Ульянка отстала, сказала, что переоденется и догонит, но не догнала. Поэтому пришлось толкать дверь самой, опять непонятно чему волнуясь.
– Здравствуйте.
– Заходи, Алиса. Ты одна?
– Нет, она не одна!
Ульянка, все-таки догнавшая Алису, протиснулась мимо нее в тренерскую и по хозяйски огляделась.
– А здесь неплохо. Надо будет у вожатой ключ свистнуть. Или, может попроситься в физруки? Женька в библиотеке, Мику у себя, а я здесь буду.
Почему-то гости лагеря переглянулись при этих словах, Ульяна-большая непонятно хмыкнула, а Семен тихо пробурчал что-то, опять про сходимость.
– Девочки, чтобы не было вопросов, почему мы вас пригласили – не почему. Сёмка молчит, но ему было важно убедиться, что все здесь в порядке. А еще у него комплекс вины перед вами. И не морщись, Сём, так оно и есть, сам же меня врать отучил. Поэтому пейте чай, а Сёмка вам сейчас сказку расскажет. Или нет, лучше я расскажу. У него сказки красивые получаются, он очень умный и умеет их сочинять и рассказывать, он вообще умнее нас всех, может быть, кроме Виолы и Шурика, но расскажу сказку я. Сёмка, не дергайся, так надо.
Cheat engine hook hcode Визуальные новеллы фэндомы
Делаем собственный hcode к новелле.
Собственно почему бы и нет. В русскоязычном сегменте гайдов никаких нет, в англоязычном все довольно-таки старенькие. Поэтому запилю свой гайд как делать хук код к новелле которую вы собирались почитать, а текст нихуя не вытаскивается.
Во первых нам нужен инструментарий.
1. Cheat Engine как дебагер, удобный, мало весит, имеет вполне себе юзерфрендли интерфейс. Скачать можно всегда с офф сайта https://www.cheatengine.org/
2. Textractor — собственно достойная замена ITH и ITHVNR, хотя если точнее продолжение. Скачать можно на странице релизов с гитхаба https://github.com/Artikash/Textractor/releases
3. Наша подопытная новелла. Я взял тупа первую новеллу к которой просили хук на хонге. Скачать эту новеллу можно отсюда https://sukebei.nyaa.si/view/2640189
Собственно поехали.
Я скачал данную новеллу и открыл текстрактор. Жмакаем аттач то гейм и выбираем процесс с нашей игрой. Автоматом подхватились нужные треды с обрывками текста.
В данном случае это GetGlyphOutlineA, как видно текст дают нам не полностью а только его часть. Данный косяк мы и будем исправлять.
Прежде всего следует поискать существует ли в памяти нужная строка в неизменном виде.
Жмакаем кнопку add hook и в открывшимся окне вводим S[впечатываем сюда нужную строку]
Жмем ок и чуточку ждем. В консоли должны появится записи, что добавились новые юзерхуки, проверяем их.
Жмакаем на окно нашей новеллы и прогоняем несколько строк, смотрим добавились ли они в окно с нашим юзерхуком. В данном случае вторая строка добавилась, но на третьей споткнулась, похоже, что меняется адрес куда записывается новая строка и этот вариант нам не подходит.
Переходим к самому интересному и веселому открываем cheat engine.
Подрубаемся деббагером к нашей новелле. Выбираем процесс и жмакаем Attach debugger to process.
После того как подключились к процессу необходимо перейти на нужный адресс в окне memory view.
В красной рамке собственно располагается окно с ассемблерными инструкциями. Жмем по нему правой кнопкой мышки и нажимаем Go to address.
Нужный нам адресс можно получить в окне textractora треда который не полностью захватывает текст.
Красным подчеркиванием выделил где находится данный адрес. Вводим его в окошко Goto Adress, первые две цифры не трогаем, мы должны поменять только последние 6.
Собственно в окне memory view должна выделится нужная позиция.
Конкретно здесь выделение должно быть в инструкции адрес который я подчеркнул красным. Кстати в окне memory view адрес пишется с учетом оффсета от реального адреса, а не того который выделили в памяти. Поэтому реальный адрес инструкции 6F298 относительно начала файла экзешника нашей новеллы, в то время как в памяти нашего пк адрес 0046F298. Ну это так чисто техническая инфа, я хуй знает зачем это пишу.
Далее мы должны поставить breakpoint, выделяем нужный адрес и правой кнопкой мыши установить breakpoint либо же просто жмем ф5.
Итак мы выделили нужный адрес и поставили брикпоинт, когда он ставится, до инструкция выделяется зеленым цветом.
Ткнем в диалог новеллы и она должна зависнуть, а интерфейс memory viewera слегка изменится. Давайте пройдемся по нему поподробнее.
Собственно 1 это окно просмотра адреса памяти в хекс режиме. Полезно посмотреть что скрывается в различных адресах. Нихуя не буду углубляться в что такое поинтеры и с чем их едят. Я вообще когда начинал ебашил все методом научного тыка и нихуя не знал.
2. Окно с нашим стеком, что такое стек я тоже нихуя не буду писать, во всяком случае сейчас. Окно это дюже полезное и позже объясню почему.
3. Регистры, собственно в 32битных программах есть регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP подробнее про них вы можете прочитать не у меня, так-как по большему счету я тоже мало знаю об этом, короче считайте регистры что-то вроде переменных. Про флаги и сегменты регистров я тем более нихуя не знаю, так-как их не использую в принципе.
4. Окно с ассемблерными инструкциями.
Окей. С этим мы разобрались, хотя я почти на сто процентов уверен, что никто нихуя не понял. Неудивительно из меня хуевый учитель, но поехали дальше.
Собственно наше окно с регистрами горит красным и если мы пощелкаем ф9, то сможем увидеть как некоторые показатели в регистрах меняются. Мы знаем, что по адресу 6F292 вызывается инструкция GDI32.GetGlyphOutlineA собственно туда отправляются наши японские символы в количестве одной штуки. Я кстати не читал документацию но чисто на эмпирическом уровне думаю, что данное апи выводит на экран текст, хотя если бы было так, оно выводило не весь текст, хуй с ним, может люди умнее меня скажут нахуй она нужна. Опять я что-то отвлекся.
Конкретно в данном случае можно сразу запалить 2 байта
В регистре ESI 82B1 я уже столько раз делал хук коды, что точно знаю, что все японские символы в SJIS кодировке состоят из двух байтов и первый байт у них начинается с 80. Есть очень полезный сайт который позволит хекс коды перевести в читабельный текст http://freaka.freehostia.com/charset.php
Благодаря этому сайту мы понимаем, что 82В1 = こ. Да так и есть, каждый раз при вызове ф9 мы продолжаем выполнение программы и каждый раз когда срабатывает брикпойнт регистр ESI меняется показывая нам новую букву. Хорошо с этим мы разобрались. Но как же выловить весь текст полностью? Ну в данном случае придется окунуться в наш стек, что бы найти истину.
В окошке со стеком, жмем правой кнопкой мышки и выбираем Not system modules only. Теперь мы увидим в окне адреса модулей. Наша задача выйти из этой подпрограммы в которой вызывается функция GDI32. Тут наверное стоит сделать лирическое отступление. Я сам нихуя не понимаю до конца как это работает, буду говорить с той позиции какой вижу это я.
Зеленой рамочкой обведен наш брикпоинт, наша задача выйти из данной функции в место откуда её собирались вызывать жирная черная стрелочка. В начале каждой новой функции на вершину стека кладется адрес возврата выполнения программы. По мере заполнения стека он будет опускаться все дальше вниз в окне стеков. Поэтому мы ищем в окне стека именно этот адрес возврата. На рисунке выше он 00473CF0. На нашей схеме я его обвел красной рамочкой.
Итак в окне стеков первые три модуля отправляют нас в область защищенной памяти, это не ассемблерные инструкции поэтому они нам не интересны. 4 же возвращает адрес куда должно передаться управление программой после завершения этой функции то есть до оператора ret что в простонородье означает return ака возвращение.
Нам нужно поставить брикпоинт прямо перед выполнением функции в которой происходит вызов в GDI32.
В нашем случае это адрес 72CE9 чуть ниже мы можем увидеть функцию call и еще на один ниже наш адрес возврата из той функции 72CF0. Поставим брикпойнт и немного погоняем ф9, смотрим есть ли где-нибудь наш текст. Ах да, поставим full stack в окне стека. Если мы дважды щелкнем кнопкой мыши на первую позицию в стеке после того как нажмем ф9, то в окне хекс отображения сможем увидить два байта нашей буквы в sjis кодировке. Значит мы сделали все правильно и буква появляется еще выше по выполнению данной функции, если бы мы нигде не смогли отыскать нашу букву, то алгоритм работы слегка изменился и нам пришлось искать место где она появляется в функции где вызывается GDI32, но этого не произошло и продолжаем искать дальше.
В данный момент у нас должно быть активно два брикпоинта при нажатии Ctrl+b мы увидим их адреса, либо же можно нажать мышкой сверху view -> breakpointlist. Наша задача понять они выполняются каждый одинаково, то есть сначала первый потом второй и если да, то это место для хука не подходит, так-как мы знаем что у нас проебаны буквы.
Жмакаем ф9 и видим, что они выполняются последовательно, значит ищем дальше. Мне чуйка сразу подсказала, что текст формируется именно в этой функции и я решил пройтись по ней с самого начала. Брекпоинт по адресу 0046F292 можно нахрен удалять. Что бы попасть в начало функции жмакаем правой кнопкой мыши на окне с инструкциями выбираем select current function, наш отшвырнет на адрес 72A2D, поставим здесь брикпойнт и пощелкаем ф9.
Заодно не забываем проверять наш стек и регистры на наличие чего нибудь напоминающие буквы в хекс виде. Из проделанной работы мы узнаем, что начало функции вызывается куда чаще чем адрес 72CE9, а значит вот оно, больше никуда лезть не нужно, нам осталось отыскать место где появятся наши заветные два байта. Жмем ф8 и потихонечку спускаемся вниз все это время следя за регистрами и стеком.
Ага, вот тут после выполнение команды в адресе 72A88 в регистре EAX появилось кое-что интересное. А именно появляется первый байт нашей буквы, мы ведь помним, что первый байт всех японских символов начинаются с 80. Отлично идем дальше.
А вот наклюнулся и второй байт в регистре ECX, он появился после выполнения команды в адресе 72A92. За ним идут две операции and, где по сути избавляются от минуса, и мы применяем побайтовый сдвиг влево на 8 у регистра EAX. Вот оно, уже рядом.
Собственно вот и оно. После инструкции в адресе 72AA2 наши два байта объединились и стали единым целым. В адресе 72AA4 можно поставить брикпойнт и пожамкать ф9, что бы убедится, что все буквы появляются именно здесь. Как только мы в этом убедились. Жмем Ctrl+B и удаляем все брекпойнты, они нам больше не понадобятся. Самое время запилить наш хук.
Цепляться будем ка адресу 72AA4 который идет сразу после того как наши два байта объединяются.
Откроем textractor подрубимся к экзешнику с нашей игрой, если вы вдруг его закрыли, если не закрывали, то он должен быть уже заатачен к процессу игры. жмем добавить хук код add hook
Ну и собственно вбиваем наш хук. Если у вас экзешник из иероглифов, имя желательно полностью скопировать. Как составлять хуки тут есть целая памятка. /H собственно с этого начинается любой хук код. A - берет два байта в кодировке SJIS little endian, B следует использовать когда байты повернуты наоборот. То есть в данном примере у нас 8179 - это А, а если бы было 7981, то нужно было бы в писать в хук B. Префикс N, блядь, я знаю, что это значит но по умному хуй знает как описать. Короче, суть. Если не писать N, то будет дополнительно учитываться регистер ESI вроде бы, точно не помню и если он постоянный то все будет ок, но если вдруг каждый вызов он будет меняться, то вы получите кучу всяких потоков, поэтому использовать его нужно с умом. Собственно собака, потом адрес куда мы будем хукаться, напомню этот адрес идет сразу после того как мы получили наши цельные два байта. Двоеточие и имя экзешника полностью. Жмем окей и вуаля. Хук работает, а мы великолепны.