Делаем собственный 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 вроде бы, точно не помню и если он постоянный то все будет ок, но если вдруг каждый вызов он будет меняться, то вы получите кучу всяких потоков, поэтому использовать его нужно с умом. Собственно собака, потом адрес куда мы будем хукаться, напомню этот адрес идет сразу после того как мы получили наши цельные два байта. Двоеточие и имя экзешника полностью. Жмем окей и вуаля. Хук работает, а мы великолепны.
Подробнее
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
TP- Textractor □ X ¡brc r Mi ite: ost: [Sffi] ш? ▼ 101Ç
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 hexadecimal Default codepage is 932 (Shift-JIS) but this can be changed in settings A/B: codepage char little/big endian W: UTF-16 char S/Q/V: codepage/UTF-16/UTF-8 string Negatives for data/split offset refer to registers -4 for EAX, -8 for ECX, -C for EDX, -10 for EBX, -14 for ESP, -18 for EBP, -1C for ESI, -20 for EDI * means dereference pointer+deref_offset ste? acute? OK Cancel
TP- Textractor □ X
^ 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 (пробная » ООООЗВАС-Кино и ТВ ||*| 000026F8-osuWin(20181019J.zip (дней до noicyi j 00003450-PenTablet 000042D8- ??????????????- ???????• ^ 00003F24-T extractor £ 000001 DC-Cheat Engine 6.8.3 Open Cancel Attach debugger to process Network
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 ????.exe+A5EBD First Scan Next Scan Undo Scan ☆ Value: Hex D| Scan Type Exact Value Value Type 4 Bytes Memory Scan Options All Start 0000000000000000 l~~l Not I~1 Unrandomizer ПEnable Speedhack < ить отзыв Go to address Set/Unset bookmark > Goto bookmark > Replace with code that does nothing Add to the code list Assemble Copy to clipboard Change register at this location Toggle breakpoint Break and trace instructions Find out what addresses this instruction accesses Set/Change break condition Select current function Set/Change comment Ctrl+Enter Set/Change header Address Manually Table Extras □ X 1 .exe+£6048 .exe+A6049 .exe+A604i .exe+A604B CC .exe+A604C CC .exe+A604D CC .exe+A604E CC «... 1 ЛГЛАГ call to interrupt procedure-3 : trap to debugger
8:42D8:755EE24 GetGlyphOutlineA (HA8@E240:GDI32.dll)
Goto Address Fill in the address you want to go to X 1 0046F298I OK 1 Cancel ! : 755ЕЕ240 :¿6F298:0 : GetGlyphOutlineA (HA8@E2
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 edx,03 ????.exe+6F2A3 C1 EA 02 shr edx,02 ????.exe+6F2A6 03 D2 add edx,edx ????.exe+6F2A8 Till 03 D2 Q£_C£J add edx,edx ?.exe + D/ ] ->GDI32.GetGlyphOutlineA T- Textractor 42D8: 3$&#ftS.exe * Attach to game Launch game S:42D8:755EE240:46F29S:0: GetGlyphOutlineA (,HA8@E240:GDD2.din Right? Good.
^ 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] ????.exe+6F28C 57 push edi ????.exe+6F28D 52 push edx ????.exe+6F28E 6A 06 push 06 ????.exe+6F290 56 push esi ????.exe+6F291 51 push ecx >>????.exe+6F292 FF 15 A8A04D00 call dword ptr [????.exe+DA0A8] ????.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] ”” PYP+5E2AÛ aHH pHy 03 Comment -> GDI32.GetGlyphOutlineA call procedure □ X Registers : Flags EAX 005354A3 OF 0 E3X 045E222S DF 0 ECX AC011A62 SF 0 EDX 0277D050 ZF 0 ESI 0000S2B?* 0 EDI 000001E0 0 E3F 0000000^ S£F 0 ESP 0019F110 X EIP 0046F292 \ Segm^îï. Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B address A3 A5 AA A3 AC AD AE AF 89A3CDEF 005354A8 D4 FD 4D 00 00 00 00 00 M 00535430 00 00 00 0^ too 00 00 00 00535433 00 00 00 ho 00 00 00 005354C0 00 00 00, /jQi loi 00 00 00 005354C8 FF FF ooi [00 00 00 00 005354D0 AA AA AA °/ F3 79 6A 00 • yj- 005354D3 FF FF FF FF FF FF 00 005354E0 FF FF FF /° FF FF FF 00 005354E3 FF FF FF 00 FF FF FF 00 005354F0 FF FF FF 00 FF FF FF 00 005354F3 FF FF FF 00 FF FF FF 00 00535500 FF FF FF 00 FF FF FF 00 Return Ad dr... Parameters iODDDDDDO.......'OOOOOO^
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
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 >>????.exe+6F292 FF 15 A8A04D00 call dword ptr [ ?.exe+DA0A8] -> GDI32.GetGlyphOutlineA ■ ????.exe+6F298 8B 43 0C 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 edx,03 3 ????.exe+6F2A3 C1 EA 02 shr edx,02 2 ????.exe+6F2A6 03 D2 add edx, edx ????.exe+6F2A8 03 D2 add edx, edx ???? pyp+_6£?4A 85XÛ tp«:t pay pay V call procedure Registers: Flags EAX 005354A3 OF 0 EBX 027124D8 DF 0 ECX D6011B65 SF 0 EDX 0272A4F8 ZF 0 ESI 000082A9 AF 0 EDI 000002A0 PF 0 E3P 00000000 CF 0 Î71 ESP 0019F110 EIP 0046F292 Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B Protect :Read/Write Allocation3ase=00400000 3ase: a address A8 A9 AA A3 AC AD AE AF 89A3CDEF 005354A8 D4 FD 4D 00 00 00 00 00 M 005354B0 00 00 00 00 00 00 00 00 00535438 00 00 00 00 00 00 00 00 005354C0 00 00 00 00 01 00 00 00 005354C8 FF FF FF 00 00 00 00 00 005354D0 AA AA AA 00 F3 79 6A 00 • YD- 005354D8 FF FF FF 00 FF FF FF 00 005354E0 FF FF FF 00 FF FF FF 00 005354E8 FF FF FF 00 FF FF FF 00 005354F0 FF FF FF 00 FF FF FF 00 005354F8 FF FF FF 00 FF FF FF 00 00535500 FF FF FF 00 FF FF FF 00 0040003B : byte: 0 word: 4096 integer: 69632 int64: -5035290465214066688 flo Address DWORD Value A 0019F130 (esp+20) 005354A8 (pointer)????.exe+1354A8 0019F138 (esp+28) 00535EA0 (pointer)????.exe+135EAO 0019F13C (esp+2C) 005354A8 (pointer)????.exe+1354A8 0D19F150 (esD+401 00472CF0 (pointer1????.exe+72CF0 0019F178 (esp+68) 005354A8 (pointer)????.exe+1354A8 0019F17C (esp+6C) 0052E281 (pointer)????.exe+12E281 0019F180 (esp+70) 00535DA9 (pointer)????.exe+135DA9 0019F19C (esp+8C) 004DB018 (pointer)????.exe+ DB018 0019F1D8 (esp+ C8) 0053004E (pointer)????.exe+13004E 0019F1E8 (esp+D8) 005354A8 (pointer)????.exe+1354A8 0019F1F4 (esp+E4) 004D7B38 (pointer) ????.exe+ D7B38 V
Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции call - вызов подпрограммы Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции начало функции Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции Всяки^инструкци^^^^^ Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции Всякие инструкции
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 eax,[esp+1C] ????.exe+72CF6 8B 52 28 mov edx, [edx+28] ????.exe+72CF9 50 push eax ????.exe+72CFA 8B CB mov ecx,ebx ????.exe+72CFC FF D2 call edx ????.exe+72CFE 8D 4C 24 2C lea ecx,[esp+2C] ????.exe+72D02 C7 84 24 88000000 F.. . mov [esp+00000088],FFFFFFFF -1 ????.exe+72D0D C7 44 24 2C 18B04D... mov [esp+2C],????.exe+DB018 (004917E6) ????.exe+72D15 E8 368AF9FF call ????.exe+B750 00472C48(Conditional) 00472C15(Unconditional) copy memory Registers: Flags EAX 0019F263 OF 0 EBX 00535EA0 DF 0 ECX 0019F1S4 SF 0 EDX 00000000 ZF 0 ESI 005354A3 AF 0 EDI 045E2180 PF 0 EBP 0015F22C CF 0 ESP 0019F154 EIP 00472CE9 Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B 0 Protect :Read/Write Allocation3ase=000A0000 3ase: a address 34 85 86 87 88 89 8A 83 456739A3 0019F184 83 83 00 00 68 F2 19 00 . . h . . 0019F18C 68 37 74 02 00 00 00 00 h t. 0019F194 00 00 00 00 00 00 00 00 0019F19C 18 BO 4D o o 14 IF 0A A2 . M. 0019F1A4 OC 02 00 00 ID o o 00 00 0019F1AC 76 01 00 00 ID o o 00 00 V 0019F134 00 00 00 00 00 00 00 00 0019F1BC 00 00 00 00 84 03 00 00 . . . . . . 0019F1C4 00 00 00 80 03 02 01 31 . . . . . .1 0019F1CC 82 6C 82 72 20 83 53 83 1 r S 0019F1D4 56 83 62 83 4E 00 53 o o V b N. S. 0019F1DC 2C F2 19 00 02 00 00 00 Address DWORD Value A 0019F154(esD+01 0019F184 (pointer10Q19F184 0019F158(esp+4) 0019F268 (pointer)0019F268 0019F15C(esp+8) 00000000 (dword)00000000(0) 0019F160(esp+C) 00000000 (dword)00000000(0) 0019F164(esp+10) 00000000 (dword)00000000(0) 0019F168(esp+14) 045E2180 (pointer)045E2180 0019F16C(esp+18) 00000000 (dword)OOOOOOOO(O) 0019F170(esp+1C) 92AC0651 (dword)92AC0651 (2460747345) 0019F174(esp+20) 00000001 (dword)00000001 (1) 0019F178(esp+24) 005354A8 (pointer)????.exe+1354A8 0019F17C(esp+28) 0052E281 (pointer) ????.exe+12E281 V
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
^ 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 eax,[????.exe+12B2E0] (-1833568475) ????.exe+72A35 33 C4 xor eax,esp ????.exe+72A37 50 push eax ????.exe+72A38 8D 84 24 80000000 lea e ax, [ e s p+00000080] ????.exe+72A3F 64 A3 00000000 mov fs:[00000000],eax 0 ????.exe+72A45 8B AC 24 94000000 mov ebp,[esp+00000094] ????.exe+72A4C 8B F1 mov esi,ecx ????.exe+72A4E 8B 86 D8040000 mov eax,[esi+000004D8] ????.exe+72A54 8B 8E C4010000 mov ecx,[esi+000001C4] ????.exe+72A5A 8B 96 C8010000 mov edx,[esi+000001C8] ???? pypj-7.PA.60 fiR Rr ?A QOOOOOOO mrw Pdi fpcn + OOOOOOQOl push word or doubleword onto the stack EAX 92AC06A1 OF 0 EBX 00535D9A DF 0 ECX 005354A3 SF 1 EDX 0019F268 ZF 0 ESI 005354A8 AF 0 EDI 00000001 PF 0 m 0052E231 CF 0 ESP 0019F180 EIP 00472A2D Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B Protect : address 9235F725 AllocationBase= 25 26 27 28 29 77 77 77 77 77 =7FFF0000 2A 23 2C 77 77 77 3ase=92B5F000 S. a 56789A3C 77777777 Address DWORD Value A 0019F180(esp+0) 00535D9A (pointer)????.exe+135D9A 92B5F72D 77 77 77 77 77 77 77 77 77777777 0019F184(esp+4) 00000000 (dword)OOOOOOOO(O) 92B5F735 77 77 77 77 77 77 77 77 77777777 0019F188(esp+8) 0019F268 (pointer)0019F268 9235F73D 77 77 77 77 77 77 77 77 77777777 0019F18C(esp+C) 00000000 (dword)OOOOOOOO(O) R?R^F74 R 77 77 77 77 77 77 77 77 77777777 9235F74D 77 77 77 77 77 77 77 77 77777777 0019F190(esp+10) 000000FF (dword)000000FF(255) 92B5F755 77 77 77 77 77 77 77 77 77777777 0019F194(esp+14) OOOOOOFF (dword)000000FF(255) 92B5F75D 77 77 77 77 77 77 77 77 77777777 0019F198(esp+18) 000000FF (dword)000000FF(255) 92B5F7 65 77 77 77 77 77 77 77 77 77777777 0019F19C(esp+1C) 002BE300 (dword)002BE300(2876160) 92B5F76D 77 77 77 77 77 77 77 77 77777777 0019F1A0(esp+20) 00000000 (dword)OOOOOOOO(O) 9235F775 77 77 77 77 77 7 7 77 77 77777777 0019F1A4(esp+24) 0000020C (dword)0000020C(524) 9235F77D 77 77 77 77 77 77 77 77 77777777 v 0D19F1A8(esp+28) 0000001D (dword)0000001 D(29) V
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 [esi+000004DC],ecx ????.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 [esi+000004E0],edx ????.exe+72A7E OFBE 45 00 movsx eax,byte ptr [ebp+00] ????.exe+72A82 8B 96 580DOOOO mov edx,[esi+00000D58] ????.exe+72A88 33 C1 xor eax,ecx >>????.exe+72A8A 8D4C 11 01 lea ,[ + +01] ????.exe+72A8E OFBE 55 01 movsx edx,byte ptr [ebp+01] ????.exe+72A92 33 CA xor ecx,edx ????.exe+72A94 25 FF000000 and eax,OOOOOOFF 255 2222 PYP + 72AQQ 81 F1 EEQQQQQQ and prv OOOOOOFF 255 load effective address Flags OF DF SF ZF AF PF CF Registers : FAX FFFFFF31 E3X 00535D5A ECX OOOOOOI4 EDX FFFFFFFF ESI 005354A8 EDI 0015F268 E3P 001SF22C ESP 001SF170 EIP 00472A3A Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B 0 Protect: AllocationBase=7FFF0000 3ase=9235F000 S. a address 25 26 27 28 29 2A 23 2C 56789A3C 9235F725 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F72D ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F735 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F73D ?? ?? ?? ?? ?? ?? ?? ?? ???????? 92B5F745 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 92B5F74D ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F755 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F75D ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F765 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F76D ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F775 ?? ?? ?? ?? ?? ?? ?? ?? ???????? 9235F77D ?? ?? ?? ?? ?? ?? ?? ?? ???????? Address DWORD Value A 0019F170(esp+0) 92AC0651 (dword)92AC0651 (2460747345) 0019F174(esp+4) 00000001 (dword)00000001 (1) 0019F178(esp+8) 005354A8 (pointer)????.exe+1354A8 0019F17C(esp+C) 0052E281 (pointer)????.exe+12E281 0019F180(esp+10) 00535D9A (pointer)????.exe+135D9A 0019F184(esp+14) 00000000 (dword)OOOOOOOO(O) 0019F188(esp+18) 0019F268 (pointer)0019F268 0019F18C(esp+1C) 00000000 (dword)OOOOOOOO(O) 0019F190(esp+20) OOOOOOFF (dword)000000FF(255) 0019F194(esp+24) OOOOOOFF (dword)000000FF(255) 0019F198(esp+28) OOOOOOFF (dword)000000FF(255) V
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 [esi+000004E0],edx ????.exe+72A7E OFBE 45 00 movsx eax,byte ptr [ebp+00] ????.exe+72A82 8B 96 580DOOOO mov edx,[esi+00000D58] ????.exe+72A88 33 C1 xor eax,ecx ????.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 ????.exe+72A94 25 FF000000 and eax,000000FF 255 ????.exe+72A99 81 E1 F F000000 and ecx,000000FF 255 > >????.exe+72A9F C1 EO 08 shl ,08 a ????.exe+72AA2 OB C1 or eax,ecx ???? OYO + 77AA4 «n on Im pHy roaY-r>OOnfi7QPl V multiply by 2 8 times Registers : Flags EAX 00000081 OF 0 E3X 00535D9A DF 0 ECX ■ ■I* c c c c c . SF 0 EDX 0000005A ZF 0 ESI 005354A8 AF 0 EDI 0019F268 PF 1 E3P 0019F22C CF 0 171 ESP 0019F170 EIP 00472A9F Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B Protect: Allocation3ase=7FFF0000 3ase=9235F000 S. a address 25 26 27 28 29 2A 23 2C 56789A3C 9235F725 77 77 77 77 77 77 77 77 77777777 9235F72D 77 77 77 77 77 77 77 77 77777777 9235F735 77 77 77 77 77 77 77 77 77777777 9235F73D 77 77 77 77 77 77 77 77 77777777 92B5F745 77 77 77 77 77 77 77 77 77777777 92B5F74D 77 77 77 77 77 77 77 77 77777777 9235F755 77 77 77 77 77 77 77 77 77777777 9235F75D 77 77 77 77 77 77 77 77 77777777 9235F7 65 77 77 77 77 77 77 77 77 77777777 9235F76D 77 77 77 77 77 77 77 77 77777777 9235F775 77 77 77 77 77 77 77 77 77777777 9235F77D 77 77 77 77 77 77 77 77 77777777 Address DWORD Value A 0019F170(esp+0) 92AC0651 (dword)92AC0651 (2460747345) 0019F174(esp+4) 00000001 (dword)00000001 (1) 0019F178(esp+8) 005354A8 (pointer)????.exe+1354A8 0019F17C(esp+C) 0052E281 (pointer)????.exe+12E281 0019F180(esp+10) 00535D9A (pointer)????.exe+135D9A 0019F184(esp+14) 00000000 (dword)OOOOOOOO(O) 0019F188(esp+18) 0019F268 (pointer)0019F268 0019F18C(esp+1C) 00000000 (dword)OOOOOOOO(O) 0019F190(esp+20) 000000FF (dword)000000FF(255) 0019F194(esp+24) 000000FF (dword)000000FF(255) 0019F198(esp+28) 000000FF (dword)000000FF(255) V
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 ????.exe+72A94 25 FF000000 and eax,000000FF 255 ????.exe+72A99 81 E1 FF000000 and ecx,000000FF 255 ????.exe+72A9F C1 E0 08 shl eax,08 8 ????.exe+72AA2 OB C1 or eax,ecx >>????.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 82 ????.exe+72AB6 77 02 ; ja ????.exe+72ABA ????.exe+72AB8 33 C9 | xor ecx,ecx 0047?ARfifr nnriitinnall load effective address Registers: Flags EAX 00003141 OF 0 E3X 00535D9A DF 0 ECX 00000041 SF 0 EDX S o o O o o o ZF 0 ESI 005354A8 AF 0 EDI 0019F268 PF 1 E3P 0019F22C CF ° [71 ESP 0019F170 b EIP 00472AA4 Segment Registers CS 0023 SS 002B DS 002B ES 002B FS 0053 GS 002B Protect: Allocation3ase=7FFF0000 3ase=9235F000 S. a address 25 26 27 23 29 2A 23 2C 56789A3C 9235F725 9235F72D 9235F735 9235F73D 9235F745 9235F74D 9235F755 9235F75D 9235F7 65 9235F76D 9235F775 9235F77D :sïîtîit ~rr TT TT TT TT TT TT TT TTTTTTT7 :35F755 I35F75D I35F765 I35F76D I35F775 !35F77D Address DWORD Value N 0019F170(esp+0) 92AC0651 (dword)92AC0651 (2460747345) 0019F174(esp+4) 00000001 (dword)00000001 (1) 0019F178(esp+8) 005354A8 (pointer)????.exe+1354A8 0019F17C(esp+C) 0052E281 (pointer)????.exe+12E281 0019F180(esp+10) 00535D9A (pointer)????.exe+135D9A 0019F184(esp+14) 00000000 (dword)00000000(0) 0019F188(esp+18) 0019F268 (pointer)0019F268 0019F18C(esp+1C) 00000000 (dword)00000000(0) 0019F190(esp+20) 000000FF (dword)000000FF(255) 0019F194(esp+24) 000000FF (dword)000000FF(255) 0019F198(esp+28) 000000FF (dword)000000FF(255) 0019F184(esp+14) 00000000 (dword)00000000(0) 0019F188(esp+18) 0019F268 (pointer)0019F268 0019F18C(esp+1C) 00000000 (dword)00000000(0) 0019F190(esp+20) 000000FF (dword)000000FF(255) 0019F194(esp+24) 000000FF (dword)000000FF(255) 0019F198(esp+28) 000000FF (dword)000000FF(255) V
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 82 ????.exe+72AB6 77 02 : J‘a ????.exe+72ABA ????.exe+72AB8 33 C9 | xor ecx,ecx 00472AB6(Conditional) ????.exe+72ABA 3D 41810000 ►cmp eax,00008141 33089 ????.exe+72ABF 7C 07 ????.exe+72AC8 Registers: Flags 00003179 OF 0 EBX 00000088 DF 0 ECX 00000079 SF 0 EDX 00000070 ZF 0 ESI 005354A8 AF 0 EDI 0019F268 PF 0 E3P 0019F22C CF 0 ESP 0019F170 EIP 00472AA4 Segment Registers -CS_QQ23_ F- Textractor □ > 42D8: ^Ml.exe ^ 8:42D8:755EE240:46F298:0: GetGlyphOutlineA (HA8@E240:GDB2.dll) Attach to game Launch game Detach from game Add hook Save hook(s) Settings Extensions TP- Add hook X Included Ear tftf Dang mm Face face Ghostbus Gusto GI 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 hexadecimal Default codepage is 932 (Shift-JIS) but this can be changed in settings A/B: codepage char little/big endian W: UTP16 char S/Q/V: codepage/UTF-16/UTF-8 string Negatives for data/split offset refer to registers -4 for EAX, -8 for ECX, -C for EDX, -10 for EBX, -14 for ESP, -18 for EBP, -1C for ESI, -20 for EDI * means dereference pointer+deref_offset /HAN-4@72AA4 . exe OK Cancel
*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
Make H-Code.,Gaming,,
hook code,Gaming,cheat engine,hook,hcode,visual novel,
Визуальные новеллы,фэндомы,Cheat engine,hook,hcode
Кто-то не умеет читать?
Столкнулся с проблемой. Не могу собрать хук код на данную игру Euphoria (Clock Up). Точнее на ее переведенную на английский язык версию. Всегда возникала проблема с подхватом именно английского текста в переведенных японских новеллах. Так как я не знаю английского, вопрос стоит так же остро, что и с японским языком. Например в данном случае в этой игре, у меня вовсе не выхватывает даже крупицы текста (точнее не выскакивают дорожки GetGlyphOutlineA или подобные им процесса с текстом не в одном перехватчике текста), чтобы начать от них плясать. Поэтому нету даже начального кода для поиска. Не могу разобраться как разрешить эту проблему. Не могли бы вы помочь с этим?
Вот ссылочка на игру( сделал пробелы не знаю по правилам можно ссылки кидать или нет). Для меня eng головная боль в яп новеллах. Никак не могу с ним справится, вроде как eng должен радоваться с переводом, я в него играю будто на русском после японского текста и каждая игра на нем переведенная уже подарок, а насладиться не могу нормально. Через распознователь текста играть приходится.
А можешь мне по скайпу или в вк или где еще рассказать как это сделать самому?
Если что мой ид в вк mormillenium
Мне не так и осталось не понятно как именно начать собирать код в англоязычных переводах японских новел.