1

Тема: AHK: поиск в памяти через Unknown initial value

Здравствуйте!

Хотелось бы знать, как через Dll вызов ReadProcessMemory, либо же использование Classmemory, повторить тот же поиск, что есть в Cheat Engine, а именно "Unknown initial value"?
Есть у кого-то варианты как это можно сделать на основе программы notepad.exe?

2

Re: AHK: поиск в памяти через Unknown initial value

А чем примечателен этот поиск?

3 (изменено: Clannad5, 2022-09-21 14:49:36)

Re: AHK: поиск в памяти через Unknown initial value

YMP

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

Вы указываете Unknown initial value, далее он находит все значения в процессе игры.
Далее вы указываете тип поиска: "Значение изменилось", либо на "Значение не изменилось".
По вам стреляют, шкала здоровья уменьшается, вы указываете что значение изменилось. Таким образом мы отсеиваем значения, которые не изменялись.
Далее мы можем побегать по миру, побить врагов, пострелять, но при этом не теряя здоровья. Мы указываем "Значение не изменилось".
Отсеиваем врагов, их здоровье, свои координаты и так далее.
Такими повторными манипуляциями мы дойдём с 2 миллионов(образно) значений, до 10-100, из которых уже сможем выяснить, что относится к здоровью нашего персонажа.

Надеюсь вы поняли о чем я.
Иногда недостаточно указать поиск по Float, Double, String, либо в 4 байта, т.к неизвестно изначально это значение 100 или это текст написанный как 100.

Поэтому мне хотелось бы знать, как искать по подобному принципу.

4

Re: AHK: поиск в памяти через Unknown initial value

Clannad5 пишет:

Надеюсь вы поняли о чем я.

Помнится, я в ArtMoney что-то так искал. Видимо, память процесса, доступная для изменения, разбивается на все возможные размеры. Проверяются все типы. Ну и какая-то эвристика есть, наверно, сокращающая объём работы.

5

Re: AHK: поиск в памяти через Unknown initial value

YMP
В Cheat Engine такое выполнение UIV выполняется примерно за пару секунд на бюджетном пк.
Я не знаю Pascal, поэтому не могу понять алгоритм CE.

6

Re: AHK: поиск в памяти через Unknown initial value

Изучайте.
https://lonami.dev/blog/woce-1/

7

Re: AHK: поиск в памяти через Unknown initial value

Malcev
Сложно конечно будет понять Rust код, но говорится что там применяется WinAPI.

8

Re: AHK: поиск в памяти через Unknown initial value

Clannad5 пишет:

В Cheat Engine такое выполнение UIV выполняется примерно за пару секунд на бюджетном пк.

Я когда-то писал функцию поиска, правда известной последовательности байтов. Читал блок памяти в буфер. Для поиска в буфере использовал машинный код. Иначе, думаю, будет медленно. Карта памяти.

9

Re: AHK: поиск в памяти через Unknown initial value

YMP

А то что вы писали, подойдёт и для целочисленных значений?

То есть я могу писать не "Number := 0x44444444", а "Number := 102"?
Или 0x.. обязательно?

Я видел этот код, он написан на машинном?

10

Re: AHK: поиск в памяти через Unknown initial value

Clannad5
В примере и есть целочисленное значение. В Target ведь оно пишется как "uint", unsigned integer. В шестнадцатеричном виде просто видно, из каких байтов состоит число. А вообще можно и в десятичном.

Машинный код — это вот это:


        48894C240848895424104C894424184C894C2420555357564889E54883EC08488B
        7D288B4D308B5540488B5D48C745F800000000FFCA29D1783B488B7538ACF2AE75
        325189D1F3A60F94C04829D14801CF5984C0741B488D47FF482B45284803455848
        89034883C308FF45F8FF4D50740485C975C58B45F8488D65005E5F5B5DC3

        5553575689E583EC048B7D148B4D188B55208B5D24C745FC000000004A29D17833
        8B751CACF2AE752B5189D1F3A60F94C029D101CF5984C074168D47FF2B45140345
        2C890383C304FF45FCFF4D28740485C975CD8B45FC89EC5E5F5B5DC21C00

