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

Поиск Значения Value Between В Скрипте Се


misha

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

Столкнулся с проблемой поиска значения не точного, а в диапазоне.

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

Вот вырезка из мейна:


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 createMemScan
735 scanOption: Defines what type of scan is done. Valid values for firstscan are:
736
737 soUnknownValue: Unknown initial value scan
738 soExactValue: Exact Value scan
739 soValueBetween: Value between scan
740 soBiggerThan: Bigger than ... scan
741 soSmallerThan: smaller than ... scan
742
743 vartype: Defines the variable type. Valid variable types are:
744
745 vtByte
746 vtWord 2 bytes
747 vtDword 4 bytes
748 vtQword 8 bytes
749 vtSingle float
750 vtDouble
751 vtString
752 vtByteArray
753 vtBinary
754 vtAll
755

Кто-то ею уже пользовался?

Ссылка на комментарий
Поделиться на другие сайты


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 memScan
end

function NexScanValueBetween(memScan, input1, input2)
memscan_nextScan(memScan, soValueBetween, rtTruncated,
input1, input2,
false, true, false, false, false, '')
end

function PrintRezultAddreses(memScan)
fl=createFoundList(memScan)
foundlist_initialize(fl)
local count=foundlist_getCount(fl)
if (count>0) then
local saddress=foundlist_getAddress(fl, 0) --get the first address
print("Adding "..saddress.." to the list")
--add to the addresslist
local 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)
else
print("No addresses found")
end
object_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. Третья проблема, при каких действиях пользователя или других запускать этапы поиска и отсеивания.

Короче говоря, много моментов нужно знать и знать конечную цель. Поиск интервалом это не конечная цель.

Конечная цель может быть такой "Я хочу в игре такой-то сделать такой-то чит. Пытаюсь применить поиск диапазона для того чтобы найти адреса связанные с таким-то игровым параметром(и)"

Ссылка на комментарий
Поделиться на другие сайты

А цель была такая: есть в игре к примеру 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 memScan
end
function PrintRezultAddreses(memScan)
fl=createFoundList(memScan)
foundlist_initialize(fl)
local count=foundlist_getCount(fl)
if (count>0) then
local saddress=foundlist_getAddress(fl, 0) --get the first address
print("Adding "..saddress.." to the list")
--add to the addresslist
local 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)
else
print("No addresses found")
end
object_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) then
print (count)
for i = 0, (count-1), 1 do
address =stringlist_getString(memScan,i)
writeDouble(address, 50)
end
end
object_destroy(memScan)
results=nil
end
showMessage("CHIT-OK")
end
function myattach(timer)
if getProcessIDFromProcessName("game.exe") ~= nil then
object_destroy(timer)
openProcess("game.exe")
nachalo()
else
showMessage("Client not found")
closeCE()
end
end
f=createForm(false) --create an invisible window
t=createTimer(f);
timer_setInterval(t,100) --10 might have been too fast for xp...
timer_onTimer(t,myattach)

Ссылка на комментарий
Поделиться на другие сайты

1) Не vtDword, а тогда уж vtDouble;

2) Возможно не 0x7fffffffffffffff для 64-разрядной винды, а другое значение (см. в программе CE, главное окно);

3) "+W-C" - атрибуты защиты (память на запись и НЕ память копирования для записи) могут быть другими;

4) Действия подключения к процессу и работу с таймером надо перепроверить;

5) Сканирование памяти сразу после подключения к процессу может не работать, возможно нужна задержка;

Ссылка на комментарий
Поделиться на другие сайты


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 memScan
end

А эта функция точно правильно срабатывает? У меня на нее ошибку кидает постоянно.

Error:[string "function FirstScanValueBetween(input1, inpu..."]:3: attempt to call global 'memScan_firstScan' (a nil value)

Ссылка на комментарий
Поделиться на другие сайты

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

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

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