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

lamalamaz

Пользователи+
  • Постов

    120
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Сообщения, опубликованные lamalamaz

  1. Да, инструкция разовая - срабатывает, в моём случае когда одеваешь или снимаешь шмотку с героя.

    [ENABLE]alloc(newMem,64)label(returnHere)label(nol)label(sto)label(load)newMem:cmp dword ptr [esi+00000280],(float)100je nolcmp dword ptr [esi+00000280],(float)0je stojmp loadnol:mov dword ptr [esi+00000280],(float)0 jmp returnHeresto:mov dword ptr [esi+00000280],(float)100jmp returnHereload:mov dword ptr [esi+00000280],(float)100jmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)

    Попробуй так

    • Плюс 1
  2. Csharp так же как и C++ не могут напрямую работать с регистрами, так что использование инструкций отпадает. Искать только статический указатель.

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

    То есть уже визуально можно видеть какие указатели не правильные чтобы не отсеивать по 100500 раз.

    к примеру твоя инструкция [ecx+34],eax то последний уровень будет 0x34.

    Ты бы сделал скрин инструкции которая пишет в твой адрес азота новое значение.

  3. Пробовал, но пока не нашёл, нужно будет ещё поискать (iD карты).

    Как я помню они запакованы в mpq архивы,сам формат карт .ds1

     

    Скачать распаковщик с сайтов диабло моддинга и полазить в архивах

     

     

    First, let's extract these files from the MPQs :

    • from Patch_D2.mpq :
      • Data\Global\Excel\Levels.txt
      • Data\Global\Excel\LvlPrest.txt
      • Data\Global\Excel\LvlTypes.txt
      • Data\Global\Excel\Objects.txt

         

    • from D2Exp.mpq :
      • Data\Global\Excel\LvlWarp.txt
      • Data\Global\Excel\ObjType.txt
      • Data\Global\Tiles\Act1\Town\TownE1.ds1
      • Data\Global\Tiles\Act1\Tristram\Tri_Town4.ds1
      • Data\Global\Tiles\Act2\Town\LutN.ds1 

         

    • from D2Data.mpq :
      • Data\Global\Tiles\Act1\Barracks\JailEWarpNext.ds1
      • Data\Global\Tiles\Act1\Caves\CaveDR1.ds1
      • Data\Global\Tiles\Act1\Caves\CaveEDown1.ds1
      • Data\Global\Tiles\Act1\Caves\CaveESpec.ds1
      • Data\Global\Tiles\Act1\Caves\CaveNSpec.ds1
      • Data\Global\Tiles\Act1\Caves\CaveSSpec.ds1
      • Data\Global\Tiles\Act1\Caves\CaveWSpec.ds1
      • Data\Global\Tiles\Act1\Graveyard\Gravey.ds1
      • Data\Global\Tiles\Act1\Outdoors\Cott1.ds1
    • Плюс 1
  4. Я думаю у каждой локации(уровни 1-16) есть свое уникальное имя. То есть при переходе в портал загружается карта с именем "catacombs.map" это к примеру. 

    То есть ИМХО надо определить имена подземелий(покопаться в ресурсах игры) в Olly через имя выйти на инструкцию. 

    Так сузить круг поисков.

  5. попробуй заменить прям в коде sub ecx,edi на add ecx,ecx

    По идее при любом растрачивании поинтов они должны увеличиваться в 2 раза.

     

    или jb в том же промежутке на je заменить, как я понял без этого сравнения деньги уйдут в минуса но ты можешь покупать все даже с минусом.

     

    Нет игры на данный момент, снес... Играть невозможно

  6. mov ecx,[rax+28]

    mov [rax+28],ecx

     

    Обычно между инструкциями такого типа идет вычисление то есть типо того

     

    mov ecx,[rax+28] //сохраняем текущее значение в ecx

    ...                        //манипуляции с ecx

    mov [rax+28],ecx //обновляем текущее значение из ecx

     

    можно скриншот MemoryView между этими инструкциями? Смысл в том что можно без AA скрипта сделать деньги.

     

     

    PS. Юбики выпустили очень сырой релиз Unity. Она даже на консольках глючит а FPS выше 23 не поднимается. О пк геймерах вообще молчу баг на баге оптимизация кривейшая. Нужно ждать патчи.

  7. Не задавался таким вопросом, но попробую...)

     

    Мне одному кажется странным, что "количество жизней после урона" - в двух регистрах содержится? ^_^

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

    Если все же представить, что:

    • ebx - "прошлое" значение здоровья
    • [ecx+000002D4] - количество здоровья после получения урона
    То я бы написал как-нибудь так:

    push ebpmov dword ptr ebp,edx // устанавливаем текущее значение в ebpsub dword ptr ebp,[ecx+000002D4] // отнимаем остаток здоровья от "прошлого" значения здоровья, и в ebp получаем уронpop ebp
    А дальше, чтобы проверить, правильно-ли подсчитано количество урона, то можно зарегистрировать метку (4 байта), и установить в нее значение ebp, затем добавить в таблицу имя метки, и смотреть ее значение.

    Пример:

    Далее - в СЕ клацаем на кнопку "Добавить адрес", ставим тип: 4 байта, а в качестве адреса вводим: damage

    Нажимаем "OK", включаем скрипт, получаем урон, смотрим на значение метки damage (в таблице)

    P.S.

    И да - пользуемся тегом [code ] (без пробелов). Надоедает посты править уже...

    P.S. #2

    А вообще, должна быть инструкция, которая отнимает из здоровья нужное количество единиц урона, посмотри выше по коду в отладчике.

     

    Спасибо NullAlex!Вроде разобрался что к чему.

    Теперь по мне бьют в 4 раза меньше, а я луплю по врагам в 3 раза сильнее :). А то Onehit и God уж очень портят впечатления, а так вроде как повысил дамаг и дефенс играть куда интереснее :-D

    [ENABLE]label(newmem,2048)label(returnhere)label(damage)registersymbol(damage)newmem:push ebpmov dword ptr ebp,edx // устанавливаем текущее значение в ebpsub dword ptr ebp,[ecx+000002D4] // отнимаем остаток здоровья от "прошлого" значения здоровья, и в ebp получаем уронmov dword ptr [damage],ebp // записываем в метку damage количество урона// дальше выполняем оригинальный кодdamage:dd 0// инструкция[DISABLE]unregistersymbol(damage)dealloc(newmem)
  8. Здравствуйте Геймхаклаберы!

     

    Есть такая инструкция

    mov edx,[ecx+000002D4] (срабатывает только когда наносится урон)

    Где edx - количество жизней после урона

    [ecx+000002D4] - количество жизней после урона.

     

    Значения верные смотрел из инструкции которая пишет  mov [ebp+000002D4],eax(не взял ее потому что часто обращается даже когда урон не наносится) eax=edx,[ecx+000002D4]=[ebp+000002D4].

     

    все значения целое 4 байта

     

    Суть в том что хочу высчитать сам урон.

    написал вот что:

    pushadmov eax,edx  //кол-во после урона сохраняем в eaxmov ebx,[ecx+000002D4] //кол-во до сохраняем в ebxsub ebx,eax //до урона-после урона=сам уронsub [ecx+000002D4],ebx // от жизней отнимаем сам уронpopadmov edx,[ecx+000002D4] //оригинальная инструкцияjmp returnhere
    Суть в том что не работает, мобы умирают с одной тычки. Подскажите правильно ли вообще так обсчитывать? И как вычислить урон иным методом если тут написание не верно.
  9. Какой див, вы что? Целочисленное деление на числа, кратные двум делаются побитовым сдвигом вправо. Например, если число нужно разделить на

    2 - делается сдвиг вправо на 1 бит

    4 - сдвиг вправо на 2 бита

    8 - 3 бита

    16 - 4 бита и так далее.

     

    Спасибо огромное вроде разобрался.

    sar eax,1

    mov [ebx],eax

    mov ebx,eax

    mov eax,[esp+14]

    Работает как надо.

  10. Хорошая мысль. Игра XIII. Ниже скину сам скрипт. Суть в том что с 0 не получается сравнивать(условие не срабатывает).

    Еще суть в том что сначала из eax вычитается урон из оружия потом делится. Пробывал перед вычитанием делить всеравно опускается ниже нуля(FFFFF0C) и начинает делить уже это число. Как бы это обойти? Вот такой чудо скрипт написал чтобы хоть как то это обойти.

    [ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048)label(returnhere)label(1hit)label(orig)label(origs)label(cont)                  // Инструкция вычитания жизней работает и с адресом врагов и с моим и еще с кучей разных адресовnewmem:cmp [ebx+38],0  // отсеиваем левые адреса(оставляем только мои ХП и ХП врагов)je contjmp origcont:cmp [ebx+80],0  //отсеиваем все адреса кроме адреса ХП враговje origjmp 1hit1hit:pushad  //стекем все регистрыmov edx,0  //обнуляем высший порядок для деленияmov eax,eax  // это для наглядности так как eax делимоеmov edi,2  // это делитель в нашем случае 2div edi // делим на 2//следующей строчкой идет сравнение так как жизни перемахивают через 0 и получаются числа (FFFFFXX и т.д.)cmp eax,1111111 //11111111 взял это число т.к. он успевает поделить FFFFFFFXXjg origs // если больше заданного прыгаем на обнулениеmov [ebx],eax //  оригинальная инструкцияpopad  //восстанавливаем регистрыmov ebx,eaxmov eax,[esp+14]jmp returnhereorig: // оригинальная инструкцияmov [ebx],eaxmov ebx,eaxmov eax,[esp+14]jmp returnhereorigs: // сюда прыгаем после сравнения результата деленияpopad //восстанавливаем регистрыmov eax,0 //обнуляем eaxmov [ebx],eaxmov ebx,eaxmov eax,[esp+14]jmp returnhere"Core.dll"+1959E:jmp newmemnopnopnopreturnhere:  [DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)"Core.dll"+1959E:mov [ebx],eaxmov ebx,eaxmov eax,[esp+14]//Alt: db 89 03 8B D8 8B 44 24 14

    Как убрать эти костыли? Сделать так чтобы при невозможном делении на целое(1/2) выдавало 0 и остаток 1. Как-то так.

     

    P.S. Или как то заменить умножением с дробными числами все куда проще нежели с целыми.

  11. Вроде делится но теперь такая трабла.

    Жизни доходят до целого которое делится на 2 например до 3. И тут при следующем делении выскакивает 268435427 и потом оно делит делит весь цикл пока не дойдет до 0.(враг умирает). Как этот цикл убрать?

  12. Здравствуйте Геймхаклаберы. Возник вопрос по целочисленному делению. Читал инфу из статей и справочников, но вот как это применить в игре не получается.

     

    Вот пример инструкции которая пишет обновленное количество жизней при ударе врага.

     

    mov [esi+000000F1C],eax

     

    Так вот вопрос. Как eax разделить на 2.

    То есть

     

    код

    код

    прилетает значение жизней противника в eax(к примеру 500)

    потом 500 прилетает в [esi+000000F1C].

    как тот же 500 разделить на 2 при обращении к инструкции.

     

    пробовал так

    pushad

    mov edx,0

    mov eax,eax

    mov edi,2

    div edi

    mov [esi+000000F1C],eax

    popad

     

    Но происходит вылет... Прошу помощи исходя из моей инструкции.

  13. Как в OllyDBG и CE посмотреть асму- хз.
    Через классы- тож не варик,не понимаю как там и что.

    Урок кодера по Far Cry смотри:

     

    http://www.youtube.com/watch?v=4249xzjqI88

    Отличный видео-урок.

  14. Оказывается инструкция мертвая была. Переписал на новую, работает)

    AOBScan - идея неплохая... Но слабо оптимизированная, ибо писать буду в том же СЕ :(

    Вот еще одна непослушная инструкция ))

    [ENABLE]alloc(newmem,2048,"ShadowOfMordor.exe"+CC19E4) label(returnhere)label(originalcode)label(exit)newmem:originalcode:mov [rbx+50],ecxcmp qword ptr [rdx+00000088],00exit:jmp returnhere"ShadowOfMordor.exe"+CC19E4:jmp newmemnopnopnopnopnopnopreturnhere:[DISABLE]"ShadowOfMordor.exe"+CC19E4:mov [rbx+50],ecxcmp qword ptr [rdx+00000088],00dealloc(newmem)

    Не посоветуешь, как лучше ее "укротить" ?)

    Ну тут проще вместо ecx пиши свое значение(смотря какой тип данных обрабатывает эта инструкция)

    mov [rbx+50],(float)100

    cmp qword ptr [rdx+00000088],00

     

    или

     

    mov [rbx+50],64

    cmp qword ptr [rdx+00000088],00

     

    все зависит от типа данных

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

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

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