HukpoFuJl
AццkuЙ HukpoFuJl
- Сообщения
- 98
- Репутация
- 38
В общем ситуация такая, нужно быстро найти адрес строки в памяти процесса. Процесс - игра (МК11), нужно найти ключ авторизации STEAM. Занимаюсь разработкой анлокера контента для этой игры (Подробнее можно посмотреть тут).
Скрипт поиска я сделал, но работает он критически медленно. Основная проблема в том, что игра занимает в памяти около 2х гигабайт.
Код скрипта:
Логика скрипта сейчас такова - читаю большой кусок памяти и ищу в ней нужную мне подстроку (в виде HEX, т.к. там есть NULL символы). Найдя подходящий кусок разбиваю его на куски по меньше и так до упора... Первый шаг самый долгий. Процесс поиска может занимать до получаса, в то время как специализированные программы (типо CE или ArtMoney) справляются за считанные секунды.
Хочется найти быстрое решение. Сам я в направлении работы с памятью и использования dll'ок autoit'ом не очень силён - по этому и решился спросить тут...
Скрипт поиска я сделал, но работает он критически медленно. Основная проблема в том, что игра занимает в памяти около 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'ом не очень силён - по этому и решился спросить тут...
Последнее редактирование: