Перейти к содержанию

[HELP] Работа со значениями в типе FLOAT.


Рекомендуемые сообщения

Всем привет.
С вами снова я. (КТО? Крузя в пальто - шутки для элитки. Не понял? Не элитка)

Спрашивал я в 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). 
// Не обращайте на кол-во скриптов. Я пробовал разными способами/методами что либо сделать.

Спойлер


hack1.png

После чего, сверил их () структуру (Нашел отличия в eax+10).
Правильность "проверки" проверял. Если менять в коде проверку с 1 на 2, то скрипт работал с врагами.
 

Спойлер

hack2.png


После чего, брал инструкцию что работала с игроками/врагами (проверял на работу с другими адресами)
Сама инструкция: 

Спойлер

Hack3.png


После чего делал AOB Inject, писал свой код (с костылями или без. Не знаю. Мы писали как могли)

И угадайте что я в конце ловил? А я сам и не знаю если честно.
Если я ударял Игрока, ловил ошибку:
 

Спойлер

hackerror2.png
 

И еще супер топове значение:

Спойлер

hackerror.png

В случае если я ударял Врага, то ошибки не было. И значение убавлялось (ну логично да?) Хотел по позже сделать 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: Я только начинаю входить в тему с Ассемблером, так что вопросы могут быть слишком глупыми. 

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Yuzia сказал:

Я так думаю я накосячил либо с типом данных (например, передаю 4 byte в float) либо ошибка в самом коде. (Скорее всего второе, но это не точно)

Фильтр у тебя абсолютно верен по смещению +10 лежит ID команды и наша 1.:D  

Ошибка в коде, потому что ты не понял, что именно делает участок кода, на котором ты выбрал свою инструкцию (кстати следующая инструкция

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]
}

 

 

Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

@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


Прочитай правила форума:

  1. Любой код, цитата и прочее - должны быть обернуты специальными тэгами. Кроме того, если фрагмент кода достаточно большой (более 10 строк кода), то его необходимо также обернуть тэгом спойлера (скрытый текст).

 

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Yuzia сказал:

Вот пример:

:D Ты меня за кого принимаешь - за всевидящего. - мало инфы.

Кстати на твою инструкцию лучше переписать скрипт так:

Спойлер

{ 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
Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Garik66 сказал:

Ты меня за кого принимаешь - за всевидящего. - мало инфы.

Я думал ты и есть он :D

Так ты ж уточняй. Я тут второй день "работаю". Не знаю всего.
Тебе инструкции сами, что надо ломать, или может мои фото надо?
Уточняй.

3 минуты назад, Garik66 сказал:

fsubr dword ptr [ebx+04] fstp dword ptr [ebp-30]

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

Изменено пользователем Yuzia
  • Смешно 1
Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.