Перейти к содержанию

Train ME by Coder, для продвинутых геймхакеров


Coder

Рекомендуемые сообщения

ANT' timestamp='1346761775' post='11130']

После 1.0 смотрел только "c" и "d". Оба грузят проц на 100%, иногда терпимо, а иногда полный зависон.

С горе пополам, смог посмотреть "c" версию, и думаю, что у ZOCKIR самое правильное решение. Т.к. так уже решить "нельзя", то вот


[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
mov [ebp-04],0
mov ecx,[ebp-04]
mov edx,[TrainME_C.exe+3394]
jmp returnhere

"TrainME_C.exe"+1340:
jmp newmem
db 90 90 90 90
returnhere:

[DISABLE]
"TrainME_C.exe"+1340:
mov ecx,[ebp-04]
mov edx,[TrainME_C.exe+3394]

dealloc(newmem)

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

В "d" версии сначало нужно обходить защиту, но при такой нагрузке на проц - увольте.

Пусть кто-то другой попытает счастье, или ждите, когда я себе любимому сделаю подарок на НГ в виде более мощного компа. Хотя, думаю, что проблема в, извиняюсь, говнокоде =/

Проблема, извиняюсь в говно проце :D

Хотя это ещё не максимальные возможности нагрузки ЦП) Хотя, опять же 2 экземпляра программы, убивают мой проц (100% нагрузка), но комп не виснет)

Скоро будет версия 1.2 она для слабых ПК будет, и с обновлённым кодом (+ к безопасности)

Про взлом версий "b" и "c" приведу в пример случай с зарубежного форума (текст переведён мной на русский) - "Я использовал в BattleField 3 v1.5 хук для BattleField 3 v1.2, почему меня забанили? Он же должен был работать!", нет смысла ломать старые версии, когда новая уже есть)

Ссылка на комментарий
Поделиться на другие сайты

"c" я сломал еще до выхода "d"

Сейчас у меня Athlon ii x2 250 (я амд дрочер, а текущие FX серии откровенно слабые, жду Vishera, а если и там провал, то пересежу на феноме или уйду в стан врага). С зависоном я погорячился, просто были офигеннейщи лаги, что было проще ребутнуть комп, чем довести мышкой до крестика программы. Не самый мощный проц на данный момент, но думаю и у вас перегиб с защитой.

Ссылка на комментарий
Поделиться на другие сайты

ANT' timestamp='1346763532' post='11132']

"c" я сломал еще до выхода "d"

Сейчас у меня Athlon ii x2 250 (я амд дрочер, а текущие FX серии откровенно слабые, жду Vishera, а если и там провал, то пересежу на феноме или уйду в стан врага). С зависоном я погорячился, просто были офигеннейщи лаги, что было проще ребутнуть комп, чем довести мышкой до крестика программы. Не самый мощный проц на данный момент, но думаю и у вас перегиб с защитой.

Да там всё делается проще)

Мне лень было проводить какую либо оптимизацию. У меня AMD Phenom II x4 3.4Ghz, версия "c" даёт нагрузку на мой ЦП 25%, "b" - 50%.

Ссылка на комментарий
Поделиться на другие сайты

Адресс инструкции записи в значение - TrainME.exe+135C(можно занопить), проверка но целостность - TrainME.exe+1250(просто перепрыгиваем проверку)

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Адресс инструкции записи в значение - TrainME.exe+135C(можно занопить), проверка но целостность - TrainME.exe+1250(просто перепрыгиваем проверку)

Ну так давай, выложи людям скрипт)

Заодно я оценю.

Ссылка на комментарий
Поделиться на другие сайты

Что народ ТрейнМи взломан?

Попробуй Инструменты: IDA + (Hex-Rays)

Перед решением любого трейнми нужно помнить, что дизассемблерное представление сложней в восприятии чем если бы править исходники этого трейнми на С++ для решения поставленной задачи. Т.е. у автора Трейнми есть огромное преимущество - он видит всё в сжатом виде на синтаксисе с++ и видит общую картину защиты, а мы - решающую эту задачу, раз в 5,10 и более лишены прозрачности происходящих действий.

