sumikot
26.10.2011, 13:51
Тема для новичков в программировании.
Вопрос, конечно, далеко не новый - каждый, кто пишет бота, хоть раз в жизни его искал. А потом заходил на форум zhyk.ru и оставлял сообщение - первыйна ) Можно, конечно, немного подождать, и взять BA на форуме (Это и есть первый способ нахождения BA), но бот в это время будет обиженно стоять и показывать в графе HP нули... Поэтому лучше сразу перейти ко второму способу. Вообще, поиск лучше встроить в бота - при загрузке сравнить GA из настроек со значением BA+1C из памяти клиента, если не совпадает - переход к процедуре поиска BA.
2.Ищем в клиенте последовательность значений 8B0DNNNN - это команда загрузки регистра mov ecx, dword ptr N. Используется клиентом для вычисления динамической адресации. Но так как в коде клиента может использоваться та же команда для загрузки не только BA, а других значений, делаем отсеивание по большему количеству одинакового значения - это и будет BA.
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 и заканчивая текущей.
На спасибо не настаиваю :) но и не откажусь
Вопрос, конечно, далеко не новый - каждый, кто пишет бота, хоть раз в жизни его искал. А потом заходил на форум zhyk.ru и оставлял сообщение - первыйна ) Можно, конечно, немного подождать, и взять BA на форуме (Это и есть первый способ нахождения BA), но бот в это время будет обиженно стоять и показывать в графе HP нули... Поэтому лучше сразу перейти ко второму способу. Вообще, поиск лучше встроить в бота - при загрузке сравнить GA из настроек со значением BA+1C из памяти клиента, если не совпадает - переход к процедуре поиска BA.
2.Ищем в клиенте последовательность значений 8B0DNNNN - это команда загрузки регистра mov ecx, dword ptr N. Используется клиентом для вычисления динамической адресации. Но так как в коде клиента может использоваться та же команда для загрузки не только BA, а других значений, делаем отсеивание по большему количеству одинакового значения - это и будет BA.
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 и заканчивая текущей.
На спасибо не настаиваю :) но и не откажусь