Первое для x64, второе для x86. Он извлекается из скомпилированной программы, т.е. это непосредственно инструкции процессора, представленные в виде шестнадцатеричной строки для удобства вставки в скрипт. При записи в память для выполнения они переводятся обратно в бинарный вид. А исходный код на GoAsm был такой:


search: FRAME pHaystack, cbHaystack, pNeedle, cbNeedle, pAddrs, cAddrs, pRegion
        USES rbx,rdi,rsi
        LOCALS cFound

	mov rdi,[pHaystack]
	mov ecx,[cbHaystack]	
	mov edx,[cbNeedle]
	mov rbx,[pAddrs]
	mov D[cFound],0
	dec edx
	sub ecx,edx
	js >.done
.first_byte
	mov rsi,[pNeedle]
	lodsb
	repne scasb
	jne >.done
			
	push ecx
	mov ecx,edx
	repe cmpsb
	sete al
	sub rcx,rdx
	add rdi,rcx
	pop ecx
	test al,al
	jz >
		lea rax,[rdi-1]
		sub rax,[pHaystack]
		add rax,[pRegion]
		mov [rbx],rax
		add rbx,P
		inc D[cFound]
		dec D[cAddrs]
		jz >.done
	:
	test ecx,ecx
	jnz .first_byte
.done
	mov eax,[cFound]
	ret

ENDF

11 (изменено: Clannad5, 2022-09-21 21:02:33)

Re: AHK: поиск в памяти через Unknown initial value

YMP
А если я хочу с плавающей запятой найти число, то как можно ваш пример подкорректировать или допустим строку?

А еще я где-то нашел подобный код:


; #classmemory.ahk ; This is incorrect.
#SingleInstance force
#Include classMemory.ahk ; classMemory.ahk must be placed in your 'lib' folder. Refer to the ahk manual

