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

Garik66

Помогаторы
  • Постов

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

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

    292

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

  1. Попробуй использовать инструкцию которая работает на запись, а не на чтение. :closeyes:

    Т.е. игроку нужно будет, чтобы записать новое значение, идти и воровать что-нибудь (либо другое кармическое действие) - это неинтересно.

  2. Перепробовал всё, думал сам справлюсь. Нет всё-таки не обойтись, без совета опытных. 

    Пишу скрипт на изменение Кармы (по желанию игрока) для Fallout 3.

    Адрес Кармы [[0107a104]+380].

    Пишет в адрес одна инструкция (пока проверял только на воровстве, но думаю, что будет отвечать эта же инструкция за любые кармические действия в игре)

    1.

    Fallout3.exe+36E616

    fstp dword ptr [edi+esi*4+00000324]
     
    Использовал её при написании скрипта, чтобы не падала Карма.
    Доступ к адресу имеют две инструкции:
    2.
    Fallout3.exe+36E28B
    fld dword ptr [ecx+eax*4+00000288]
     
    (очень частое обращение к этой инструкции)
    3.
    Fallout3.exe+36E304  
    fld dword ptr [ecx+eax*4+00000288]
    (очень редкое обращение к этой инструкции 2/3 -> 700/1, где то так различается частота обращения.)
    Причём 3. инструкцию плагин (Сканер сигнатур на Lua), скачанный отсюда, не находит.
     
    Написал скрипт, опирающийся на 2. инструкцию:
    [ENABLE]aobscan(AdresInGame4_1, D9xxxxxxxxxxxxD9xxxx74xxD9xxxxxxxxxxxxEBxxD9xxxxxxxxxx8BxxD9xxxxxxxxxx8BxxFFxxD9xxxxxx8BxxE8xxxxxxxxD9xxxxxx)alloc(newMem4_1, 64)label(returnHere4_1)Label(MenjaemKarmu4_1)label(Karma4_1)registersymbol(Karma4_1)registersymbol(AdresInGame4_1)newMem4_1:cmp eax,17            // Вводим фильтр чтобы работать конкретно с Кармой.je MenjaemKarmu4_1fld dword ptr [ecx+eax*4+00000288]jmp returnHere4_1                                // Изменяем Карму (до -750 - очень злой;MenjaemKarmu4_1:                // от -750 до -250 - элой; от -250 до 250 -fld dword ptr [Karma4_1]        // нейтральный; от 250 до 750 - добрый иjmp returnHere4_1               // от 750 - очень добрый.Karma4_1:                       // Добавляем адрес в таблицу с адресомdd 0                            // "Karma4_1" (без кавычек) и названием,                                // допустим "Карма" и вписываем нужноеAdresInGame4_1:                 // нам значение.jmp newMem4_1nopnopreturnHere4_1:[DISABLE]AdresInGame4_1: //Fallout3.exe+36E28Bfld dword ptr [ecx+eax*4+00000288]unregistersymbol(Karma4_1)unregistersymbol(AdresInGame4_1)dealloc(newMem4_1)

    Почему то он не хочет ни чего делать. Подскажите, где я не догоняю?

     


    Может нужно 3. инструкцию приатачить в скрипт?

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

    UPD:

    В скрипте у тебя скобочки лишние только:

    mov [eax+000000060],Konctanta // #100
    Огромное спасибо! 

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

     

    Результаты обсуждения, если кто читал см. в моей теме

     

    Тему можно закрыть.

  4. Вроде бы разобрался как сделать это при помощи ввода переменной.

    Использовал это в третьем скрипте (последней версии) в этой теме

    [ENABLE]alloc(Primer, 64)label(Vozvrat)label(Konctanta)registersymbol(Konctanta)Primer:mov [eax+000000060],[Konctanta] // #100mov [eax+000000064],[Konctanta] // #100mov [eax+000000068],[Konctanta] // #100mov [eax+04],edxmov eax,[esi+08]jmp VozvratKonctanta:db 64AdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame://mov [eax+000000060],0 // Так конечно нельзя делать.//mov [eax+000000064],0//mov [eax+000000068],0mov [eax+04],edxmov eax,[esi+08]unregistersymbol(Konctanta)dealloc(Primer)   
  5.   Yuriko33 игры у меня нет. Если инструкции и ID героя в скрипте найдены правильно, то по идее  всё должно работать. Попробуй так:

    [ENABLE]aobscan(address0, D9 xx xx 8B xx xx xx xx xx)alloc(newMem, 512)label(returnHere)registersymbol(address0)label(hit)label(god)newMem:cmp [esi+84],0je godjne hitgod:mov [esi+78],(float)100fld dword ptr [esi+78]mov eax,[esi+000000AC]jmp returnHerehit:mov [esi+78],(float)0fld dword ptr [esi+78]mov eax,[esi+000000AC]jmp returnHereaddress0:jmp newMemdb 90 90 90 90returnHere:[DISABLE]address0:fld dword ptr [esi+78]mov eax,[esi+000000AC]dealloc(newMem)unregistersymbol(address0)  
  6. При включении (секция [ENABLE]) запоминай значение, а при выключении (секция [DISABLE]) - восстанавливай, как обычно.

     

    "Как обычно"? Я этого пока ещё ни разу не делал, хотя и предполагал, что именно так и нужно будет сделать.

     

    Чтобы я разобрался в вопросе, давайте на примере попробуем:

    Допустим я написал рабочий скрипт:

     

    Мне нужно чтобы при де активации скрипта все три значения приняли значение 0.

    Могу ли я записать скрипт, допустим так:

     

    Если не могу, перепишите пожалуйста правильно скрипт.

    [ENABLE]alloc(Primer, 64)label(Vozvrat)Primer:mov [eax+000000060],#100mov [eax+000000064],#100mov [eax+000000068],#100mov [eax+04],edxmov eax,[esi+08]jmp VozvratAdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame:mov [eax+04],edxmov eax,[esi+08]dealloc(Primer) 
    [ENABLE]alloc(Primer, 64)label(Vozvrat)Primer:mov [eax+000000060],#100mov [eax+000000064],#100mov [eax+000000068],#100mov [eax+04],edxmov eax,[esi+08]jmp VozvratAdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame:mov [eax+000000060],0mov [eax+000000064],0mov [eax+000000068],0mov [eax+04],edxmov eax,[esi+08]dealloc(Primer)  
  7. "в СЕ выбрать процесс Вашей игры, скопировать скрипт в свою таблицу в СЕ" всё так и сделал ЗАПУСТИЛ "CE" выбрал FEAR.exe. после "открываем окно Отладчик  далее Инструменты и Автоассемблер  далее  копи паст и выролнить" и выскакивает окошко с надписью  "Error while scanning AOB"s: address0" и больше ничего!

    Может в скрипте что то надо вписать?

     

    Тогда да. В скрипте, видно что сигнатура (aobscan(address0, D9 46 78 8B 86)) набрана вручную. У Вас скорее всего не сходятся версии игры.

     

    Нужно либо скачать туже версию игры, либо попросить 

    lamalamaz

     В личных сообщениях прислать адрес инструкции.(будет выглядеть, типа так (FEAR.exe+36E4E0)

    В скрипте удалить строчку Аобскана "(aobscan(address0, D9 46 78 8B 86)" и заменить все строки "address0:" на полученный адрес "FEAR.exe+36E4E0:"

     

    Либо, что ещё сложнее, поискать сами инструкции в игре, эти

    (fld dword ptr [esi+78]

    mov eax,[esi+000000AC]).

    Ещё вариант (если в версиях отличаются только регистры в инструкциях), попробуйте 

     

    Вариант 1:

    Замените 

    (aobscan(address0, D9 46 78 8B 86)

    на

    (aobscan(address0, D9 xx xx 8B xx AC 00 00 00)

     

     Вариант 2:

    на

    (aobscan(address0, D9 xx xx 8B xx xx xx xx xx)

    Может что-то сработает

     

  8. Спасибо! Попробую сделать, как сказали) Надеюсь получится)

    Всё сделал,  как было сказано выше... Но теперь у меня пишет "Error while scanning AOB"s: address0" 

    Простите, что туплю, но я ещё тот взломщик))

    Спасибо!

    Скорее всего Вы не запустили игру.

    Нужно запустить CE, запустить игру, в СЕ выбрать процесс Вашей игры, скопировать скрипт в свою таблицу в СЕ.

    После этого должно быть всё нормально. 

  9. Для тех, кто читал:

    Решение проблемы и полный рабочий скрипт выложен в форуме "Скрипты и таблицы":

    http://forum.gamehacklab.ru/topic/3010-skripty-dlia-fallout-3-ot-garik66/?p=20478

     

    Эту тему можно закрыть.

  10. NullAlex

    Большое спасибо за помощь. Я уже разобрался в чём дело, вот рабочий код (на 100 %). Подробнее опишу в чём дело и выложу уже готовый код

    в форуме "скрипты и таблицы" и сюда выложу ссылку.

    alloc(newMem, 128)label(returnHere)label(Razdet_1)label(Razdet_2)label(Razdet_3)label(Razdet_4)label(_Razdet)registersymbol(_Razdet)newMem:cmp [_Razdet],3je Razdet_4cmp [_Razdet],2je Razdet_3cmp [_Razdet],1je Razdet_2cmp [_Razdet],0je Razdet_1Razdet_1:mov dword ptr [esi+00000280],(float)100mov [_Razdet],1jmp returnHereRazdet_2:mov [_Razdet],2jmp returnHereRazdet_3:mov dword ptr [esi+00000280],(float)0mov [_Razdet],3jmp returnHereRazdet_4:mov [_Razdet],0jmp returnHere_Razdet:dd 0Fallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]unregistersymbol(_Razdet)dealloc(newMem)
  11. NullAlex

    К сожалению   :closeyes: тоже не работает.

    Я уже перепробовал кучу разных прыжков, пока не получается.

    В твоём скрипте, даже, если убрать: 

    originalcode:

    fstp dword ptr [esi+edi*4+00000200] // не забываем про оригинальный код

    и добавить в:

    cmp........ [esi+00000280],(float)100   -    dword ptr.

    всё равно  (float)100 не записывается по нужному адресу.

     

  12. Так у тебя же один адрес отвечает за 2 скрипта

    Fallout3.exe+36E4E0

    Да. И я об этом уже писал.

     

    Прежде чем кидаете ссыль, почитайте её сами.

    В моём случае от одной инструкции идут два взаимоисключающих кода.

    А что, в этом случае нельзя объединить в один код?

     

    Главная проблема не в том, что  один адрес отвечает за 2 скрипта, а в том, что тип float.

    Если бы были целые, давно бы уже подобрал переходы (прыжки).

  13. [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.

    load:

    mov dword ptr [esi+00000280],(float)100

    jmp returnHere

     

    если есть это:

     

    sto:

    mov dword ptr [esi+00000280],(float)100

    jmp returnHere

     

    И здесь:

    2.

     

    cmp dword ptr [esi+00000280],(float)0

     

    значение dword ptr [esi+00000280], в игре может быть и выше 0 и при этом не равняться 100.

     

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

    На этом форуме уже была статья про объединения 2 -х скриптов в один.

    Используй поиск по форуму.

     

    Тебе ссюда

    http://forum.gamehacklab.ru/topic/1972-obedinenie-dvukh-i-bolee-skriptov-v-odin/?hl=объединение

    Прежде чем кидаете ссыль, почитайте её сами.

    В моём случае от одной инструкции идут два взаимоисключающих кода.

  14. При каком условии должно быть 100 а при каком 0?При срабатывании инструкции чередовать 100 и 0?

     

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

  15. Видать уже парюсь %) , никак не могу объединить два рабочих кода в один.

    1.

    [ENABLE]alloc(newMem,64)label(returnHere)newMem:mov dword ptr [esi+00000280],(float)100//fstp dword ptr [esi+edi*4+00000200]jmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)

    2.

    [ENABLE]alloc(newMem,64)label(returnHere)newMem:mov dword ptr [esi+00000280],(float)0//fstp dword ptr [esi+edi*4+00000200]jmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)

    2 запускаю после выключения 1 (Оба работают: 1 прописывает 100, где мне нужно, 2 - 0.)

    Уже по-моему все варианты переходов (прыжков) перепробовал:

    В начале сравнивал с 100 (сотней):

    [ENABLE]alloc(newMem,64)label(returnHere)label(Razdet)newMem:cmp dword ptr [esi+00000280],(float)100jbe Razdetmov dword ptr [esi+00000280],(float)100 //Эта часть работаетjmp returnHereRazdet:mov dword ptr [esi+00000280],(float)0 //Эта не работаетjmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)

    Затем попытался с помощью флага, но здесь вообще ничего не получается:

    [ENABLE]alloc(newMem, 128)label(returnHere)label(Razdet)label(_Razdet)registersymbol(_Razdet)newMem:cmp [_Razdet],1jne Razdetmov dword ptr [esi+00000280],(float)0mov [_Razdet],0jmp returnHereRazdet:mov dword ptr [esi+00000280],(float)100mov [_Razdet],1jmp returnHere_Razdet:dd 0Fallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]unregistersymbol(_Razdet)dealloc(newMem)

    Мастера подскажите пжлста, где ошибаюсь.

    Заранее Болшой СПАСЫБ!!!

  16. Здравствуйте, подскажите как реализовать спавн либо подмену машины  в gta san andreas или в другой игре с открытым миром с помощью Cheat Engine.

    Пробовал менять id машины результата никого. 

     

    Может мой пример подойдёт:

     

    Тоже хотел организовать создание любого предмета с нужными мне характеристиками в игре "TheHell" (мод для "Diablo - Hellfire").

    Со встроенной функцией спавна разобраться не сумел (знаний не хватает).

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

     

     

    А причем тут id машины? 

     

     

    Обе сделаны на использовании ID предмета:

     

    1. Если кладём предмет в инвентарь, то через 5 секунд (медленно, но таймер не стал менять, за одно можно посмотреть характеристики предмета) он меняет предмет на следующий в игре, поднимаем вновь созданный предмет, кладём в инвентарь - следующий предмет, ну и т.д. Всего в "TheHell" 399 предмета (не волшебных, от ID=0 (Золото) и до 398, в  "Diablo - Hellfire" было гораздо меньше). Если ID становилось равным 399, то происходил вылет из игры, поэтому зациклил опцию, т.е., если вы положите вновь созданный предмет, то на 400 раз получите предмет с которого начали (например - 1 золотой, 2 - ножик - 399 итераций - 1 золотой). На любом понравившемся предмете можно остановиться и оставить себе. Новые предметы, при кидании на землю, не уничтожаются. 

     

    2. Работает по принципу - предмет тот же, но меняются его волшебные свойства (подробно описывать не буду). Технология та же - поднял предмет, положил в инвентарь - через 5 секунд новый предмет.

     

    Сочетая обе опции получаем почти любой предмет в игре.

     

    Ну вот, как делал:

     

    1. Находил адрес любой характеристики предмета.

    2. Из этого адреса смотрел регион памяти, в нём находил ID предмета. (В моём случае у предмета два ID - 1. ID. который я описал выше (назвал его ID вида)и 2. ID, отвечает за уникальность предмета (на основе него Разрабы игры например уничтожали предметы, брошенные на землю) (Его назвал, не мудрствуя ID уникальности).

    3. Ставя бряки на запись и на чтение, в зависимости от ситуации (превый, когда меняется ID; второй, когда  меняется что-то, но ID остаётся прежним), нашёл нужные мне инструкции. 

     

    Как-то так.

  17. Фактически, эти уровни являются так называемыми локациями, то есть, они не находятся в памяти игры, а загружаются в момент перехода на уровень. Теоритически можно найти функцию загрузки уровня при входе во врата, проанализировать ее, и запускать с нужными параметрами. А сразу после загрузки уровня уже телепортировать в нужное место.

    Собственно я так и делал и нашёл все инструкции для X и Y (и в портале и на переходах м/у уровнями они одинаковые (их две на каждую координату)), для Z - 3 инструкции (1 - при переходах м/у уровнями, 2 - при входе в портал из уровня в деревню и 3 - наоборот из деревни назад на уровень). Проблема в нахождении момента, когда игра получают команду загрузить карту, вот если бы это место отследить.

     

    Скачал, для того чтобы запустить в оконном режиме игру, свежую версию проги - "dxwnd v2_02_99_build(no locale)", благо они до сих пор её делают, крутая прога стала, не то что раньше, но зараза на английском.

    Мод для "Дьябло" запустить в оконном режиме не смог, а вот сам  "Diablo - Hellfire" запустил.

     

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

     

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

    Может всё-таки доделаю. Мне кажется, что если найти где искать, то там окажется всё просто. Скорее всего должно будет выглядеть так:

    1. На (перед) инструкции, которая даёт команду какую карту игре загрузить, меняем циферками (от 0 (деревня) и до 16 (уровни)) номер нужной нам карты.

    2. Загружаем Z, X, Y (по соответствующим инструкциям - их я уже нашёл) и...........................

    3. Радуемся - У НАС ВСЁ ПОЛУЧИЛОСЬ!!!  :-D   

     

    Короче если у кого-нибудь есть дельные мысли - советуйте, помогайте. Заранее - БОЛШОЙ СПАСЫБ!!! 

     

    Ссылка на мод, для которого пишу трейнер - [ССЫЛКА УДАЛЕНА]

    Ссылку на прогу "dxwnd v2_02_99_build(no locale)" забыл откуда качал, но думаю ГУГЛ поможет.

    Кстати, если кому удастся запустить Diablo: The Hell [v1.196] [ENG] это мод в оконном режиме с помощью этой проги или как то иначе, тоже просьба - поделиться информацией. И тоже заранее - СЕНКУЮ БАРЗО!!!  :-D 

  18. Занимаюсь написанием "Телепорта" для мода под старенькую игру "Diablo - Hellfire".

    С координатами X и Y разобрался - Герой прыгает в пределах уровня. (Пока разбирался, много приколов насмотрелся, особенно было смешно, когда бегало куча копий Героя  :-D

    Но никак не могу заставить прыгать Героя между уровнями.

     

    Для тех, кто не знает игры: в игре есть карты: Деревня ( с которой собственно и начинает Герой) и уровни в соборе, по смыслу спускающиеся вниз с 1 и по-моему по 16. На уровни можно попасть через входы или через порталы (соответственно идёт подгрузка карты).

     

    Якобы координату Z я нашёл и вроде бы даже нашёл инструкции, при которых Герой куда-то прыгает (я пытался сделать, чтобы прыгнул из подземного уровня назад в деревню или выше на уровень), но подгрузки карты не происходит и собственно на экране участок уровня без Героя и всё - играть больше нельзя, причём враги подходят и начинают бить пустое место, где ранее стоял герой. (Смотрится прикольно  :-D )

     

    Мой вопрос в чём:

    1. Можно ли реализовать чит "Телепорт" в подобных играх по трём (а не по двум) координатам?

    2. Если нет, объясните почему?

    3. Если можно, то как это сделать? Что я не учитываю?

  19. ТОВАРИЩИ HELP!!!!!!!!!!!!!!!!

    Пока игрался с проверкой скриптов, случайно сохранил поверх своей таблицы нулевую таблицу.

    Неужели вся 2-х недельная работа на смарку (там 10 рабочих скриптов и куча адресов была)?

    Или есть возможность как то восстановить?

     

    Уф восстановил. :-D  Получилось даже Красивше. 

    Всё-таки идти по проторенной дороге гораздо быстрее - понадобилось двое суток вместо 2-х недель.

    Осталось поиграться с координатами и можно делать трейнер.

    Но вопрос "есть возможность как то восстановить?" оставлю открытым, вдруг кто-нибудь знает ответ.

    Да и забыл: 

     

    Для новичков, таких же как и я.

    Столкнулся с проблемкой. И нашёл решение, может кому-то из новичков поможет.

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

    Когда при восстановлении таблицы я дошёл до написания этого скрипта, у меня метка адреса оказалась другая. В результате, активация вроде бы рабочего скрипта, приводила к вылету игры.

    Я вначале растерялся, перезагрузка не помогала, вручную вписать адрес в код нет возможности, я даже пару раз переустановил игру по глупости.

     

    Короче, если поняли в чём была проблема, решение:

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

    Оставляем в скрипте оригинальный код, главное метку адреса делаем как в начальном скрипте (перед вылетом).

    Активируем скрипт, выключаем и всё адрес игры восстановлен.

     

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

     

  20. [ENABLE]...alloc(newmem,2048)...label(loop)newmem:...push eax // Заталкиваем в стекpush esi // регистрыpush ecx // чтобы восстановить потомpush ebx // оригинальные значенияmov ecx,364 // Записываем количество проходов в циклеloop:lea esi,[oldaddress] // Поместить в ESI адрес старого участка памятиlea ebx,[newaddress] // поместить в ebx адрес-приемникmov al,[esi] // загрузить в al байт из [ESI]mov byte ptr [ebx],al // записать в новый адресdec ecx // Уменьшить счетчик циклаinc ebx // Увеличить адрес-приемникinc esi // увеличить адрес-источникcmp ecx,0 // Достигли ли конца цикла?je @F // Если да, выходим из циклаjmp loop // Прыгаем на метку loop, то есть, переходим к следующей итерации цикла@@: // Безымянная метка для указания местоположения выхода из циклаpop ebx // Восстановлениеpop ecx // задействованных pop esi // в циклеpop eax // регистров...

    Попробуй так.

     

    Попробовал, не пашет.

    Нашёл ещё одну ошибку в коде, нужно так:

     

    push edx // Заталкиваем в стекpush esi // регистрыpush ecx // чтобы восстановить потомpush ebx // оригинальные значенияmov ecx,16c // Записываем количество проходов в цикле{loop:} //МЕТКУ НУЖНО СТАВИТЬ НИЖЕ ПЕРВЫХ АДРЕСОВ!!!!!lea esi,[eax+dbc] // Поместить в ESI адрес старого участка памятиlea ebx,[eax+53a8] // поместить в ebx адрес-приемникloop:mov al,[esi] // загрузить в al байт из [ESI]mov byte ptr [ebx],al // записать в новый адресdec ecx // Уменьшить счетчик циклаinc ebx // Увеличить адрес-приемникinc esi // увеличить адрес-источникcmp ecx,0 // Достигли ли конца цикла?je @F // Если да, выходим из циклаjmp loop // Прыгаем на метку loop, то есть, переходим к следующей итерации цикла@@: // Безымянная метка для указания местоположения выхода из циклаpop ebx // Восстановлениеpop ecx // задействованныхpop esi // в циклеpop edx // регистров

     

    После этого всё заработало.
  21. mov al,[esi] // загрузить в al байт из [ESI]mov byte ptr [ebx],al // записать в новый адресdec ecx // Уменьшить счетчик циклаinc ebx // Увеличить адрес-приемникinc esi // увеличить адрес-источник

    Попробуй так.

    Хорошо попробую. Но теперь, пока не восстановлю. :unsure:

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

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

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