Используя IDA + (Hex-Rays)

1) Видно что какие-то два дополнительных потока создаются в основном потоке и что-то постоянно делают.

2) Кусок памяти считывающий сообщения из очереди сообщений я так понял был перемещён и чуть ли не продублирован несколько раз для запутывания.

Если исследовать код до запуска приложения, то видим код обработки сообщений из очереди (потом он будет удалён и продублирован)


LRESULT __stdcall sub_4012F0(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
int v4; // esi@6
__time64_t v5; // qax@6
int v6; // edi@6
int v7; // ebx@6
int v8; // ST1C_4@6
int v9; // eax@6
int v10; // edx@6
signed int v11; // ST0C_4@6
HWND v12; // eax@6
if ( Msg == 2 )
{
PostQuitMessage(0);
}
else
{
if ( Msg != 273 )
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}
if ( wParam == 1 )
{
v4 = dword_403394;
v5 = time64(0);
v6 = v5;
v7 = HIDWORD(v5);
v8 = rand() % 1000;
v9 = sub_401CE0(v6, v7, 1000000, 0);
v10 = dword_403394;
*(_DWORD *)v4 = v9 + v8; // (*1)
v11 = *(_DWORD *)v10;
flt_403018 = (double)*(signed int *)v10;
sub_4013D0("Health: %d", v11);
v12 = GetDlgItem(hWnd, 2);
SetWindowTextA(v12, String);
flt_403018 = (double)*(signed int *)dword_403394;
}
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}

Интуитивно можно предположить, что в выделенной памяти бегает "оригинальное" значение. Затем меняется. Затем значение поступает в переменную v11.

Итак ещё раз.

Меняется адрес значения -> меняется значение (место (*1))-> адрес значения поступает в sub_4013D0("Health: %d", v11)

Решения:

1) Ищем сигнатуры места (1*) и исправляем их

2) Делаем патч внутри exe файла и исправляем место (1*)

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

Ссылка на комментарий
Поделиться на другие сайты

Попробуй Инструменты: IDA + (Hex-Rays)

Перед решением любого трейнми нужно помнить, что дизассемблерное представление сложней в восприятии чем если бы править исходники этого трейнми на С++ для решения поставленной задачи. Т.е. у автора Трейнми есть огромное преимущество - он видит всё в сжатом виде на синтаксисе с++ и видит общую картину защиты, а мы - решающую эту задачу, раз в 5,10 и более лишены прозрачности происходящих действий.

Используя IDA + (Hex-Rays)

1) Видно что какие-то два дополнительных потока создаются в основном потоке и что-то постоянно делают.

2) Кусок памяти считывающий сообщения из очереди сообщений я так понял был перемещён и чуть ли не продублирован несколько раз для запутывания.

Если исследовать код до запуска приложения, то видим код обработки сообщений из очереди (потом он будет удалён и продублирован)


LRESULT __stdcall sub_4012F0(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
int v4; // esi@6
__time64_t v5; // qax@6
int v6; // edi@6
int v7; // ebx@6
int v8; // ST1C_4@6
int v9; // eax@6
int v10; // edx@6
signed int v11; // ST0C_4@6
HWND v12; // eax@6
if ( Msg == 2 )
{
PostQuitMessage(0);
}
else
{
if ( Msg != 273 )
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}
if ( wParam == 1 )
{
v4 = dword_403394;
v5 = time64(0);
v6 = v5;
v7 = HIDWORD(v5);
v8 = rand() % 1000;
v9 = sub_401CE0(v6, v7, 1000000, 0);
v10 = dword_403394;
*(_DWORD *)v4 = v9 + v8; // (*1)
v11 = *(_DWORD *)v10;
flt_403018 = (double)*(signed int *)v10;
sub_4013D0("Health: %d", v11);
v12 = GetDlgItem(hWnd, 2);
SetWindowTextA(v12, String);
flt_403018 = (double)*(signed int *)dword_403394;
}
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}

