Yuzia Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 Всем привет. С вами снова я. (КТО? Крузя в пальто - шутки для элитки. Не понял? Не элитка) Спрашивал я в Discord канале, мельком. Думал что тема слишком уж короткая для вопроса (вопросы был что-то типо: как с float работать то?). Но сел писать "Проверку СВОЙ/ЧУЖОЙ" и понял что раз есть материал на небольшую статью-вопрос, то чего бы и не сделать отдельную тему?Краткая предистория: Спойлер Посмотрел мануалы как сделать Проверку "Свой/Чужой". Вроде бы понял как и что делать. Ну а человек я простой, полез сразу в огонь и воду (в игры) а она в типе Double, а я как Валенок, ничего не понял. Подумал что рано туда лезть. Решил пойти сначала проверить себя на знание в простенький TrainMe, полез в тот что в папке с СЕ есть. Нашел указатели, поискал по структурке, нашел значения что отличаются у игроков и врагов [ebx+10] (вроде), сами хп находятся на [ebx+4]. Ну, на этом можно закончить. Пошли к сути. Написал я не хитрый скрипт на ассемблере. Вот собственно и он: Спойлер { Game : Tutorial-i386.exe Version: Date : 2018-07-22 Author : YUZIA This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,D8 6B 04 D9 5D D0) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: cmp byte ptr [ebx+10],1 // Сравнение, ebx со смещением +10 = 1 | Враг = 2, Игрок = 1. jne code // Если не равно то goto code. Если равно единице, то идем дальше. fld dword ptr [ebx+04] // Не знаю зачем. Я человек простой, мне так сказали, // я так делаю. (Как я понял, это почти как push?) add [ebx+04],(float)100 // Добавляем +100 (float) единиц в значение типа float. (Вроде как?) | Способ был подсказан @partoftheworlD - если шо, кидайте тапки в него :D fstp dword ptr [ebx+04] // Вроде как записывем (?) // Я так понимаю это же как "применить" изменения? jmp return // Сваливаем отсюда, что бы не выполнялся оригинальный код. code: fsubr dword ptr [ebx+04] fstp dword ptr [ebp-30] jmp return INJECT: jmp newmem nop return: registersymbol(INJECT) // Ниже уже Disabled функция. Не стал ее копировать ибо ничего там не редачил. По идее, все должно работать. Но должно и работает разные вещи. Кратко что делал. Нашел указатели к Игрокам (2), Врагам (2). // Не обращайте на кол-во скриптов. Я пробовал разными способами/методами что либо сделать. Спойлер После чего, сверил их () структуру (Нашел отличия в eax+10). Правильность "проверки" проверял. Если менять в коде проверку с 1 на 2, то скрипт работал с врагами. Спойлер После чего, брал инструкцию что работала с игроками/врагами (проверял на работу с другими адресами)Сама инструкция: Спойлер После чего делал AOB Inject, писал свой код (с костылями или без. Не знаю. Мы писали как могли) И угадайте что я в конце ловил? А я сам и не знаю если честно. Если я ударял Игрока, ловил ошибку: Спойлер И еще супер топове значение: Спойлер В случае если я ударял Врага, то ошибки не было. И значение убавлялось (ну логично да?) Хотел по позже сделать One hit --> One Kill, но сначала хотел разобраться с главной проблемой. (Example: mov [addres+04],0 // Оригинально не правда ли? Да я гений.) Я так думаю я накосячил либо с типом данных (например, передаю 4 byte в float) либо ошибка в самом коде. (Скорее всего второе, но это не точно) И собственно что я хотел спросить то? Помогите решить проблему с кривыми значениями, я новичок в Ассемблере, так что не кидайтесь тапками. Кому не лень, распишите по подробнее как правильно вычитать, добавлять и перезаписывать значения в типе Float (и, в идеале, с double также, если можно) (желательно с примерами работающего скрипта, проще понять как работает если есть наглядные примеры.) Я еще пытался сделать как советовал @Garik66: fld [eax+10] fadd [const] fstp [eax +10] вверху объяви label(const) и const: dd (float)1 // Но мне кажется тут еще надо кое-что что я забыл сделать, как например registersymbol(const) (ну или нет?) но чет пошло не так, и у меня не получилось. Была точно такая же ситуация со значениями (как на скрине выше) PS: Я только начинаю входить в тему с Ассемблером, так что вопросы могут быть слишком глупыми. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 2 часа назад, Yuzia сказал: Я так думаю я накосячил либо с типом данных (например, передаю 4 byte в float) либо ошибка в самом коде. (Скорее всего второе, но это не точно) Фильтр у тебя абсолютно верен по смещению +10 лежит ID команды и наша 1. Ошибка в коде, потому что ты не понял, что именно делает участок кода, на котором ты выбрал свою инструкцию (кстати следующая инструкция 004261D7 - 89 43 04 - mov [ebx+04],eax гораздо удобнее для написания скрипта.) Инструкция на этом участке кода рассчитывает грубо говоря урон и чтобы наши стали бессмертны, а враги умирали с одного выстрела нужно, просто записывать нашим постоянно жизни, а врагам обнулить, но как я и говорил, следующая инструкция удобнее. Скрипт на твоей инструкции: Спойлер { Game : Tutorial-i386.exe Version: Date : 2018-07-22 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,D8 6B 04 D9 5D D0) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(INJECT) newmem: cmp [ebx+10],1 jne @f mov [ebx+04],(float)100 // infinite HP jmp code @@: mov [ebx+04],(float)0 // OHK code: fsubr dword ptr [ebx+04] fstp dword ptr [ebp-30] jmp return INJECT: jmp newmem db 90 return: [DISABLE] INJECT: db D8 6B 04 D9 5D D0 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+261AC "Tutorial-i386.exe"+2618E: DE D9 - fcompp "Tutorial-i386.exe"+26190: DF E0 - fnstsw ax "Tutorial-i386.exe"+26192: 9E - sahf "Tutorial-i386.exe"+26193: 7A 11 - jp Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26195: 75 0F - jne Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26197: A1 A4 F4 54 00 - mov eax,[Tutorial-i386.exe+14F4A4] "Tutorial-i386.exe"+2619C: E8 4F 01 0F 00 - call Tutorial-i386.exe+1162F0 "Tutorial-i386.exe"+261A1: E9 98 00 00 00 - jmp Tutorial-i386.exe+2623E "Tutorial-i386.exe"+261A6: 89 75 CC - mov [ebp-34],esi "Tutorial-i386.exe"+261A9: DB 45 CC - fild dword ptr [ebp-34] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+261AC: D8 6B 04 - fsubr dword ptr [ebx+04] "Tutorial-i386.exe"+261AF: D9 5D D0 - fstp dword ptr [ebp-30] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+261B2: D9 EE - fldz "Tutorial-i386.exe"+261B4: D9 5D CC - fstp dword ptr [ebp-34] "Tutorial-i386.exe"+261B7: D9 45 D0 - fld dword ptr [ebp-30] "Tutorial-i386.exe"+261BA: D9 45 CC - fld dword ptr [ebp-34] "Tutorial-i386.exe"+261BD: DE D9 - fcompp "Tutorial-i386.exe"+261BF: DF E0 - fnstsw ax "Tutorial-i386.exe"+261C1: 9E - sahf "Tutorial-i386.exe"+261C2: 7A 0A - jp Tutorial-i386.exe+261CE "Tutorial-i386.exe"+261C4: 76 08 - jna Tutorial-i386.exe+261CE "Tutorial-i386.exe"+261C6: 8B 45 CC - mov eax,[ebp-34] } Ссылка на комментарий Поделиться на другие сайты Поделиться
Yuzia Опубликовано 22 июля, 2018 Автор Поделиться Опубликовано 22 июля, 2018 @Garik66а если скажем нет инструкции mov, но есть инструкции fsub, fstp. Что в таком случае? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 2 минуты назад, Yuzia сказал: @Garik66а если скажем нет инструкции mov, но есть инструкции fsub, fstp. Что в таком случае? Конкретный пример приведи. В каждом случае нужно применять по разному. А вот скрипт, который я писал на следующую инструкцию после твоей давно без OHK: Спойлер { Game : Tutorial-i386.exe Version: Date : 2016-01-19 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT9,Tutorial-i386.exe,8B 45 FC 89 43 04 D9) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: code: mov eax,[ebp-04] cmp esi,1 je @f mov eax,[ebx+04] @@: mov [ebx+04],eax jmp return INJECT9: jmp code nop return: registersymbol(INJECT9) [DISABLE] INJECT9: db 8B 45 FC 89 43 04 unregistersymbol(INJECT9) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+27DA3 "Tutorial-i386.exe"+27D8B: D9 45 CC - fld dword ptr [ebp-34] "Tutorial-i386.exe"+27D8E: DE D9 - fcompp "Tutorial-i386.exe"+27D90: DF E0 - fnstsw ax "Tutorial-i386.exe"+27D92: 9E - sahf "Tutorial-i386.exe"+27D93: 76 08 - jna Tutorial-i386.exe+27D9D "Tutorial-i386.exe"+27D95: 8B 45 CC - mov eax,[ebp-34] "Tutorial-i386.exe"+27D98: 89 45 FC - mov [ebp-04],eax "Tutorial-i386.exe"+27D9B: EB 06 - jmp Tutorial-i386.exe+27DA3 "Tutorial-i386.exe"+27D9D: 8B 45 D0 - mov eax,[ebp-30] "Tutorial-i386.exe"+27DA0: 89 45 FC - mov [ebp-04],eax // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+27DA3: 8B 45 FC - mov eax,[ebp-04] "Tutorial-i386.exe"+27DA6: 89 43 04 - mov [ebx+04],eax // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+27DA9: D9 EE - fldz "Tutorial-i386.exe"+27DAB: D9 43 04 - fld dword ptr [ebx+04] "Tutorial-i386.exe"+27DAE: DE D9 - fcompp "Tutorial-i386.exe"+27DB0: DF E0 - fnstsw ax "Tutorial-i386.exe"+27DB2: 9E - sahf "Tutorial-i386.exe"+27DB3: 75 10 - jne Tutorial-i386.exe+27DC5 "Tutorial-i386.exe"+27DB5: 8B 43 58 - mov eax,[ebx+58] "Tutorial-i386.exe"+27DB8: 8B 15 A4 51 57 00 - mov edx,[Tutorial-i386.exe+1751A4] "Tutorial-i386.exe"+27DBE: E8 7D 42 07 00 - call Tutorial-i386.exe+9C040 "Tutorial-i386.exe"+27DC3: EB 57 - jmp Tutorial-i386.exe+27E1C } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yuzia Опубликовано 22 июля, 2018 Автор Поделиться Опубликовано 22 июля, 2018 @Garik66 Вот пример: Спойлер code: fstp dword ptr [eax+3C] ret lea esp,[esp-04] jmp return INJECT: jmp newmem nop nop nop return: registersymbol(INJECT) Пример №2 Спойлер code: fsub dword ptr [ebx+3C] fdiv dword ptr [gtutorial-i386.exe+27D1BC] jmp return INJECT: jmp newmem nop nop nop nop return: registersymbol(INJECT) // Если код больше 10 строк принято прятать его под спойлер. Garik66 Прочитай правила форума: Любой код, цитата и прочее - должны быть обернуты специальными тэгами. Кроме того, если фрагмент кода достаточно большой (более 10 строк кода), то его необходимо также обернуть тэгом спойлера (скрытый текст). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 5 минут назад, Yuzia сказал: Вот пример: Ты меня за кого принимаешь - за всевидящего. - мало инфы. Кстати на твою инструкцию лучше переписать скрипт так: Спойлер { Game : Tutorial-i386.exe Version: Date : 2018-07-22 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,D8 6B 04 D9 5D D0) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(INJECT) newmem: fsubr dword ptr [ebx+04] fstp dword ptr [ebp-30] cmp [ebx+10],1 jne @f mov [ebp-30],(float)100 jmp code @@: mov [ebp-30],(float)0 code: jmp return INJECT: jmp newmem db 90 return: [DISABLE] INJECT: db D8 6B 04 D9 5D D0 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+261AC "Tutorial-i386.exe"+2618E: DE D9 - fcompp "Tutorial-i386.exe"+26190: DF E0 - fnstsw ax "Tutorial-i386.exe"+26192: 9E - sahf "Tutorial-i386.exe"+26193: 7A 11 - jp Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26195: 75 0F - jne Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26197: A1 A4 F4 54 00 - mov eax,[Tutorial-i386.exe+14F4A4] "Tutorial-i386.exe"+2619C: E8 4F 01 0F 00 - call Tutorial-i386.exe+1162F0 "Tutorial-i386.exe"+261A1: E9 98 00 00 00 - jmp Tutorial-i386.exe+2623E "Tutorial-i386.exe"+261A6: 89 75 CC - mov [ebp-34],esi "Tutorial-i386.exe"+261A9: DB 45 CC - fild dword ptr [ebp-34] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+261AC: D8 6B 04 - fsubr dword ptr [ebx+04] "Tutorial-i386.exe"+261AF: D9 5D D0 - fstp dword ptr [ebp-30] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+261B2: D9 EE - fldz "Tutorial-i386.exe"+261B4: D9 5D CC - fstp dword ptr [ebp-34] "Tutorial-i386.exe"+261B7: D9 45 D0 - fld dword ptr [ebp-30] "Tutorial-i386.exe"+261BA: D9 45 CC - fld dword ptr [ebp-34] "Tutorial-i386.exe"+261BD: DE D9 - fcompp "Tutorial-i386.exe"+261BF: DF E0 - fnstsw ax "Tutorial-i386.exe"+261C1: 9E - sahf "Tutorial-i386.exe"+261C2: 7A 0A - jp Tutorial-i386.exe+261CE "Tutorial-i386.exe"+261C4: 76 08 - jna Tutorial-i386.exe+261CE "Tutorial-i386.exe"+261C6: 8B 45 CC - mov eax,[ebp-34] } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yuzia Опубликовано 22 июля, 2018 Автор Поделиться Опубликовано 22 июля, 2018 (изменено) 2 минуты назад, Garik66 сказал: Ты меня за кого принимаешь - за всевидящего. - мало инфы. Я думал ты и есть он Так ты ж уточняй. Я тут второй день "работаю". Не знаю всего. Тебе инструкции сами, что надо ломать, или может мои фото надо? Уточняй. 3 минуты назад, Garik66 сказал: fsubr dword ptr [ebx+04] fstp dword ptr [ebp-30] Можно еще более подробно объяснить зачем эти две инструкции и для чего и как их применяют? А то я их вижу раз сотый уже. А чет не могу понять как с ними работать. Изменено 22 июля, 2018 пользователем Yuzia 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 8 минут назад, Yuzia сказал: Можно еще более подробно объяснить зачем эти две инструкции и для чего и как их применяют? Как это происходит у разработчика (в нашем случае у уважаемого ДАРК Байта). "Tutorial-i386.exe"+261A6: 89 75 CC - mov [ebp-34],esi // в esi урон - он в 4 байтах. записывается в стек "Tutorial-i386.exe"+261A9: DB 45 CC - fild dword ptr [ebp-34] // Он передается, в регистр st(0)одновременно переводя его во float // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+261AC: D8 6B 04 - fsubr dword ptr [ebx+04] // Отнимается текущее значение HP получаем в st(0) отрицательно значение // нового значения HP "Tutorial-i386.exe"+261AF: D9 5D D0 - fstp dword ptr [ebp-30] // Полученного значение записывается в [ebp-30], а дальше по коду, после // некоторых манипуляций оно записывается в eax и на инструкции, // которую юзал я, записывается в наш адрес HP 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 22 июля, 2018 Поделиться Опубликовано 22 июля, 2018 31 минуту назад, Yuzia сказал: Можно еще более подробно объяснить зачем эти две инструкции и для чего и как их применяют? Из выше сказанного вот тебе ещё один скрипт "God Mode и OHK" Спойлер { Game : Tutorial-i386.exe Version: Date : 2018-07-22 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT66,Tutorial-i386.exe,89 75 CC DB 45 CC) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(INJECT66) newmem: cmp [ebx+10],1 jne @f xor esi,esi // God Mode jmp code @@: mov esi,(float)500 // OHK code: mov [ebp-34],esi fild dword ptr [ebp-34] jmp return INJECT66: jmp newmem db 90 return: [DISABLE] INJECT66: db 89 75 CC DB 45 CC unregistersymbol(INJECT66) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+261A6 "Tutorial-i386.exe"+26189: D9 EE - fldz "Tutorial-i386.exe"+2618B: D9 43 04 - fld dword ptr [ebx+04] "Tutorial-i386.exe"+2618E: DE D9 - fcompp "Tutorial-i386.exe"+26190: DF E0 - fnstsw ax "Tutorial-i386.exe"+26192: 9E - sahf "Tutorial-i386.exe"+26193: 7A 11 - jp Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26195: 75 0F - jne Tutorial-i386.exe+261A6 "Tutorial-i386.exe"+26197: A1 A4 F4 54 00 - mov eax,[Tutorial-i386.exe+14F4A4] "Tutorial-i386.exe"+2619C: E8 4F 01 0F 00 - call Tutorial-i386.exe+1162F0 "Tutorial-i386.exe"+261A1: E9 98 00 00 00 - jmp Tutorial-i386.exe+2623E // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+261A6: 89 75 CC - mov [ebp-34],esi "Tutorial-i386.exe"+261A9: DB 45 CC - fild dword ptr [ebp-34] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+261AC: D8 6B 04 - fsubr dword ptr [ebx+04] "Tutorial-i386.exe"+261AF: D9 5D D0 - fstp dword ptr [ebp-30] "Tutorial-i386.exe"+261B2: D9 EE - fldz "Tutorial-i386.exe"+261B4: D9 5D CC - fstp dword ptr [ebp-34] "Tutorial-i386.exe"+261B7: D9 45 D0 - fld dword ptr [ebp-30] "Tutorial-i386.exe"+261BA: D9 45 CC - fld dword ptr [ebp-34] "Tutorial-i386.exe"+261BD: DE D9 - fcompp "Tutorial-i386.exe"+261BF: DF E0 - fnstsw ax "Tutorial-i386.exe"+261C1: 9E - sahf "Tutorial-i386.exe"+261C2: 7A 0A - jp Tutorial-i386.exe+261CE } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения