User123
-
Постов
33 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные User123
-
-
В очередной раз насмотревшись видеоуроков кодера,я решил добавить gui в трейнер,но не тут то было,при запуске открываются и консоль,и окно
Создал новый проект;
#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib,"gdiplus.lib")
LONG CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE prevhInstance,LPSTR lpCmdLine,int CmdShow){
HWND hWnd;
MSG msg;
WNDCLASS w;
memset(&w,0,sizeof(w));
w.style = 0;
w.lpfnWndProc = WndProc;
w.lpszClassName = "Windows form";
w.hInstance = hInstance;
RegisterClass(&w);
hWnd = CreateWindow(w.lpszClassName,"PlantsVsZombies Trainer",
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,420,320,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,CmdShow);
while(GetMessage(&msg,NULL,NULL,NULL)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LONG CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}Я так понимаю,это связано со средой разработки
IDE eclipse
Создаю empty project
Компилятор MinGW
-
Он записывает побайтово адрес куда прыгать в перевернутом виде (так нужно делать, так как инструкция jmp принимает относительные адреса и в перевернутом виде).
Это можно записать более красиво кстати (тогда циклы типа for(int i = 0;i<4;i++) ), будут вообще не нужны, т.к. в результате выполнения этих операций мы уже получим результат в "перевёрнутом" виде.
DWORD jmp_newmem = 0 - (newmem - address) - 5;DWORD jmp_address = 0 - (address - newmem) - sizeof(injection);
О том, как рассчитываются прыжки в x86 асме ты можешь почитать тут:
http://stackoverflow.com/questions/7609549/calculating-jmp-instructions-address
http://stackoverflow.com/questions/8196835/calculate-the-jmp-opcodes
Ну и еще можешь погуглить.
Спасибо!
-
Спасибо кодеру за это видео,вроде все работает
Только я не понимаю как
#include "Memory.h"
#include <cstdio>
using namespace std;
int main(){
BYTE jump[] {
"\xE8\x00\x00\x00\x00\x90" //jmp newmem
};
BYTE original[] = {
"\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
};
BYTE injection[] = {
"\x81\xBA\x60\x55\x00\x00\xF4\x01\x00\x00" //cmp [edx+00005560],000001F4
"\x7C\x07" //jl hack
"\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
"\xC3" //ret
"\xC7\x82\x60\x55\x00\x00\xF4\x01\x00\x00" //mov [edx+00005560],000001F4
"\xC3" //ret
};
Memory* mem = new Memory("PlantsVsZombies.exe");
mem->openProcess();
DWORD address = 0x0041BAE5;
DWORD newmem = mem->alloc(sizeof(injection));
DWORD jmp_address = address-newmem-sizeof(injection);
DWORD jmp_newmem = newmem-address-5;
for(int i = 0;i<4;i++){
jump[i+1] = jmp_newmem >> 8*i;
}
mem->writeMemory(injection,newmem,sizeof(injection));
mem->writeMemory(jump,address,sizeof(jump));
printf("Call ");
for(int i = 0;i<4;i++){
printf("%X",jump[i+1]);
}
printf("\n");
printf("Allocated memory at %X\n",newmem);
printf("Jump to address is %X\n",jmp_address);
printf("Jump to newmem is %X\n",jmp_newmem);
system("PAUSE");
return 0;
}Прошу объяснить мне,как работает вот этот цикл
for(int i = 0;i<4;i++){jump[i+1] = jmp_newmem >> 8*i;} -
Собственно,теперь попробую понятно объяснить,чего я хочу
#include "Memory.h"
#include <cstdio>using namespace std;
int main(){
BYTE injection[] = {
"\x81\xBA\x60\x55\x00\x00\xF4\x01\x00\x00" //cmp [edx+00005560],000001F4
"\x0F\x8C\x0B\x00\x00\x00" //jl (newmem+27)-(newmem+10)-6
"\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
"\xE9\x00\x00\x00\x00" //jmp address-newmem-size
"\xC7\x82\x60\x55\x00\x00\xF4\x01\x00\x00" //mov [edx+00005560],000001F4
"\xE9\x00\x00\x00\x00" //jmp address-newmem-size
};
Memory* mem = new Memory("PlantsVsZombies.exe");
mem->openProcess();
DWORD address = 0x0041BAE5;
DWORD newmem = mem->alloc(PAGE_EXECUTE_READWRITE);
DWORD jmp_address = address-newmem-sizeof(injection);
DWORD jmp_newmem = newmem-address-5;
printf("Allocated memory at %X",newmem);
printf("Jump to address is %X",jmp_address);
printf("Jump to newmem is %X",jmp_newmem);
system("PAUSE");
return 0;
}Мне нужно как-то jmp_address и jmp_newmem перевести в байты,понятные ассемблеру(Перевести в 16-ричную систему счисления и переставить в обратном порядке),прошу объяснить как это сделать,желательно с примерами
-
Нашел вот это видео кодера,жаль,что без звука,буду смотреть
-
Смотрел вот эту http://forum.gamehacklab.ru/topic/3386-codeinjection-c/ тему и вот что у меня получилось:
#include "Memory.h"
#include <cstdio>
using namespace std;
int main(){
Memory* mem = new Memory("PlantsVsZombies.exe");
mem->openProcess();
DWORD address = 0x41BAE5;
DWORD newmem = mem->alloc();
//Пишем address E9 Развенуть newmem-address в 16-ричной системе счисления?
//Пишем в newmem инъекция E9 Развенуть (adress+6)-(mewmem+sizeof(инъекция)) в 16-ричной системе счисления?
mem->closeProcess();
}Вопрос:как перевести DWORD в byte,и правильно ли я все делаю?
[ENABLE]
alloc(newmem,2048)
label(returnhere)
newmem:
cmp [edx+5560],#500
jl @f
add eax,[edx+00005560]
jmp returnhere
@@:
mov [edx+5560],#500
jmp returnhere
"PlantsVsZombies.exe"+1BAE5:
jmp newmem
nop
returnhere:
[DISABLE]
dealloc(newmem)
"PlantsVsZombies.exe"+1BAE5:
add eax,[edx+00005560] -
-
Как уже писали,получается замкнутый круг и сделать игрока ПОЛНОСТЬЮ бессмертным не получается,а название игры я уже писал independentМожно. Предвидя вопрос "как" - смотри советы в теме. Но с онлайн играми может и не прокатить, так что тут смотря какую ты игру пытаешься взломать.
-
Я просто хочу понять,можно ли сделать игрока полностью бессмертнымТебе уже кучу советов дали, ты хоть один на практике проверил, прежде чем утверждать, что игрок умрет?
-
Да,но проблема в том,что эта инструкция как минимум 1 раз выполнится перед тем,как ее получится занопить и,если урон будет >=100(макс хп),то игрока убьет
-
Ставь бряк на запись при получении урона, устанавливай значение регистру, который отвечает за урон равным нулю - вот тебе и отключение урона.
Так а тема то о чем?Надо найти адрес инструкции,наносящей урон
-
Так тебе уже помогли. Либо ищи инструкцию, которая постоянно читает из адреса, либо, в некоторых случаях, ее действительно не будет до первого использования функции.
Но мне нужно было сделать так,чтобы игрока нельзя было убить,а ты,я так понимаю,предлагаешь сделать инъекцию кода,пишущую определенное значение в адрес здоровья.В игре,вроде как,если тебе попадают в голову,то убивают с одного выстрела,так что не катит.
Самое простое делать через таймер . Проверяешь был ли нанесен урон по таймеру. Т.е. если прошлое здоровье больше текущего, то начинаешь искать сигнатуру.
P.S. Бесконечный цикл не предлагать
Ладно,я понял,никто с этим еще не заморачивался
-
Так что,кто-нибудь поможет?
Поэтому показывай, как ты делаешь
-
Игра INDEPENDENT написана на c# в unity3d
Как-то так
-
Как найти сигнатуру, которой не существует до первого определенного действия в игре?
Ответ. Никак. Это же очевидно
Вот я и спрашиваю,вдруг есть какой-то способ
Вопрос:как можно это обойти,то-есть сканировать сигнатуру сразу,как только эта функция появляется
-
Например,я хочу занопить инструкцию,наносящую урон
Сделал сигнатуру,но CE ее не находит пока игроку не нанесется урон
Из чего я предположил,что инструкция появляется в памяти игры только тогда,когда она вызывается в первый раз
А на счет бесконечного цикла,я имею ввиду постоянное сканирование сигнатуры в памяти
-
Собственно,во многих играх,функции(возьмем,например,изменяющую здоровье) появляются только после того,как она потребуется,то-есть когда наносится урон.Вопрос:как можно это обойти,то-есть сканировать сигнатуру сразу,как только эта функция появляется
Надеюсь,меня поняли
P.S. Бесконечный цикл не предлагать
-
Самый точный (но очень долгий) поиск: "неизвестное значение", тип "все", метод - изменилось/не изменилось. Смотри уроки Xipho.
Тип "4 байта" (самый универсальный из всех типов), включает в себя при это методе - значения 4 байта, закодированное значение и float.
В нашем случае (Fallout3 поиск нанесённого урона):
"неизвестное значение", тип "float", метод - уменьшилось (при лечении)/увеличилось (при нанесении урона)/не изменилось (если ничего не поменялось).
Спасибо,забыл попробовать перед тем,как создавать тему
А как найдёшь адрес жизней, поставь на него бряк на чтение, так ты обнаружишь инструкции которые понадобится для написния твоего АА скрипта.
На чтение часто происходит вылет(по крайней мере у меня),так что,думаю,лучше на запись,на все равно спасибо
-
Интересно, как ты пытался залезть в структуру игрока, если ты здоровье не нашел?
Через другие значения:патроны,опыт
-
Всем привет!
Не могу взломать fallout 3 на здоровье
Поиск значения,которое в игре ничего не дает,пытался искать путем уменьшилось/увеличилось,находит много адресов,пытался замораживать по-очереди - не получается
Далее попробовал залезть в структуру игрока,тоже ничего не получилось
Кто-нибудь может подсказать хотя бы в каком виде хранится здоровье?
-
Спасибо,вроде понял
Для примера взят сапер:
movss [rax+20],xmm0 - опкоды
F3 0F 11 40 20 - байтыF3 0F ?? ?? 20 - сигнатура?или F3 0F 11 40 ?? ?
-
Собственно,вопрос:как искать сигнатуры,т.е. как узнать какие байты меняются,а какие нет?
Видел видеоурок кенга про плагин к олли,хотелось бы знать,как искать их самому
-
Так я же писал,что если я комментирую хедеры,ошибка остается
А вообще я сейчас всеми силами пытаюсь установить студию,ничего хорошего с этом билдером не выйдет
Кстати,при заходе на форум у меня аваст ругается Win32:Evo-gen [susp]
-
Это я понял,знать бы еще что делать,ошибка то в моем хедере,а не в билдеровском
Скрыть консоль,c++
in Низкоуровневое программирование
Опубликовано
Спасибо,видел эту команду,не могу найти параметры компилятора в eclipse
Ураа,я сделал это!
-mwindows нужно вставлять в project -> settings -> tool settings -> MinWG C++ Linker -> Command
То-есть должна получиться строчка g++ -mwindows