F2::
Loop
{
if (_ClassMemory.__Class != "_ClassMemory")
    msgbox class memory not correctly installed. Or the (global class) variable "_ClassMemory" has been overwritten


winwait, ahk_exe win32calc.exe      ; ** Note the capital 'N' in Notepad i.e. ahk_class Notepad vs ahk_class notepad
winget, pid, pid, ahk_exe win32calc.exe 
notepad := new _ClassMemory("ahk_pid " pid, "", hProcessCopy) ; *** Note the space in "ahk_pid " pid ***
; You can also just do this:
; notepad := new _ClassMemory("ahk_exe notepad.exe", "", hProcessCopy) 

if !isObject(notepad) 
{
    msgbox failed to open a handle
    if (hProcessCopy = 0)
        msgbox The program isn't running (not found) or you passed an incorrect program identifier parameter. 
    else if (hProcessCopy = "")
        msgbox OpenProcess failed. If the target process has admin rights, then the script also needs to be ran as admin. Consult A_LastError for more information.
}


text := "85695867"

pattern := notepad.stringToPattern(text, "UTF-16") ; My notepad stores this string as unicode, hence I have to specify 'UTF-16' (unicode) as the encoding

stringAddress := notepad.processPatternScan(,, pattern*) 
 
if stringAddress > 0  ; you had a typo in stringAddress 
{
    stringAddressHex := "0x" ConvertBase(10, 16, stringAddress) ; the returned address is in decimal, convert it to hex for readability (this IS OPTIONAL) 
    msgbox AHK found string at addess: %stringAddressHex%
	stringAddressHex := ""
	OutputBase := ""
	number :=
}



ConvertBase(InputBase, OutputBase, number)
{
    static u := A_IsUnicode ? "_wcstoui64" : "_strtoui64"
    static v := A_IsUnicode ? "_i64tow"    : "_i64toa"
    VarSetCapacity(s, 65, 0)
    value := DllCall("msvcrt.dll\" u, "Str", number, "UInt", 0, "UInt", InputBase, "CDECL Int64")
    DllCall("msvcrt.dll\" v, "Int64", value, "Str", s, "UInt", OutputBase, "CDECL")
    return s
}
}

Суть в чём..
Запускаем калькулятор, либо блокнот, в скрипте указывается имя процесса и любой текст(Переменная text).
Жмём F2 и проверка зацикливается. Как только Скрипт увидит, что мы написали нужный текст в программу, он сразу отобразит адрес.

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

12

Re: AHK: поиск в памяти через Unknown initial value

Clannad5 пишет:

А если я хочу с плавающей запятой найти число, то как можно ваш пример подкорректировать или допустим строку?

В моём примере ищется то, что записано в Target. Дробное число пишите туда либо как float, 4 байта, либо как double, 8 байтов. Можно и строку туда записать. В cbTarget указывается длина искомого в байтах. Т.е. функция ничего не знает о типах, ей нужен указатель на первый байт и количество байтов.

ConvertBase меняет базу для строкового отображения числа, видимо. 10 или 16.

13 (изменено: Вася_01, 2022-09-26 04:31:21)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Я когда-то писал функцию поиска, правда известной последовательности байтов.

Не подскажите, ваша функция может найти адрес нужной последовательности байт в памяти.

14

Re: AHK: поиск в памяти через Unknown initial value

Вася_01
Да, именно это она и делает. Количество адресов можно указать, на случай, если последовательность встречается много раз.

15

Re: AHK: поиск в памяти через Unknown initial value

YMP
Было бы классно, если бы вы на AHK еще и способ поиска неизвестного значения смогли придумать, уверен вам это под силам, но у вас явно своих забот полно .
Спасибо за ответ, видимо действительно придется вникать в Rust, чтобы понять статью и исходя из этого уже понимать, как это переносить на AHK.

16 (изменено: Вася_01, 2022-09-24 04:32:17)

Re: AHK: поиск в памяти через Unknown initial value

Понятно, не подскажите, как записать этот код:


setbatchlines -1
test := new _ClassMemory("ahk_exe test.exe", "", hProcessCopy)
if !IsObject(test)
{
if (hProcessCopy = "")
msgbox class memory not correctly installed. Or the (global class) variable "_ClassMemory" has been overwritten
msgbox A_LastError %A_LastError%
ExitApp
}

Pattern := [0x74, 0x15, 0x8B, 0x47, 0x08, 0x8D, 0x4F, 0x08]
 
address := test.modulePatternScan("mydll.dll", Pattern*)
 
msgbox % address 

17

Re: AHK: поиск в памяти через Unknown initial value

Clannad5 пишет:

Было бы классно, если бы вы на AHK еще и способ поиска неизвестного значения смогли придумать

Боюсь, что на АНК там будет только чтение блоков памяти из того процесса в этот. А поиск на АНК будет тормозным.

18 (изменено: YMP, 2022-09-22 15:08:40)

Re: AHK: поиск в памяти через Unknown initial value

Вася_01
Т.к. ищутся 8 байт, то можно их изобразить как 8-байтное число. Ну и диапазон для поиска нужно явно указывать. Опция "вся память, занятая процессом", к сожалению, отсутствует. Хорошо бы, конечно, функцию доработать до большего удобства.


SetBatchLines, -1

ProcessName := "test.exe"
Start := 0, End := 0x800000000000   ; Диапазон адресов.
cAddrs := 1                     ; Сколько адресов искать.
Number := 0x084F8D08478B1574    ; Искомое число.
cbTarget := 8                   ; Длина искомого в байтах.
VarSetCapacity(Target, cbTarget)
NumPut(Number, Target, 0, "uint64")

; Поиск. Функция вернёт массив адресов либо 0, если ничего не найдено.
Found := SearchProcess(ProcessName, Start, End, &Target, cbTarget, cAddrs)
Time := (A_TickCount - StartTime) / 1000
If (Found = 0) {
    MsgBox, Ничего не найдено
    ExitApp
}
Else {
    MsgBox, % "Найден адрес: 0x" Format("{1:X}", Found[1])
}

; ============================== Функция =======================================

SearchProcess(NameOrPID, StartAddr, EndAddr, pTarget, cbTarget = 4, cAddrs = 100)
{
    static Code := 0, MFunc, Len, Page := 0x1000, mbi, mbiSize
    static stateOffset, protOffset, regSizeOffset
    static Rights := 0x410  ; PROCESS_VM_READ | PROCESS_QUERY_INFORMATION
    static MEM_COMMIT := 0x1000, PAGE_READWRITE := 4, PAGE_READONLY := 2
    static PAGE_WRITECOPY := 0x08
    static BufSize := 0x100000  ; 1 MB. Размер буфера для чтения из процесса.
    If (Code != 0)  ; Если не первый вызов, то машинный код уже готов.
        GoTo Process
    If (A_PtrSize = 8) {    ; x64
        mbiSize := 48, stateOffset := 32, protOffset := 36, regSizeOffset := 24
        Code = 
        ( Join LTrim
        48894C240848895424104C894424184C894C2420555357564889E54883EC08488B
        7D288B4D308B5540488B5D48C745F800000000FFCA29D1783B488B7538ACF2AE75
        325189D1F3A60F94C04829D14801CF5984C0741B488D47FF482B45284803455848
        89034883C308FF45F8FF4D50740485C975C58B45F8488D65005E5F5B5DC3
        )
    }
    Else {      ; x86
        mbiSize := 28, stateOffset := 16, protOffset := 20, regSizeOffset := 12
        Code = 
        ( Join LTrim
        5553575689E583EC048B7D148B4D188B55208B5D24C745FC000000004A29D17833
        8B751CACF2AE752B5189D1F3A60F94C029D101CF5984C074168D47FF2B45140345
        2C890383C304FF45FCFF4D28740485C975CD8B45FC89EC5E5F5B5DC21C00
        )
    }
    Len := StrLen(Code) // 2
    ; Память под машинный код.
    MFunc := DllCall("VirtualAlloc", "ptr", 0, "ptr", Len
                                   , "uint", 0x3000, "uint", 0x40, "ptr")
    Loop, % Len
        NumPut("0x" . SubStr(Code, A_Index * 2 - 1, 2), MFunc + 0
                                     , A_Index - 1, "uchar")
    VarSetCapacity(mbi, mbiSize) ; Структура MEMORY_BASIC_INFORMATION
Process:
    Process, Exist, %NameOrPID%
    If !(PID := ErrorLevel) {
        MsgBox, Процесс не найден
        Return 0
    }
    hProcess := DllCall("OpenProcess", "uint", Rights, "int", False, "uint", PID, "ptr")
    If(!hProcess) {
        MsgBox, Не удалось открыть процесс.
        Return 0                           
    }
    VarSetCapacity(AddrBuf, A_PtrSize * cAddrs, 0) ; Буфер для найденных адресов.
    VarSetCapacity(Buf, BufSize) ; Буфер для считанной из процесса памяти.
    CurAddr := (StartAddr // Page) * Page ; Текущий адрес. Округлить до начала страницы.
    pAddrBuf := &AddrBuf ; Указатель на свободное место в буфере адресов.
    FoundAll := 0 ; Всего найдено.

    While(CurAddr < EndAddr) {
        BytesRet := DllCall("VirtualQueryEx", "ptr", hProcess, "ptr", CurAddr
                                            , "ptr", &mbi, "uint", mbiSize, "ptr")
        If (BytesRet = 0) {
            Break
        }
        RegionSize := NumGet(mbi, regSizeOffset, "uptr")
        ; Если память не выделена (адреса свободны или только зарезервированы),
        ; пропускаем весь этот регион.
        If (NumGet(mbi, stateOffset, "uint") != MEM_COMMIT) {
            CurAddr += RegionSize
            If (A_PtrSize = 4 && CurAddr > 0xFFFFFFFF)
                GoTo Done
            Continue
        }
        Protect := NumGet(mbi, protOffset, "uint")
        ; Проверять только память для записи и чтения (данные).
        If !(Protect = PAGE_READWRITE || Protect = PAGE_WRITECOPY
                                      || Protect = PAGE_READONLY) {
            CurAddr += RegionSize
            If (A_PtrSize = 4 && CurAddr > 0xFFFFFFFF)
                GoTo Done
            Continue
        }
        While(RegionSize) { ; Считывание в буфер и поиск в нём.
            ReadSize := BufSize < RegionSize ? BufSize : RegionSize
            RegionSize -= ReadSize
            Ret := DllCall("ReadProcessMemory", "ptr", hProcess, "ptr", CurAddr
                                              , "ptr", &Buf, "ptr", ReadSize
                                              , "ptr *", BytesRead, "int")
            If (!Ret) { ; Если ошибка чтения, идём дальше.
                CurAddr += ReadSize
                Continue
            }
            ; Вызов машинной функции для поиска.
            Found := DllCall(MFunc, "ptr", &Buf, "ptr", BytesRead
                                  , "ptr", pTarget, "uint", cbTarget
                                  , "ptr", pAddrBuf, "uint", cAddrs - FoundAll
                                  , "ptr", CurAddr, "uint")
            CurAddr += ReadSize
            If (Found = 0) {
                Continue
            }
            If ((FoundAll += Found) < cAddrs) {
                pAddrBuf += Found * A_PtrSize
                Continue
            }
            Goto Done
        }
    }
Done:
    DllCall("CloseHandle", "ptr", hProcess)
    If (FoundAll = 0)
        Return 0
    Array := []
    Loop, %FoundAll%
        Array.Insert(NumGet(&AddrBuf+(A_PtrSize * (A_Index - 1)), 0, "uptr"))
    Return Array    
}

19 (изменено: Вася_01, 2022-09-24 04:30:44)

Re: AHK: поиск в памяти через Unknown initial value

YMP
Не находит. Так находит:


pattern := test.hexStringToPattern("74 15 8B 47 08 8D 4F 08")
address := test.processPatternScan(,, pattern*)
msgbox % address

20 (изменено: Вася_01, 2022-09-24 04:32:45)

Re: AHK: поиск в памяти через Unknown initial value

YMP
Нашел, заменил uint64, на char. Еще вопрос, если в последовательности байт есть "??",
0x83, 0xF8, "??", 0x8B, 0x45, 0x08, 0x0F, то как можно записать запись?

21

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Нашел, заменил uint64, на char.

Тогда char и нашёлся, то бишь один байт.

Вася_01 пишет:

Еще вопрос, если в последовательности байт есть "??",
0x83, 0xF8, "??", 0x8B, 0x45, 0x08, 0x0F, то как можно записать запись?

Для моей функции никак, там нет такой возможности.

22 (изменено: Clannad5, 2022-09-22 09:18:07)

Re: AHK: поиск в памяти через Unknown initial value

Вася_01
Вроде класс ClassMemory позволяет такое, я читал в исходном коде.

23 (изменено: Вася_01, 2022-09-25 03:48:46)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Тогда char и нашёлся, то бишь один байт.

Ну uint64 вообще ничего не находило. Еще можно StrPut вроде точнее находит адрес.

YMP пишет:

Для моей функции никак, там нет такой возможности.

Ну смотрите, знак "??" - это 1 пропущенный байт, типо . в regex. Разве нельзя что-нибудь придумать (поправить), чтобы такие адреса тоже находились?

Clannad5 пишет:

Вроде класс ClassMemory позволяет такое

Это понятно, функция от YMP делает тоже самое, только без использования класса.

24

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Ну uint64 вообще ничего не находило.

Вы, наверно, диапазон адресов не расширили, оставили как есть, а он там был для 32 бит. Сейчас я поправил код выше, попробуйте, найдёт ли теперь.

Вася_01 пишет:

Ну смотрите, знак "??" - это 1 пропущенный байт, типо . в regex. Разве нельзя что-нибудь придумать (поправить), чтобы такие адреса тоже находились?

Придумать можно, конечно.

25 (изменено: Вася_01, 2022-09-22 18:04:47)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

поправил код выше,

Проверил не находит адрес.

YMP пишет:

а он там был для 32 бит

Так у меня 32 битное приложение. У меня работает, только если указать char, uchar или StrPut.

YMP пишет:

Вы, наверно, диапазон адресов не расширили

Диапазон указал посмотрев в чит энджин для загружаемой dll, пробовал разные диапазоны.

YMP пишет:

Придумать можно, конечно.

Хотелось бы, могу скинуть исходник С++ можете посмотреть?

26

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Проверил не находит адрес.

Я тоже проверил, у меня находит. Возможно, у вас эта последовательность попадает на границу между мегабайтами и ею разрезается, а функция у меня ищет в мегабайтном буфере. Об этом я тогда как-то не подумал. На каком именно адресе она у вас находится?

Размер буфера можно изменить в функции. Больше поставить.


static BufSize := 0x100000  ; 1 MB. Размер буфера для чтения из процесса.
Вася_01 пишет:

Хотелось бы, могу скинуть исходник С++ можете посмотреть?

Исходник чего?

27 (изменено: Вася_01, 2022-09-26 04:32:28)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

На каком именно адресе она у вас находится?

Знал бы, а каком адресе вы говорите. Вот так находит адрес 0x5246719B в диапазоне: Start := 0x0000000051600000, End := 0x0000000056ac7000 - больше никак.

YMP пишет:

Исходник чего?

На самом деле, все более-менее работает через StrPut. Я просто хотел добавить возможность искать неизвестные (пропущенные байты). Может, пример какой-нибудь нужен на других языках?

28

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

могу скинуть исходник С++

Если у вас есть исходник на c++, то скомпилируйте его и используйте в скрипте.
Зачем вам ассемблер?

29 (изменено: Вася_01, 2022-09-22 23:54:47)

Re: AHK: поиск в памяти через Unknown initial value

Malcev пишет:

то скомпилируйте его и используйте в скрипте.

Не, я хочу через автохоткей без машинного кода.

Malcev пишет:

Зачем вам ассемблер?

нужен скрипт на автохоткей только.

30

Re: AHK: поиск в памяти через Unknown initial value

Если вы хотите без машинного кода, то тогда почему используете скрипт от YMP?

31 (изменено: Вася_01, 2022-09-23 00:20:29)

Re: AHK: поиск в памяти через Unknown initial value

А будет ли работать? Может новую функцию компилировать не надо.

32

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

А будет ли работать?

Это зависит от правильности фунции и ее использования.

Вася_01 пишет:

Может новую функцию компилировать не надо.

Надо.

33 (изменено: Вася_01, 2022-09-25 03:53:03)

Re: AHK: поиск в памяти через Unknown initial value

А можно как-нибудь проще сделать? Последовательность байт с ?? можно искать даже через regex.

34

Re: AHK: поиск в памяти через Unknown initial value

Конечно можно, но будет медленно.

35

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Знал бы, а каком адресе вы говорите.

Который находит CheatEngine. Он ведь правильно находит? Я хотел посмотреть, лежат ли ваши байты на границе двух мегабайтов.

Вася_01 пишет:

Вот так находит адрес 0x5246719B

Как "так"? Это вы чем нашли?

Вася_01 пишет:

все более-менее работает через StrPut

А что у вас делает StrPut? Если вы пишете куда-то эти байты как строку, то в памяти будут не они, а коды символов, и найдётся совсем не то.

Вася_01 пишет:

Не, я хочу через автохоткей без машинного кода.

Попробуйте. На мой взгляд, это безнадёжное предприятие, но всегда лучше убедиться самому. А то, может, мы вас тут обманываем или сами не в теме.

36 (изменено: Вася_01, 2022-09-24 04:39:11)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Он ведь правильно находит

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

YMP пишет:

Как "так"? Это вы чем нашли?

И вашим скриптом и с помощью classMemory. Результаты более-менее похожи ваш скрипт: 0x5246719B classMemory: 0x51152D8F. Немного отличаются адреса, но думаю, адреса рабочие.

YMP пишет:

А что у вас делает StrPut

У меня StrGet выдает ошибку, StrPut находит точнее адрес, чем numput у меня, не знаю, почему. Так я не пишу адрес, а просто получаю данные, как строку, видимо.

YMP пишет:

Попробуйте, на мой взгляд

У меня есть скрипты на lua, python, где ищет без машинного кода, вроде тоже быстро. Т.е. для вашей функции нужен именно машинный?

Malcev пишет:

Конечно можно, но будет медленно.

Да, машинный код, конечно, быстрее будет, наверное.

37

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Т.е. для вашей функции нужен именно машинный код без него никак?

Никак.

38 (изменено: Вася_01, 2022-09-24 04:39:36)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Никак

А можете "скинуть" исходник на С++ который компилируется в вашем скрипте.

39

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

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

А можете скинуть на Python?Хочется изучить.

40

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

А можете "скинуть" исходник на С++ который компилируется в вашем скрипте

Исходник выше в 10-м посте. Только он на GoAsm.

41 (изменено: Вася_01, 2022-09-25 00:05:41)

Re: AHK: поиск в памяти через Unknown initial value

На python криво находит адрес.

42

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

исходник на С++ который компилируется в вашем скрипте

В скрипте он не компилируется, а вставляется уже скомпилированным.

Вася_01 пишет:

Почему, кроме regex у меня есть вариант на lua, python для поиска таких патернов без машинного кода, работает быстро для моей программы, для любой - не знаю.

Если вас устраивает скорость без машинного кода, то почему вы не используете класс classMemory?

43

Re: AHK: поиск в памяти через Unknown initial value

Clannad5 пишет:

А можете скинуть на Python?Хочется изучить.

Например на c#:
https://stackoverflow.com/questions/781 … 52#7541052

44 (изменено: Вася_01, 2022-09-23 17:56:14)

Re: AHK: поиск в памяти через Unknown initial value

Malcev пишет:

а вставляется уже скомпилированным.

Это я понял.

Malcev пишет:

то почему вы не используете класс classMemory

Использую, хочу без класса находить адрес, не хочу пока лезть в ассемблер.

45

Re: AHK: поиск в памяти через Unknown initial value

Ну вы можете вытащить из класса функции и использовать их.
А в ассемблер лезть необязательно, вы можете написать/найти нужный код на c++ и скомпилировать его с помощью MCode.
https://www.autohotkey.com/boards/viewtopic.php?t=32
Как я сделал тут:
http://forum.script-coding.com/viewtopic.php?id=16706

46 (изменено: Вася_01, 2022-09-24 04:40:43)

Re: AHK: поиск в памяти через Unknown initial value

Malcev пишет:

вы можете вытащить из класса функции

Пытался, там все запутанно, кроме поиска неизвестных байт, там еще есть 'xx??x' patternMask называется вроде, но как это все соединить в одну функцию, я не понял, чтобы работало.

Malcev пишет:

вы можете написать/найти нужный код на c++

Так вот прям чистый правильный исходник на С++ я не нашел, тем более, код поиска на ассемблере.

47

Re: AHK: поиск в памяти через Unknown initial value

Ну тогда забейте.
Не понимаю чем вам класс не угодил.
Я для одного проекта его очень давно использую и ни разу не приходила в голову мысль вытаскивать оттуда отдельные функции.

48 (изменено: Вася_01, 2022-09-26 03:14:09)

Re: AHK: поиск в памяти через Unknown initial value

Malcev пишет:

Я для одного проекта его очень давно использую

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

49 (изменено: Вася_01, 2022-09-24 05:00:48)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Я тоже проверил, у меня находит

Кажется понял, что вы имеете в виду, т.е нужно преобразовать шестнадцатиричное число из 0x084F8D08478B1574 в десятичную систему 0x598852342163117400?

50

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

в десятичную систему 0x598852342163117400

Это не десятичная система.

51 (изменено: Вася_01, 2022-09-24 16:58:44)

Re: AHK: поиск в памяти через Unknown initial value

Я понял, но этот вариант работает, сам уже не знаю, какая эта за система.

52

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

т.е нужно преобразовать шестнадцатиричное число

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

То, что в числе байты идут в обратном порядке к вашей последовательности — это потому, что так хранятся числа в памяти — начиная с младшего байта. Поэтому, например, число 0x11223344, записанное в память, даст там последовательность байтов 44 33 22 11.

53 (изменено: Вася_01, 2022-09-25 04:01:45)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Нет, ничего не надо преобразовывать

А почему тогда байты называются числом, а не bytearray, например.

YMP пишет:

Поэтому, например, число 0x11223344

А почему числа идут с 0x.

54

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

А почему тогда байты у вас называются числом, а не bytearray, например.

А какая разница как их называть? Число — это ведь тоже массив байтов.

Вася_01 пишет:

А почему числа идут с 0x.

Чтобы было видно, что они шестнадцатеричные.

55 (изменено: Вася_01, 2022-09-25 23:48:54)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Число — это ведь тоже массив байтов.

понятно.
А что нужно сделать, чтобы правильно находило адрес. Кодом С++ находит 1374979004 вашим 1386279672. Все перепробовал - не совпадают.

YMP пишет:

Чтобы было видно, что они шестнадцатеричные.

А где они шестнадцатиричные, в десятичной тоже находит адрес с 0x.

56

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

На python криво находит адрес. Могу на lua скинуть.

Давай.

57 (изменено: Вася_01, 2022-09-25 00:14:01)

Re: AHK: поиск в памяти через Unknown initial value

Зачем. Там для одной программы. Тут общиие примеры.

58

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

А где они шестнадцатиричные, в dec тоже находит адрес с 0x.

Если начинается с 0x, то шестнадцатеричное.

Вася_01 пишет:

А что нужно сделать, чтобы правильно находило адрес.

Я уже писал выше: попробуйте в моём коде размер буфера увеличить. Там он комментарием подписан.

59 (изменено: Вася_01, 2022-09-26 03:17:52)

Re: AHK: поиск в памяти через Unknown initial value

YMP пишет:

Если начинается с 0x, то шестнадцатеричное.

Я к тому, что:

YMP пишет:

А вообще можно и в десятичном

Вот я и записал в десятичном виде число, а зачем там 0x - это для шестнадцатиричного числа. Десятичное число без 0x адрес не находит.
Еще разобрался, почему машинный код быстрее работает. Осталось разобраться, почему адреса не совпадают.

60

Re: AHK: поиск в памяти через Unknown initial value

Вася_01 пишет:

Осталось разобраться, почему адреса не совпадают.

Потому что с 0х получается шестнадцатеричное число, просто другое, поэтому и адрес у него другой. Элементарно, Ватсон.

61 (изменено: Вася_01, 2022-09-27 06:00:26)

Re: AHK: поиск в памяти через Unknown initial value

YMP, пошли баги. Функция просто возвращает какой-то случайный адрес по указанному диапазону в моем случае, причем не важно, что указывать в Number, хоть и вообще удалить. Попросту говоря, не работает. В общем, не "идет" функция, доработка, наверное, какая-то нужна имхо.

62

Re: AHK: поиск в памяти через Unknown initial value

Вася_01
Функция ищет то, что находится в Target. То, что вы туда записали, либо то, что там случайно оказалось при создании этой переменной. Что-нибудь там всё равно будет, вот оно и ищется. Так что всё логично.