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

Плагин к CE. Распределение инструкций обращающихся к адресам по группам


MasterGH

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

Обсуждение будущей функции

Я подумал, вот есть функция сравнения структур. И захотелось что-то похожее сделать по сравнению адресов прерывающихся на инструкциях. Захотелось разбивать их по группам и видеть, какие инструкции обращались к адресам из других групп или не обращались вообще.

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

В планах плагин, который будет на протяжении всей игры сортировать инструкции работающие с адресами по группам. Т.е. это позволит искать инструкции, которые работают с одной группой и не работают с другой. Самое прикольное, что из ГУИ ничего нового кроме контекстного меню не нужно.

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

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

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

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