Результаты поиска по запросу «

Черная пулья

»
Запрос:
Создатель поста:
Теги (через запятую):



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

A pluet Junior Member Join Date: May 2006 Posts: 28 01-24-2019, 12:32 PM Requesting H-Code'sfor: №£&} >H * A,£ J'Afk-b « A,~3 L â [H-Game] http://www.getchu.com/soft.phtml?id=1029425 O Last edited by pluet; 01 -24-2019, 12:43 PM. #8232,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode


Собственно поехали.

Я скачал данную новеллу и открыл текстрактор. Жмакаем аттач то гейм и выбираем процесс с нашей игрой. Автоматом подхватились нужные треды с обрывками текста.

TP- Textractor □ X ¡brc r Mi ite: ost: [Sffi] ш? ▼ 101Ç,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode


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

Прежде всего следует поискать существует ли в памяти нужная строка в неизменном виде.

Жмакаем кнопку add hook и в открывшимся окне вводим S[впечатываем сюда нужную строку]

T- Add hook X Search for text S[codepage#]text OR Enter read code R{S | Q | V>[codepage#][*deref_offset]@addr OR Enter hook code H{A | B | W | S | Q | V}[N][codepage~ ]data_offset[*deref_offsetl][: split_offset[*deref_offset2]]@addr[: module[ :func]] All numbers except codepage in


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

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

TP- Textractor □ X,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode


Переходим к самому интересному и веселому открываем cheat engine.

Подрубаемся деббагером к нашей новелле. Выбираем процесс и жмакаем Attach debugger to process.

^ Process List X File Applications Processes Windows 00003590-Microsoft Store л 00003590-Входящие — Yandex ?- Почта 0000239С-Параметры 00002288-Почта ф 00002D90-qBittorrent v4.1.5 ^ 00002214-[M-KV2501] Wakfu 1x02 [BDRip] [108 gj 00002594-XP-PenWin(20190304J.zip (пробная » ООООЗВАС-Кино и ТВ


После того как подключились к процессу необходимо перейти на нужный адресс в окне memory view. 

В красной рамке собственно располагается окно с ассемблерными инструкциями. Жмем по нему правой кнопкой мышки и нажимаем Go to address.

Cheat Engine 6.8.3 File Edit Table D3D Help 000042D8- ??????????????- ???????' Found: 0 :46F2 i. îme to ight-hu a. m it I feel Address Value Previous Memory View Advanced Options 0 H Memory Viewer e Search View Debug Tools Kernel tools ???| Idress B^s E9 78FEFFFF CC

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

Красным подчеркиванием выделил где находится данный адрес. Вводим его в окошко Goto Adress, первые две цифры не трогаем, мы должны поменять только последние 6.

8:42D8:755EE24 GetGlyphOutlineA (HA8@E240:GDI32.dll),Визуальные новеллы,фэндомы,Cheat engine,hook,hcode

Goto Address Fill in the address you want to go to X 1 0046F298I OK 1 Cancel ! : 755ЕЕ240 :¿6F298:0 : GetGlyphOutlineA (HA8@E2,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode

Собственно в окне memory view должна выделится нужная позиция.

Конкретно здесь выделение должно быть в инструкции адрес который я подчеркнул красным. Кстати в окне memory view адрес пишется с учетом оффсета от реального адреса, а не того который выделили в памяти. Поэтому реальный адрес инструкции 6F298 относительно начала файла экзешника нашей новеллы, в то время как в памяти нашего пк адрес 0046F298. Ну это так чисто техническая инфа, я хуй знает зачем это пишу.

w ????.exe+6F28E ????.exe+6F290 ????.exe+6F291 JC. 6A 06 56 51 pusn push push push eux 06 esi ecx ????.exe+6F292 FF 15 A8A04D00 call dword ptr [ ????.exe+6F298 8B 43 OC mov eax,[ebx+0C] ????.exe+6F29B 8B 10 mov edx,[eax] ????.exe+6F29D 8B 40 04 mov eax,[eax+04] ????.exe+6F2A0 83 C2 03 add

Далее мы должны поставить breakpoint, выделяем нужный адрес и правой кнопкой мыши установить breakpoint либо же просто жмем ф5.

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

Ткнем в диалог новеллы и она должна зависнуть, а интерфейс memory viewera слегка изменится. Давайте пройдемся по нему поподробнее.

^ Memory Viewer - Currently debugging thread 2AS4 File Search View Debug Tools Kernel tools ????.exe+6F280 Address Bytes Opcode ????.exe+6F280 50 push eax ????.exe+6F281 8B 44 24 14 mov eax,[esp+14] ????.exe+6F285 51 push ecx ????.exe+6F286 8B 88 FC090000 mov ecx,[eax+000009FC]

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

2. Окно с нашим стеком, что такое стек я тоже нихуя не буду писать, во всяком случае сейчас. Окно это дюже полезное и позже объясню почему.

3. Регистры, собственно в 32битных программах есть регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP подробнее про них вы можете прочитать не у меня, так-как по большему счету я тоже мало знаю об этом, короче считайте регистры что-то вроде переменных. Про флаги и сегменты регистров я тем более нихуя не знаю, так-как их не использую в принципе.

4. Окно с ассемблерными инструкциями.

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

Собственно наше окно с регистрами горит красным и если мы пощелкаем ф9, то сможем увидеть как некоторые показатели в регистрах меняются. Мы знаем, что по адресу 6F292 вызывается инструкция GDI32.GetGlyphOutlineA собственно туда отправляются наши японские символы в количестве одной штуки. Я кстати не читал документацию но чисто на эмпирическом уровне думаю, что данное апи выводит на экран текст, хотя если бы было так, оно выводило не весь текст, хуй с ним, может люди умнее меня скажут нахуй она нужна. Опять я что-то отвлекся.

Конкретно в данном случае можно сразу запалить 2 байта 

Registers: Flags EAX 005354A3 OF 0 EBX 045E2223 DF 0 ECX AC011A62 SF 0 EDX 0277D050 ZF 0 EDI 000001E0 PF 0 E3F ESP EIP 00000000 0015F110 0046F252 CF 0 Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode

В регистре ESI 82B1 я уже столько раз делал хук коды, что точно знаю, что все японские символы в SJIS кодировке состоят из двух байтов и первый байт у них начинается с 80. Есть очень полезный сайт который позволит хекс коды перевести в читабельный текст http://freaka.freehostia.com/charset.php

Благодаря этому сайту мы понимаем, что 82В1 = こ. Да так и есть, каждый раз при вызове ф9 мы продолжаем выполнение программы и каждый раз когда срабатывает брикпойнт регистр ESI меняется показывая нам новую букву. Хорошо с этим мы разобрались. Но как же выловить весь текст полностью? Ну в данном случае придется окунуться в наш стек, что бы найти истину.

Memory Viewer - Currently debugging thread 3A78 File Search View Debug Tools Kernel tools □ X ????.exe+6F28C Address Bytes Opcode Comment A ????.exe+6F28C 57 push edi ????.exe+6F28D 52 push edx ????.exe+6F28E 6A 06 push 06 6 ????.exe+6F290 56 push esi ????.exe+6F291 51 push ecx

В окошке со стеком, жмем правой кнопкой мышки и выбираем Not system modules only. Теперь мы увидим в окне адреса модулей. Наша задача выйти из этой подпрограммы в которой вызывается функция GDI32. Тут наверное стоит сделать лирическое отступление. Я сам нихуя не понимаю до конца как это работает, буду говорить с той позиции какой вижу это я. 

Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции call - вызов подпрограммы Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции начало функции Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции Всяки^инструкци^^^^^

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

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

Нам нужно поставить брикпоинт прямо перед выполнением функции в которой происходит вызов в GDI32.

Memory Viewer - Currently debugging thread 2A84 File Search View Debug Tools Kernel tools □ X ????.exe+72CE9 Address Bytes Opcode Comment >>????.exe+72CE9 8B CE mov ????.exe+72CEB E8 E0C4FFFF call ????.exe+6F1D0 ????.exe+72CF0 8B 13 mov edx,[ebx] ????.exe+72CF2 8B44 24 1C mov

В нашем случае это адрес 72CE9 чуть ниже мы можем увидеть функцию call и еще на один ниже наш адрес возврата из той функции 72CF0. Поставим брикпойнт и немного погоняем ф9, смотрим есть ли где-нибудь наш текст. Ах да, поставим full stack в окне стека. Если мы дважды щелкнем кнопкой мыши на первую позицию в стеке после того как нажмем ф9, то в окне хекс отображения сможем увидить два байта нашей буквы в sjis кодировке. Значит мы сделали все правильно и буква появляется еще выше по выполнению данной функции, если бы мы нигде не смогли отыскать нашу букву, то алгоритм работы слегка изменился и нам пришлось искать место где она появляется в функции где вызывается GDI32, но этого не произошло и продолжаем искать дальше.

В данный момент у нас должно быть активно два брикпоинта при нажатии Ctrl+b мы увидим их адреса, либо же можно нажать мышкой сверху view -> breakpointlist. Наша задача понять они выполняются каждый одинаково, то есть сначала первый потом второй и если да, то это место для хука не подходит, так-как мы знаем что у нас проебаны буквы.

Breakpoint list — □ X Address Size Trigger Type On Hit 0046F292 1 On Execute Hardware Breakpoint (0) Break 00472CE9 1 On Execute Hardware Breakpoint (1) Break,Визуальные новеллы,фэндомы,Cheat engine,hook,hcode

Жмакаем ф9 и видим, что они выполняются последовательно, значит ищем дальше. Мне чуйка сразу подсказала, что текст формируется именно в этой функции и я решил пройтись по ней с самого начала. Брекпоинт по адресу 0046F292 можно нахрен удалять. Что бы попасть в начало функции жмакаем правой кнопкой мыши на окне с инструкциями выбираем select current function, наш отшвырнет на адрес 72A2D, поставим здесь брикпойнт и пощелкаем ф9.

^ Memory Viewer - Currently debugging thread 2A84 □ X File Search View Debug Tools Kernel tools ????.exe+72A2D Registers: Flags Address Bytes Opcode Comment >>????.exe+72A2D 55 push ????.exe+72A2E 56 push esi ????.exe+72A2F 57 push edi ????.exe+72A30 A1 E0B252O0 mov

Заодно не забываем проверять наш стек и регистры на наличие чего нибудь напоминающие буквы в хекс виде. Из проделанной работы мы узнаем, что начало функции вызывается куда чаще чем адрес 72CE9, а значит вот оно, больше никуда лезть не нужно, нам осталось отыскать место где появятся наши заветные два байта. Жмем ф8 и потихонечку спускаемся вниз все это время следя за регистрами и стеком.

Memory Viewer ■ File Search View Currently debugging thread 2A84 Debug Tools Kernel tools □ X ????.exe+72A5A Address Bytes Opcode Comment ????.exe+72A5A 8B 96 C8010000 mov edx,[esi+000001C8] ????.exe+72A60 8B BC 24 90000000 mov edi,[esp+00000090] ????.exe+72A67 89 8E DC040000 mov

Ага, вот тут после выполнение команды в адресе 72A88 в регистре EAX появилось кое-что интересное. А именно появляется первый байт нашей буквы, мы ведь помним, что первый байт всех японских символов начинаются с 80. Отлично идем дальше.

Memory Viewer ■ File Search View Currently debugging thread 2A84 Debug Tools Kernel tools □ X ????.exe+72A6D Address Bytes Opcode Comment A ????.exe+72A6D OFBE 8E 550DOOOO movsx ecx,byte ptr [esi+OOOOOD55] ????.exe+72A74 89 44 24 38 mov [esp+38],eax ????.exe+72A78 89 96 E0040000 mov

А вот наклюнулся и второй байт в регистре ECX, он появился после выполнения команды в адресе 72A92. За ним идут две операции and, где по сути избавляются от минуса, и мы применяем побайтовый сдвиг влево на 8 у регистра EAX. Вот оно, уже рядом.

Memory Viewer - Currently debugging thread 2A84 File Search View Debug Tools Kernel tools □ X ????.exe+72A8A Address Bytes Opcode Comment ????.exe+72A8A 8D 4C 11 01 lea ecx,[ecx+edx+01] ????.exe+72A8E OFBE 55 01 movsx edx,byte ptr [ebp+01] ????.exe+72A92 33 CA xor ecx,edx

Собственно вот и оно. После инструкции в адресе 72AA2 наши два байта объединились и стали единым целым. В адресе 72AA4 можно поставить брикпойнт и пожамкать ф9, что бы убедится, что все буквы появляются именно здесь. Как только мы в этом убедились. Жмем Ctrl+B и удаляем все брекпойнты, они нам больше не понадобятся. Самое время запилить наш хук.

Цепляться будем ка адресу 72AA4 который идет сразу после того как наши два байта объединяются.

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

Memory Viewer - Running □ File Search View Debug Tools Kernel tools ????.exe+72AA4 Address Bytes Opcode Comment >>????.exe+72AA4 8D 90 617DFFFF lea ,[ -0000829F] ????.exe+72AAA 89 7C 24 18 mov [esp+18],edi ????.exe+72AAE B9 02000000 mov ecx,00000002 2 ????.exe+72AB3 83 FA 52 cmp edx,52

Ну и собственно вбиваем наш хук. Если у вас экзешник из иероглифов, имя желательно полностью скопировать. Как составлять хуки тут есть целая памятка. /H собственно с этого начинается любой хук код. A - берет два байта в кодировке SJIS little endian, B следует использовать когда байты повернуты наоборот. То есть в данном примере у нас 8179 - это А, а если бы было 7981, то нужно было бы в писать в хук B. Префикс N, блядь, я знаю, что это значит но по умному хуй знает как описать. Короче, суть. Если не писать N, то будет дополнительно учитываться регистер ESI вроде бы, точно не помню и если он постоянный то все будет ок, но если вдруг каждый вызов он будет меняться, то вы получите кучу всяких потоков, поэтому использовать его нужно с умом. Собственно собака, потом адрес куда мы будем хукаться, напомню этот адрес идет сразу после того как мы получили наши цельные два байта. Двоеточие и имя экзешника полностью. Жмем окей и вуаля. Хук работает, а мы великолепны.

*3 (F) ¡S$(S) T- Textractor 42D8: m^M.exe 1D:42D8:472AA4:0:0: UserHook (HAN-4@72AA4:MI#il.exe) X JiP&D^fv.....o Summer Princess-chan... -t?t>&c I don't want you to be my girlfriend. Saffle's from good. mX] r?% ?/u6©9^e«J:......J Shota: "That's no good..." m§* ^^oD?oo°j v,Визуальные



Ну и два видосика с примерами в конце. 
 
 
Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть

Фанфики(БЛ) Бесконечное лето Ru VN Ульяна(БЛ) Семен(БЛ) ...Визуальные новеллы фэндомы 

Всё началось с лужи. 1

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



Всё началось с лужи. Обычной зимней лужи, что появляется после обильного снегопада и полномасштабной борьбы со снегом в виде тонн реагентов, высыпанных на дороги. Данная конкретная лужа выбрала стратегически верную позицию - прямо перед автобусной остановкой, так, что только самые ловкие пассажиры могли попасть в автобус, не вляпавшись по щиколотку в бурую солёно-снежную жижу. К счастью, такая ерунда меня не беспокоила - плотно зашнурованные говнодавы позволяли игнорировать большинство капризов современной урбанизированной природы. Правда, ценой асоциального вида, but who cares? Можно подумать, кому-то есть дело до того, насколько модны и ухожены мои ботинки.


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

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

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


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

Знаю её. Вернее, видел, несколько раз пересекались на этой самой остановке - наверное, учится в школе где-то здесь, классе в девятом… или десятом… а может, вообще студентка? Не, вряд ли. Я, конечно, не бог весть какой знаток, но вряд ли ей больше шестнадцати лет.

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


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

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

Или вот - маршрутку она увидела и опознала раньше меня. Подбежала к краю тротуара, взмахнула рукой, призывая остановиться…

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

"М-м-мудило…"

- С-С-СКОТИНА-А-А!

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

Но до исчерпания всего запаса неприятных сюрпризов было ещё далеко.

*ПШШШИХ!*

"Блядь! Ещё и второй такой же! Концентрация сраных мудаков сегодня бьёт все рекорды."

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

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


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

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

"Ей, наверно, еще через полгорода домой ехать." - почему-то подумал я.

- Эй. Я тут рядом живу. Хочешь, зайдём,  умоешься и обсохнешь?

Интересно, зачем я ей это предложил? Сам не знаю. Имею я право на нелогичные поступки или нет, в конце концов?

Она мрачно покосилась на меня.

- А ты что, этот, маньяк-педофил?

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

Недоверчиво изучив меня с головы до ног, она, тем не менее, ответила:

- Ну, окей. Пошли, маньяк, показывай дорогу.

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

- Заходи, раздевайся. Ванная там.

Я откопал в шкафу первую попавшуюся футболку и протянул ей.

- Держи. Твоя промокла.

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


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

"Аллё, организм, какого хрена? Утихни! Вечерком посёрфим по порносайтам, а сейчас отвали."

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

- Чай будешь?

- Буду. И бутерброды тоже.

А ей палец в рот не клади… Я протянул ей нож и хлебную доску, а сам разыскал в холодильнике масло, сыр и палку колбасы. Всё это я тоже протянул ей:

- На меня тоже сделай.

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

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

- Большому куску рот радуется?

- Я растущий организм, мне позволительно.

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

- Ну что ж, приятного аппетита, организм.

- А сахар? - деловито спросила она, таская чайный пакетик по чашке туда-сюда.

Я указал взглядом на сахарницу.


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

- Есть. Семён.

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

- Понятно. Я - Ульяна. Ну так что, маньяк Семён, и зачем ты меня сюда привёл?

- Предложить умыться, почиститься и угостить чаем с бутербродами. Очевидно же.

- Что, и всё? Какой-то ты маньяк… не маньяк совсем. Даже скучно.

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

- Ну уж какой есть. Извини, что разочаровал.

- Да не, ничего. Маньяки - они жутко скучные.

- Что, часто попадаются?

Она состроила хитрую физиономию.

- Это секрет! И те, кто его узнал, больше никому ничего не расскажут!

- Тогда я, пожалуй, воздержусь.


Когда на столе уже почти ничего не осталось, она засобиралась.

- Я твою футболку одолжу? Свою я там прополоскала и повесила сушиться. Завтра зайду, заберу и твою верну. Постиранную и отглаженную!

- Да без проблем. А со штанами как?

- А ты хотел, чтоб я у тебя ещё и штаны оставила?! Я же говорю - маньяк!!!... штаны сухие почти, я их феном посушила.

- Ну ладно, потерплю твою футболку у себя в ванной. До завтра.

- Как штык!



***


Как и обещала, она появилась на следующий день.

- Привет, маньяк! Ждал меня? Я тебе твой наряд принесла, как обещала.

"Хорошо, что ее никто не слышит."

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

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

- Доставай!

В пакете и впрямь оказалась моя футболка, поглаженная и аккуратно сложенная. И перевязанная ленточкой. Черная футболка Slipknot, перевязанная розовой ленточкой. И с эшафотным узлом вместо бантика!

Мало того, от свертка исходил какой-то едва уловимый цветочный аромат.

- Ты что, ещё и духами её побрызгала?!

- Ага! Свою футболку-то я заберу, и чтоб не оставлять тебя без объекта фетиша…

Она перестала давиться смехом в ладошку и расхохоталась в открытую.

- Ахахаха! Ну и рожа у тебя сейчас!

"Издевается, паршивка."

- Забирай. Она все там же, на сушилке.

- Эй, а как же чай? Я кексик принесла!

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


Потягивая горячий чай, она вдруг сказала:

- Спасибо тебе, Семён. Ты хороший.

- Да ну?

- Ну да. На самом деле. Хоть и ворчливый, как старый хрыч.

- Я не стар, я суперстар.

- Ну ладно, не старый. Ещё не старый, а уже такой хрыч! Ха-ха-ха!

"Да что ты будешь делать, опять издевается."

- Семён…

- А?

- Я тебя не сильно раздражаю?

- Не сильно. В меру.

- Значит, ты не против, если я иногда буду в гости приходить?

Я вздохнул. До чего надоедливое существо...

- Нет, не против.

- УРРРРРАА!

С победным криком она воздела к потолку и руки, и даже ноги. Гостевые тапки разлетелись шрапнелью по всей кухне. Как будто ей собственный мотоцикл пообещали, не меньше.

- А родители твои не будут против, что ты к постороннему мужику в гости ходишь?

- Не-а, не будут. Знаешь почему?

Она хитро прищурилась и заговорщицки наклонилась ко мне, перегнувшись через стол.

- Потому что я им не расскажу! Вот!

Она некоторое время ожидала от меня реакции, сияя как начищенный кофейник…

- Ну серьёзно, зачем бы мне им говорить? Чтоб они сначала запаниковали, потом запретили, а затем еще и следить стали, как запрет соблюдается? А так все довольны.

- У тебя, я смотрю, все предусмотрено.

- А то!


продолжение завтра

Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

1000й, ну поздравляю, блин, а я тут причём?
Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы

Леночка всё равно сломанная.
Развернуть

Бесконечное лето Ru VN Коллективное творчество(БЛ) ...Визуальные новеллы фэндомы 

Запись на "осенний" сезон КТ

В общем и целом - изменений почти что нет, но те, что есть, могут показаться "сильными".
Малое нововведение - у меня, как у организатора, появляется помощник.
Большое нововведение - механика дней меняется. Теперь каждый игровой день будет "фазирован" по реальной неделе, по московскому времени:
1 день - утро
2 день - завтрак
3 день - день
4 день - обед
5 день - вечер
6 день - ужин
7 день - ночь
Остальное остаётся по-старому - КТ всё-таки остаётся творчеством, так что основная часть - писательство. Описывать всё, конечно, сложно, так что новоприбывшие могут ознакомиться по прошлым постам по тегу "Коллективное творчество(БЛ)" с тем, как всё идёт.
Всем желающим - записаться в комментариях описанием своего персонажа. Ограничение - персонаж - "обычный" человек конца XX - начала XXI века.
Сеттинг: зимний "Совёнок" 80-х.
Старт - приблизительно 6 числа.
Визуальные новеллы,фэндомы,Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Коллективное творчество(БЛ)
Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть

Игры Травница Славя(трав) Игровой арт Moonworks Ru VN ...Визуальные новеллы фэндомы 

Игры,Травница,Славя(трав),Игровой арт,game art,Moonworks,games,game art,moonworks,,Visual Novels,fandoms,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть

Вечерний костёр(БЛ) Бесконечное лето Ru VN ...Визуальные новеллы фэндомы 

Давно не хулиганили...

Вечерний костёр(БЛ),Бесконечное лето,Ru VN,Русскоязычные визуальные новеллы,Отечественные визуальные новеллы,Визуальные новеллы,фэндомы
Развернуть
В этом разделе мы собираем самые смешные приколы (комиксы и картинки) по теме Черная пулья (+713 картинок)