Что нового

Процессы Быстрый поиск в памяти процесса.

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
98
Репутация
38
В общем ситуация такая, нужно быстро найти адрес строки в памяти процесса. Процесс - игра (МК11), нужно найти ключ авторизации STEAM. Занимаюсь разработкой анлокера контента для этой игры (Подробнее можно посмотреть тут).

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

Код скрипта:
Код:
#include <Array.au3>
#include <NomadMemory.au3>

Local $s_pname = 'Memory_String_Search'
Local $s_start = 0x0
Local $s_end =   0x7ffffffff


$n_pid = ProcessExists("MK11.exe")
If $n_pid < 1 Then Exit MsgBox(16, $s_pname, 'Process not found !')


$f_mopen = _MemoryOpen($n_pid)
If @error > 0 Then Exit MsgBox(16, $s_pname, 'Process could not be opened !')

ConsoleWrite('>Searching...' & @CRLF)

$step1 = "6661696C5F6F6E5F6D697373696E67033005737465616D310200"

For $i_search = $s_start To $s_end Step 0x500000

    $mem = _MemoryRead('0x' & Hex($i_search-(StringLen($step1)+3)), $f_mopen, 'byte[' & 0x500000+StringLen($step1)+5 & ']');
     ConsoleWrite(Hex($i_search) & @CRLF)
    If StringInStr($mem, $step1) Then

        ConsoleWrite('STEP 0 found at address : ' & Hex($i_search) & @CRLF)

        For $i_search = $i_search-(StringLen($step1)+3) To $s_end Step 0x10000

            $mem = _MemoryRead('0x' & Hex($i_search-(StringLen($step1)+3)), $f_mopen, 'byte[' & 0x100000+StringLen($step1)+5 & ']');
            ConsoleWrite(Hex($i_search)& @CRLF)
            If StringInStr($mem, $step1) Then

                ConsoleWrite('STEP 1 found at address : ' & Hex($i_search) & @CRLF)

                For $i_search = $i_search-(StringLen($step1)+3) To $s_end Step StringLen($step1)*10

                    $mem = _MemoryRead('0x' & Hex($i_search-(StringLen($step1)+3)), $f_mopen, 'byte[' & (StringLen($step1) +1)*12 & ']');
                    ConsoleWrite(Hex($i_search)& @CRLF)
                    If StringInStr($mem, $step1) Then

                        ConsoleWrite('STEP 2 found at address : ' & Hex($i_search) & @CRLF)

                        For $i_search = $i_search-(StringLen($step1)+3) To $s_end

                            $step2 = 'fail_on_missing'&BinaryToString('0x11')

                            $mem = _MemoryRead('0x' & Hex($i_search), $f_mopen, 'char[' & StringLen($step2) +1 & ']')

                            ConsoleWrite(Hex($i_search) &' = '& $mem & @CRLF) ;I've commented out the consolewrite because it keeps writing after exit

                            If $mem = $step2 Then
                                ConsoleWrite('STRING found at address : ' & Hex($i_search) & @CRLF)

                                ConsoleWrite(_MemoryRead('0x' & Hex($i_search), $f_mopen, 'char[' & StringLen($step2)+1 & ']')& @CRLF)

                                ConsoleWrite(_MemoryRead('0x' & Hex($i_search+27), $f_mopen, 'char[' & 512 & ']')& @CRLF)
                                Exit
                            EndIf
                        Next

                    EndIf
                Next
            EndIf
        Next

    EndIf
Next

MsgBox(16, $s_pname, 'String not found !')


Логика скрипта сейчас такова - читаю большой кусок памяти и ищу в ней нужную мне подстроку (в виде HEX, т.к. там есть NULL символы). Найдя подходящий кусок разбиваю его на куски по меньше и так до упора... Первый шаг самый долгий. Процесс поиска может занимать до получаса, в то время как специализированные программы (типо CE или ArtMoney) справляются за считанные секунды.

Хочется найти быстрое решение. Сам я в направлении работы с памятью и использования dll'ок autoit'ом не очень силён - по этому и решился спросить тут...
 
Последнее редактирование:
Верх