Что нового

Найти начальный адрес HP

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Как с найти начальный адрес HP не используя ArtMoney и т.д. а с помощью Автоита?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 594
Репутация
938
Теоретически - открыть память приложения и перебрать все адреса от первого до последнего, записывая в отдельный массив все подходящие значения. Если память мне не изменяет, минут 20 будет перебор идти, а таких переборов надо сделать штук 5.


Добавлено:
Сообщение автоматически объединено:

Причем 20 минут будет идти чисто перебор, а если при это сортировать значения, сохранять их, обрабатывать и тд и тп, состаришься раньше чем найдешь :smile:
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Всё это конечно печально...но как тогда ищет ArtMoney? Просто очень не хочется использовать сторонний софт :scratch:

Вот пример на PureBasic'e, может сможет чем нибудь помочь?
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
С горем пополам написал dll по примерам и получилась такая штука, если открыть блокнот и написать слово например Hello а потом прописать в скрипте титл окна и искомое слово, в данном случае Hello, то мы получаем адрес по которому это слово находится, если пригодится, значит не зря писал. :smile:

Пример:
Код:
Global $ScanDll = DllOpen(@ScriptDir & "\ScanMemory.dll")
Global $ScanValue = ScanMemory("Текстовый документ (2) - Блокнот", "Hello")

$hForm = GUICreate("ScanMemory", 220, 40)
$Input = GUIctrlCreateInput("Address: " & $ScanValue, 10, 10, 200, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch
WEnd

Func ScanMemory($Title, $SearchValue)
	If IsNumber($Title) Then $Title = String($Title)
	If IsNumber($SearchValue) Then $SearchValue = String($SearchValue)
	Local $Ret = DllCall($ScanDll, "int", "ScanValueMemory", "str", $Title, "str", $SearchValue)
	Return "0x" & Hex($Ret[0], 7)
EndFunc
 

lirikmel

Продвинутый
Сообщения
225
Репутация
84
Вот стянул с жука....самому тоже интересна эта тема...но пока не могу особо разобраться


Тема для новичков в программировании.
Вопрос, конечно, далеко не новый - каждый, кто пишет бота, хоть раз в жизни его искал. А потом заходил на форум zhyk.ru и оставлял сообщение - первыйна ) Можно, конечно, немного подождать, и взять BA на форуме (Это и есть первый способ нахождения BA), но бот в это время будет обиженно стоять и показывать в графе HP нули... Поэтому лучше сразу перейти ко второму способу. Вообще, поиск лучше встроить в бота - при загрузке сравнить GA из настроек со значением BA+1C из памяти клиента, если не совпадает - переход к процедуре поиска BA.
2.Ищем в клиенте последовательность значений 8B0DNNNN - это команда загрузки регистра mov ecx, dword ptr N. Используется клиентом для вычисления динамической адресации. Но так как в коде клиента может использоваться та же команда для загрузки не только BA, а других значений, делаем отсеивание по большему количеству одинакового значения - это и будет BA.
BA - BaseAddress - Базовый адрес
GA - GameRun - начало игровой структуры
Код:
Func FindBA()
    Local $BAArr[50][2], $i, $n, $BACnt = 0
    For $i = 0 To 49; Обнуление массива
        $BAArr[$i][0] = 0
        $BAArr[$i][1] = 0
    Next
    For $n = 0x00401000 To 0x00403000 Step 1; Диапазон поиска
        $Ram = _MemoryRead($n,$HendleDll, "ushort")
        If $Ram ==  0x0D8B Then; искать mov ecx, dword ptr BA
            $Ram = _MemoryRead($n+2,$HendleDll)
            For $i = 0 To 49
                If $BAArr[$i][0] == 0 Then
                    $BAArr[$i][0] = $Ram
                    $BAArr[$i][1] = 1
                    ExitLoop
                ElseIf $BAArr[$i][0] == $Ram Then
                    $BAArr[$i][1] += 1
                    ExitLoop
                EndIf
            Next
        EndIf
    Next
    For $i = 0 To 49
        If $BAArr[$i][1] > $BACnt Then
            $BaseAdress = $BAArr[$i][0]
            $BACnt = $BAArr[$i][1]
        EndIf
    Next
EndFunc


3. То же самое можно сделать, только последовательность 8B0DNNNN искать не в памяти запущенного клиента, а в файле elementclient.exe. Можно искать коды других команд, где используется BA, например 8B15, A1, 8B35, 8B2D, 8B1D, 8B3D, 8935, 892D.
4. Можно найти другим способом - увеличив количество байт искомой последовательности, например

Код:
$File=FileOpen("elementclient.exe",16)
$Data=FileRead($File,FileGetSize("elementclient.exe"))
FileClose($File)
$Search=StringRegExp($Data,"8B15(.{8})50518B4A2081C1.{8}E8.{8}",2)


,тогда не нужно будет отсеивать по количеству одинаково найденных значений. Но - этот кусок кода с обновлением может измениться, и программа не найдет ничего. Хотя пример выше работает начиная с версии 1.3.4 и заканчивая текущей.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Интересно всё очень, но мне не понятно, я ещё новичёк в работе с памятью, поэтому до меня сейчас туго доходит что за адреса....какие оффсеты... мне легче просто написать полноценную функцию которая делала бы всё, но опять же я не знаю как писать и что писать, для меня пока что это дебри...поэтому прошу хоть минимальной помощи по данной теме... :smile:
 
Верх