Интуитивно можно предположить, что в выделенной памяти бегает "оригинальное" значение. Затем меняется. Затем значение поступает в переменную v11.

Итак ещё раз.

Меняется адрес значения -> меняется значение (место (*1))-> адрес значения поступает в sub_4013D0("Health: %d", v11)

Решения:

1) Ищем сигнатуры места (1*) и исправляем их

2) Делаем патч внутри exe файла и исправляем место (1*)

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

Ээээ, Андрей!

Ты давай там, секреты производства не разглашай :D

Ссылка на комментарий
Поделиться на другие сайты

В трейнми укажи (В заголовке окна) какая версия пример 1.1

А то не понятно какая где, ну я про себя сохраняю на компе не угадаешь какая версия.

Ссылка на комментарий
Поделиться на другие сайты

В трейнми укажи (В заголовке окна) какая версия пример 1.1

А то не понятно какая где, ну я про себя сохраняю на компе не угадаешь какая версия.

В след. версиях сделаю.

Так что ломайте эту версию, хочу уже патч сделать :)

Ссылка на комментарий
Поделиться на другие сайты

Не знаю будет ли у тебя работать так как адрес взял не в TrainMe.exe+

Но у меня работает :)


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(ZMR)
registersymbol(ZMR)
aobscan(aob_ZMR,89 41 14 C1 E8 10 25 FF 7F 00 00 C3 8B FF 55)
newmem:
inc eax
//mov [ecx+14],eax
//shr eax,10
jmp returnhere
aob_ZMR:
ZMR:
jmp newmem
nop
returnhere:
[DISABLE]
ZMR:
unregistersymbol(ZMR)
mov [ecx+14],eax
shr eax,10
dealloc(newmem)

Ссылка на комментарий
Поделиться на другие сайты

Не знаю будет ли у тебя работать так как адрес взял не в TrainMe.exe+

Но у меня работает :)


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(ZMR)
registersymbol(ZMR)
aobscan(aob_ZMR,89 41 14 C1 E8 10 25 FF 7F 00 00 C3 8B FF 55)
newmem:
inc eax
//mov [ecx+14],eax
//shr eax,10
jmp returnhere
aob_ZMR:
ZMR:
jmp newmem
nop
returnhere:
[DISABLE]
ZMR:
unregistersymbol(ZMR)
mov [ecx+14],eax
shr eax,10
dealloc(newmem)

Чуть позже проверю.

Ссылка на комментарий
Поделиться на другие сайты

>> Не знаю будет ли у тебя работать так как адрес взял не в TrainMe.exe+

Это ж в MSVCR100 инлайнпатч в рандом функции. Иными словами инжектнул в рандом-функцию из системной либы.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 года спустя...

Для версии d

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
mov ecx, #5000
mov eax, 0
mov edx,[TrainME.exe+3394]
jmp returnhere

TrainME.exe+123D: // Защита от проверки целостности кода
// Код в этой памяти делил на 0, что вызывало крэш программы
// Теперь он не будет делить на ноль
nop
nop
nop
nop

TrainME.exe+1260: // Тоже защита, сразу после предыдущей следует
nop
nop
nop
nop

"TrainME.exe"+1350: // Инъекция для заморозки значения
jmp newmem
nop
nop
nop
nop
nop
nop
returnhere:

[DISABLE]
dealloc(newmem)

"TrainME.exe"+1350: // Восстанавливаем после инъекции
mov ecx,[ebp-04]
mov edx,[TrainME.exe+3394]
add ecx, eax

TrainME.exe+123D: // Восстанавливаем деление на 0
mov al, 0
div al

TrainME.exe+1260:
mov al, 0
div al

 

Хотя самое простое решение это убить 2 созданных потока (кроме главного) и патчить в главном потоке основной код сколько влезет.

В данном случае я просто убрал деление на 0, которое происходило когда код обнаруживался модифицированным.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.