-
Постов
815 -
Зарегистрирован
-
Посещение
-
Победитель дней
13
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Coder
-
-
где basepointer-указатель?
offsets-офсет смещения
? так или не так
или это так сложно или я такой тугодум
ааа ужасно как же это действует на мозг
Я думал ты в состоянии хоть что-то сам сделать.
basepointer - база указателя, offsets - массив смещений, level - кол-во смещений. Не знание англ. языка - карается смертью
-
я и хотел это сказать не правильно выразился...
я знаю что указатель "указывает на другой адрес" тобишь обычный jmp
а в чём моя проблема?
Нет никакого jmp. Причём тут исполняемый код приложения и обыкновенные адреса?
Советую вначале почитать об указателях, прежде чем говорить - http://ru.wikipedia....D0%B0_(C%2B%2B)
Писал раньше для себя такую функцию.
public int ReadPointer(int basepointer, Int32[] offsets, int level)
{
VAM = new VAMemory(process_name);
int pointer = basepointer;
for (int i = 0; i < level; i++)
{
pointer = VAM.ReadInteger((IntPtr)pointer) + offsets[i];
}
return pointer;
} -
я знаю что указатель это адрес в памяти и если я буду на него ссылаться то он должен "jmp" как бы на другой адрес + относительное смещение
минимальное знание о указатели и представление где работаю
а вы все таки "профи" ....сразу бы закопали ваша б воля
Ответ не верный.
Указатель - это обычный блок памяти в адресном пространстве, а содержит в себе он, не патроны или здоровье, а другой адрес.
То есть, вот наш указатель: 0x00F04096, и по этому адресу в памяти записана вот такая штука - 0x007A8000, т.е. указатель 0x00F04096 содержит в себе 0x007A8000.
Иными словами - он указывает на адрес - 0x007A8000, все адреса имеют тип целое 4 байта (DWORD/Int32).
-
у меня на месте "твой указатель" написано так "игра"+011D0EA0 + смещение 30
пробовал 2 сопсобами :
1 указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 0x30);
2. указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);
в обоих случаях адреса были разные и не совпадали с адресом из СЕ
в се был адрес 069D2438
1 раз программа выдала адрес -1119040308
2 раз 1209416877
может их нужно конвертировать? а в каком они виде
textBox1.Text = Convert.ToString(MyValue);
Convert.ToString
я так понимаю что скорее всего в этом загвоздка
http://forum.gamehac...%D0%B0-vc-2010/
можно и вот так же? но тут столько классов что я путаюсь и не понимаю что же мне конкретно нужно
По-хорошему надо бы хоть немного самому выучить C# и понять - что есть указатель.
-
Проблема связана, со спецификой WinXP, так как на Win7 данных проблем нет.
И всё же она вызвана отсутствием каких-либо необходимых привилегий, поэтому мы дадим нашему трейнеру привилегии отладчика (SE_DEBUG_NAME).
Предлагаю следующее решение этой проблемы.
Добавляем этот код в проект:
1) Функция получения каких-либо привилегий (данная функция взята с MSDN), можно вставить перед void Cheats.
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if ( !LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid ) ) // receives LUID of privilege
{
MessageBox(NULL, "!!!", "LookupPrivilegeValue failed!", MB_OK);
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if ( !AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL) )
{
MessageBox(NULL, "!!!", "AdjustTokenPrivileges failed!", MB_OK);
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
MessageBox(NULL, "!!!", "The token does not have the specified privilege!", MB_OK);
return FALSE;
}
return TRUE;
}2) В WinMain до строки ShowWindow(hWnd, CmdShow), вставить этот код:
HANDLE hToken = 0;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
MessageBox(NULL, "OpenProcessToken failed!", "!!!", MB_OK);
}
if (!SetPrivilege(hToken, SE_DEBUG_NAME, true))
{
MessageBox(NULL, "Can't execute SetPrivilege!", "!!!", MB_OK);
} -
Не знаю будет ли у тебя работать так как адрес взял не в 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)Чуть позже проверю.
-
В трейнми укажи (В заголовке окна) какая версия пример 1.1
А то не понятно какая где, ну я про себя сохраняю на компе не угадаешь какая версия.
В след. версиях сделаю.
Так что ломайте эту версию, хочу уже патч сделать
-
Попробуй Инструменты: 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 чем мне.
Ээээ, Андрей!
Ты давай там, секреты производства не разглашай
-
Что народ ТрейнМи взломан?
Пока я не получил подтверждения этого.
Как только оно будет, на свет выйдет v1.2
-
Андрей, какие ужасы ты говоришь Надо бы конструктор ракет найти и его вызывать)))
-
Andrey спасибо за подсказку (за ракет). :)
Coder ну что ж ломай игру если будет время?
Я на выходных попробую что там запрограммировал старейшина
Поверь нужно будет много времени) У меня учёба сейчас, в принципе может быть в следующим месяце.
-
Специально для чит-создателей - обычные ракеты теперь это "супер-античит ракеты".
"Счётчик ракет" (ну, тот который видим на экране рядом со значком ракет), теперь это счётчик количества ракет-обЪектов, а не кол-ва возможных выстрелов как раньше.
Иными словами больше 50 ракет теперь практически невозможно сделать через отладчик не узнав структуру игры, игрового движка и функции кода с ним работающих. Меняете счётчик или нет - без толку.
Главное мне ничего не стоило создать этот финт, кроме как продублировать ракеты в игровом движке пять раз по 10 и внести 5 строчек кода.
Зря ты это сказал
Хотя я тебе скажу, реверсить придётся упорно, чтобы добиться результатов (мне Руслан рассказывал о СТАЛКЕР'е).
Ну, а так игра классная, довольно-таки хорошая физика (спасибо Unity), но не помешало бы рассчитывать траекторию понижения снаряда (то бишь чтобы гравитация действовала на снаряды).
-
Спасибо вам понял.
В качестве первого ЯП, который компилируется я учил - C# (Microsoft в нём всё сделали очень простым для понимания).
-
Адресс инструкции записи в значение - TrainME.exe+135C(можно занопить), проверка но целостность - TrainME.exe+1250(просто перепрыгиваем проверку)
Ну так давай, выложи людям скрипт)
Заодно я оценю.
-
ANT' timestamp='1346763532' post='11132']
"c" я сломал еще до выхода "d"
Сейчас у меня Athlon ii x2 250 (я амд дрочер, а текущие FX серии откровенно слабые, жду Vishera, а если и там провал, то пересежу на феноме или уйду в стан врага). С зависоном я погорячился, просто были офигеннейщи лаги, что было проще ребутнуть комп, чем довести мышкой до крестика программы. Не самый мощный проц на данный момент, но думаю и у вас перегиб с защитой.
Да там всё делается проще)
Мне лень было проводить какую либо оптимизацию. У меня AMD Phenom II x4 3.4Ghz, версия "c" даёт нагрузку на мой ЦП 25%, "b" - 50%.
-
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" версии сначало нужно обходить защиту, но при такой нагрузке на проц - увольте.
Пусть кто-то другой попытает счастье, или ждите, когда я себе любимому сделаю подарок на НГ в виде более мощного компа. Хотя, думаю, что проблема в, извиняюсь, говнокоде =/
Проблема, извиняюсь в говно проце
Хотя это ещё не максимальные возможности нагрузки ЦП) Хотя, опять же 2 экземпляра программы, убивают мой проц (100% нагрузка), но комп не виснет)
Скоро будет версия 1.2 она для слабых ПК будет, и с обновлённым кодом (+ к безопасности)
Про взлом версий "b" и "c" приведу в пример случай с зарубежного форума (текст переведён мной на русский) - "Я использовал в BattleField 3 v1.5 хук для BattleField 3 v1.2, почему меня забанили? Он же должен был работать!", нет смысла ломать старые версии, когда новая уже есть)
-
ANT' timestamp='1346703402' post='11127']
А ничего, что "cmp word ptr [eax-02],0D" находится тоже не в "TrainMe by ZOCKIR.exe" ?)
Приношу свои извинения) Когда я это писал, я был немного пьян)
-
ANT' timestamp='1346701276' post='11125']
не совсем красиво, но вот так
[ENABLE]
"msvcrt.dll"+9F5E:
db 90 90 90
[DISABLE]
"msvcrt.dll"+9F5E:
mov [edi+ecx*4-04],eaxПатчить сторонние DLL-ки не выход)
-
v1.1d
Была маленькая неточность в коде [sTATUS: Fixed/Patched]
Какой еще вариант Coder?
Наверное мне придется делать скрипт с аобсканом , адреса инструкции меняется, после обновление
Жду новой версии скрипта...
- 1
-
1.1c
Скрипт на 100
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
mov ecx,#100
originalcode:
mov [esi],ecx
mov eax,[edx]
mov [ebp-04],eax
exit:
jmp returnhere
"TrainME.exe"+133B:
jmp newmem
nop
nop
returnhere:
[DISABLE]
"TrainME.exe"+133B:
mov [esi],ecx
mov eax,[edx]
mov [ebp-04],eax
dealloc(newmem)Пофиксил, спасибо за помощь, жду другого варианта взлома
-
Coder Я разве не так делал?
Сделай точно также в версии 1.1b)
-
ZOCKIR, специально для тебя:
Цель: заморозить и уметь изменять не экранное, а действительное значение.
-
Решил преуменьшить количество наглецов, патчащих ядро программы.
V 1.1b
Нагрузку ЦП немного снизил, на 50%
-
Окей ща скину скрипт.
Coder причем тут принцип дружище.
Вот скрипт, хотя еще куча решений.
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
mov [edx],#999
originalcode:
mov eax,[edx]
mov [ebp-04],eax
exit:
jmp returnhere
"TrainME.exe"+12FD:
jmp newmem
returnhere:
[DISABLE]
"TrainME.exe"+12FD:
mov eax,[edx]
mov [ebp-04],eax
dealloc(newmem)Решил патчить в наглую WndProc?
с# VaMemory
in Создание трейнеров в специальных студиях
Опубликовано
Второй параметр это массив. Так что надо int offsets[] = {0x30}; я думаю.
Остальные переменные создавать не надо, это можно сразу передать в функцию.