MasterGH Опубликовано 26 июля, 2015 Поделиться Опубликовано 26 июля, 2015 Обсуждение будущей функцииЯ подумал, вот есть функция сравнения структур. И захотелось что-то похожее сделать по сравнению адресов прерывающихся на инструкциях. Захотелось разбивать их по группам и видеть, какие инструкции обращались к адресам из других групп или не обращались вообще.На практике выяснилось, что определение инструкции, которые работают с адресами нашего героя, союзников и врагов, довольно хлопотное дело, т.к. адресов много и картина может тут же поменяться при игре с боссами или другими персонажами. Т.е. хочется придумать помощника, который не ошибется и будет быстро определять работает ли инструкция только с одним адресом, работает ли при этом с другим адресом из другой группыВ планах плагин, который будет на протяжении всей игры сортировать инструкции работающие с адресами по группам. Т.е. это позволит искать инструкции, которые работают с одной группой и не работают с другой. Самое прикольное, что из ГУИ ничего нового кроме контекстного меню не нужно.Например создать разметку в главной таблице CE "Debug" это просто Header как и все узлы без адресов. На Debug вызываем контекстное меню "Start Code Sniffer". После чего инструкции по группам начинают сортироваться и устанавливаться как дочерние элементыДля остановки функции на том же меню надо вызывать конткетсную функцию, которая будет названа как "Stop Code Sniffer". На кажом узле можно вызывать свою функцию "Start Code Sniffer" или переименованную на "Stop Code Sniffer"Чем это поможет?Под узлом Single будут инструкции, которые работали только с вышестоящим адресом.Под узлом Multiple будут инструкции, которые работали как с вышестоящим адресом, так и с адресами из других групп. Более того, под Multiple может быть довольно ветвящаяся структура, например Здесь мы увидим, что инструкции работающие со здоровьем нашего персонажа срабатывали по-разному. Какие-то только под Single - значит работаю с нашим здоровьем. Какие-то под Multiple работали с разными адресами здоровья нашего персонажа. И даже есть инструкции, которые работали как с патронами союзников так и врагов.Вот такие вот дела. Мне кажется такого инструмента очень не хватает в CE.Вот пример из DeadRising 3Инструкции работающие со здоровьем босса и нашего герояИнструкции работающие со здоровьем главного персонажаИнструкции работающие с союзником....Сколько тут ручной работы, по сортировки какие инструкции и с кем работают. Если бы был инструмент, который разбрасывал инструкции, какие с кем работают, то было бы здорово.Так в таблице CE можно брать адреса, которые рассчитываются неизвестным способом. Например, если мы адрес вытаскиваем через поинтеры или через инъекцию кода меткой. Еще можно цвета назначать на узлы для более наглядного вида.Зная какие инструкции с какими группами адресов работают на протяжении прохождении части игры, мы можем делать в них инъекции не сравнивая структуры данных. Где-то будет запись в один адрес, где-то будет запись в группу адресов, а где-то будет запись в разные группы адресов.Вот такие вот мысли Debug Мой персонаж Здоровье : 0x000000 Патроны : 0x000000 КоординатаX : 0x000000 Союзники Здоровье : 0x000000 Патроны : 0x000000 КоординатаX : 0x000000 Враг Здоровье : 0x000000 Патроны : 0x000000 КоординатаX : 0x000000 Debug Мой персонаж Здоровье : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Патроны : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... КоординатаX: 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Союзники Здоровье : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Патроны : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 КоординатаX: 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Враги Здоровье : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Патроны : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 КоординатаX: 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Debug Мой персонаж Здоровье1 : 0x000000 (прим. нашлось несколько адресов здровья нашего героя) CodeSniffer Single .... Multiple .... Здоровье2 : 0x000000 CodeSniffer Single .... Multiple .... Здоровье3 : 0x000000 CodeSniffer Single Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Multiple Мой персонаж Здоровье1 (это инструкции, который сработали со здоровьем 3 и 1) Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Здоровье2 (это инструкции, который сработали со здоровьем 3 и 2) Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 .... Союзники Патроны (это инструкции, который сработали со здоровьем 3 и патронами союзников) Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000 Враги Патроны (это инструкции, который сработали со здоровьем 3 и патронами врагов) Code(hitcount): 0x000000 Code(hitcount): 0x000000 Code(hitcount): 0x000000.... 13F76AE0B - 66 41 0F6E 71 10 - movd xmm6,[r9+10] (тут еще где-то были инструкции работающие со здоровьем союзников, не помню, некогда уточнять) 13F76AE48 - 66 41 0F6E 71 10 - movd xmm6,[r9+10] 13F72D9EB - 83 78 10 00 - cmp dword ptr [rax+10],00 13FEF8CAF - 66 0F6E 48 10 - movd xmm1,[rax+10] 13F931C49 - 8B 41 10 - mov eax,[rcx+10] (вот похожая со следующим списком) 13F9D6C31 - 66 0F6E 48 10 - movd xmm1,[rax+10] 13F931C49 - 8B 41 10 - mov eax,[rcx+10] (опа, вот инструкция которая рабтает как с боссом, так и с главным персонажем) 13FEB9851 - 83 79 10 00 - cmp dword ptr [rcx+10],00 13FEB9893 - 44 01 67 10 - add [rdi+10],r12d 13FEB989A - 44 8B 47 10 - mov r8d,[rdi+10] 13FEB98CB - 44 89 47 10 - mov [rdi+10],r8d 13FEB99FA - 83 7F 10 00 - cmp dword ptr [rdi+10],00 13F7953C7 - 83 78 10 00 - cmp dword ptr [rax+10],00 13F630C5D - 66 0F6E 48 10 - movd xmm1,[rax+10] 13FB4EF52 - 8B 40 10 - mov eax,[rax+10] 13F79581F - 83 78 10 00 - cmp dword ptr [rax+10],00 13FBB30FE - 83 78 10 00 - cmp dword ptr [rax+10],00 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 26 июля, 2015 Поделиться Опубликовано 26 июля, 2015 (изменено) Молодец мастер...задумал такое... Изменено 26 июля, 2015 пользователем LIRW Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения