misha Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 Столкнулся с проблемой поиска значения не точного, а в диапазоне.Аобсканом не получилось. Нашел в мейн.луа функцию вроде подходящую, но не разберусь с ее параметрами.Вот вырезка из мейна:732memscan_firstScan(memscan, scanoption, vartype, roundingtype, input1, input2 ,startAddress ,stopAddress ,protectionflags ,alignmenttype ,"alignmentparam" ,isHexadecimalInput ,isNotABinaryString, isunicodescan, iscasesensitive);733 Does an initial scan.734 memscan: The MemScan object created with createMemScan735 scanOption: Defines what type of scan is done. Valid values for firstscan are:736737 soUnknownValue: Unknown initial value scan738 soExactValue: Exact Value scan739 soValueBetween: Value between scan740 soBiggerThan: Bigger than ... scan741 soSmallerThan: smaller than ... scan742743 vartype: Defines the variable type. Valid variable types are:744745 vtByte746 vtWord 2 bytes747 vtDword 4 bytes748 vtQword 8 bytes749 vtSingle float750 vtDouble751 vtString752 vtByteArray753 vtBinary754 vtAll755Кто-то ею уже пользовался? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 мая, 2012 Поделиться Опубликовано 25 мая, 2012 function FirstScanValueBetween(input1, input2)local memScan = createMemScan()memscan_firstScan(memScan,soValueBetween, vtDword, rtTruncated,input1, input2,'0', '0x7fffffffffffffff',"+W-C", fsmAligned ,"4" , false , true, false, false)return memScanendfunction NexScanValueBetween(memScan, input1, input2)memscan_nextScan(memScan, soValueBetween, rtTruncated,input1, input2,false, true, false, false, false, '')endfunction PrintRezultAddreses(memScan)fl=createFoundList(memScan)foundlist_initialize(fl)local count=foundlist_getCount(fl)if (count>0) thenlocal saddress=foundlist_getAddress(fl, 0) --get the first addressprint("Adding "..saddress.." to the list")--add to the addresslistlocal al=getAddressList()local mr=addresslist_createMemoryRecord(al)memoryrecord_setDescription(mr,"Result of automated scan")memoryrecord_setAddress(mr, saddress)--If you have ce 6.2 beta--memoryrecord_setType(mr, vtString)--memoryrecord_string_setSize(mr, 5)--But for now:memoryrecord_setType(mr, vtDword)elseprint("No addresses found")endobject_destroy(fl)endКак пользоваться:Шаг1. В игре например "1000"ВыполняемmemScan = FirstScanValueBetween('999', '1001')Шаг2. В игре например "1001", выполняем отсеиваниеNexScanValueBetween(memScan,'1000','1002')Шаг3. В игре например "1002", выполняем отсеиваниеNexScanValueBetween(memScan,'1001','1003')Шаг4. Выводим результат на консольPrintRezultAddreses(memScan)Шаг5. Если удовлетворены результатом, то уничтожаем уже ненужный объект сканированияobject_destroy(memScan)-----------------------------Здесь присутствуют проблемы:1. Нет цикличного поиска до тех пор, пока не будет найден один адрес. Нужно дорабатывать скрипт. AOBSCAN работает один раз и выдаёт первый результат. В случае использования сканирования memscan_firstScan скорее всего придётся использовать многократно отсеивание и это отсеивание нужно запускать в связи с какими-то событиями, например, от пользователя или по таймеру. Скорее всего последний вариант лучше. В обработчике событий тамера мы будем проверять сколько адресов нашлось.2. Знать в каким пределах число, если пределы постоянны, то проблема может быть только одна - будет находится множество адресов.3. Третья проблема, при каких действиях пользователя или других запускать этапы поиска и отсеивания.Короче говоря, много моментов нужно знать и знать конечную цель. Поиск интервалом это не конечная цель.Конечная цель может быть такой "Я хочу в игре такой-то сделать такой-то чит. Пытаюсь применить поиск диапазона для того чтобы найти адреса связанные с таким-то игровым параметром(и)" Ссылка на комментарий Поделиться на другие сайты Поделиться
misha Опубликовано 25 мая, 2012 Автор Поделиться Опубликовано 25 мая, 2012 Огромное спасибо за подробности! Ссылка на комментарий Поделиться на другие сайты Поделиться
misha Опубликовано 25 мая, 2012 Автор Поделиться Опубликовано 25 мая, 2012 А цель была такая: есть в игре к примеру 300 значений в дубле (например 0.54), все 300 различны после сотой части (диапазон 0.540000000000001::0.549999999999999),хочу в игре их все найти и сменить на 1 число. Пробую составлять скрипт, выдает No addresses found.function FirstScanValueBetween(input1, input2)local memScan = createMemScan()memscan_firstScan(memScan,soValueBetween, vtDword, rtTruncated,input1, input2,'0', '0x7fffffffffffffff',"+W-C", fsmAligned ,"4" , false , true, false, false)return memScanendfunction PrintRezultAddreses(memScan)fl=createFoundList(memScan)foundlist_initialize(fl)local count=foundlist_getCount(fl)if (count>0) thenlocal saddress=foundlist_getAddress(fl, 0) --get the first addressprint("Adding "..saddress.." to the list")--add to the addresslistlocal al=getAddressList()local mr=addresslist_createMemoryRecord(al)memoryrecord_setDescription(mr,"Result of automated scan")memoryrecord_setAddress(mr, saddress)--If you have ce 6.2 betamemoryrecord_setType(mr, vtString)memoryrecord_string_setSize(mr, 5)--But for now:--memoryrecord_setType(mr, vtDword)elseprint("No addresses found")endobject_destroy(fl)end-----------------function nachalo()hideAllCEWindows()showMessage("START?")memScan = FirstScanValueBetween('0.54', '0.55')PrintRezultAddreses(memScan) if (memScan~=nil) then count=stringlist_getCount(memScan) if (count>0) thenprint (count) for i = 0, (count-1), 1 do address =stringlist_getString(memScan,i) writeDouble(address, 50) end end object_destroy(memScan) results=nilendshowMessage("CHIT-OK")endfunction myattach(timer) if getProcessIDFromProcessName("game.exe") ~= nil then object_destroy(timer) openProcess("game.exe") nachalo()elseshowMessage("Client not found")closeCE() endendf=createForm(false) --create an invisible windowt=createTimer(f);timer_setInterval(t,100) --10 might have been too fast for xp...timer_onTimer(t,myattach) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 мая, 2012 Поделиться Опубликовано 25 мая, 2012 1) Не vtDword, а тогда уж vtDouble;2) Возможно не 0x7fffffffffffffff для 64-разрядной винды, а другое значение (см. в программе CE, главное окно);3) "+W-C" - атрибуты защиты (память на запись и НЕ память копирования для записи) могут быть другими;4) Действия подключения к процессу и работу с таймером надо перепроверить;5) Сканирование памяти сразу после подключения к процессу может не работать, возможно нужна задержка; Ссылка на комментарий Поделиться на другие сайты Поделиться
misha Опубликовано 25 мая, 2012 Автор Поделиться Опубликовано 25 мая, 2012 function FirstScanValueBetween(input1, input2)local memScan = createMemScan()memscan_firstScan(memScan,soValueBetween, vtDword, rtTruncated,input1, input2,'0', '0x7fffffffffffffff',"+W-C", fsmAligned ,"4" , false , true, false, false)return memScanendА эта функция точно правильно срабатывает? У меня на нее ошибку кидает постоянно.Error:[string "function FirstScanValueBetween(input1, inpu..."]:3: attempt to call global 'memScan_firstScan' (a nil value) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 мая, 2012 Поделиться Опубликовано 26 мая, 2012 Похоже функции memScan_firstScan не существует, т.к. версия Cheat Engine не 6.2. Код, который написан мной во втором посте у меня работает на Cheat Engine 6.2. Ссылка на комментарий Поделиться на другие сайты Поделиться
misha Опубликовано 26 мая, 2012 Автор Поделиться Опубликовано 26 мая, 2012 CE 6.2 beta 5+ у меня. Если не сложно. поделись своею сборкой СЕ. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 мая, 2012 Поделиться Опубликовано 27 мая, 2012 "своею сборкой СЕ" версии 6.2 я не пользуюсь, т.к. её у меня нет. Я пользуюсь CE 6.2 с официального сайта. Ссылка на комментарий Поделиться на другие сайты Поделиться
misha Опубликовано 28 мая, 2012 Автор Поделиться Опубликовано 28 мая, 2012 Да я не знал, что 6.2 официально вышла. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения