User123 Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Смотрел вот эту 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],#500jl @fadd eax,[edx+00005560]jmp returnhere@@:mov [edx+5560],#500jmp returnhere"PlantsVsZombies.exe"+1BAE5:jmp newmemnopreturnhere:[DISABLE]dealloc(newmem)"PlantsVsZombies.exe"+1BAE5:add eax,[edx+00005560] Ссылка на комментарий Поделиться на другие сайты Поделиться
User123 Опубликовано 5 мая, 2015 Автор Поделиться Опубликовано 5 мая, 2015 Нашел вот это видео кодера,жаль,что без звука,буду смотреть Ссылка на комментарий Поделиться на другие сайты Поделиться
User123 Опубликовано 6 мая, 2015 Автор Поделиться Опубликовано 6 мая, 2015 (изменено) Собственно,теперь попробую понятно объяснить,чего я хочу #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-ричную систему счисления и переставить в обратном порядке),прошу объяснить как это сделать,желательно с примерами Изменено 6 мая, 2015 пользователем User123 Ссылка на комментарий Поделиться на другие сайты Поделиться
User123 Опубликовано 7 мая, 2015 Автор Поделиться Опубликовано 7 мая, 2015 Спасибо кодеру за это видео,вроде все работает Только я не понимаю как #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;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 мая, 2015 Поделиться Опубликовано 8 мая, 2015 Спасибо кодеру за это видео,вроде все работает Прошу объяснить мне,как работает вот этот циклfor(int i = 0;i<4;i++){jump[i+1] = jmp_newmem >> 8*i;} Он записывает побайтово адрес куда прыгать в перевернутом виде (так нужно делать, так как инструкция 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-addresshttp://stackoverflow.com/questions/8196835/calculate-the-jmp-opcodesНу и еще можешь погуглить. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
User123 Опубликовано 8 мая, 2015 Автор Поделиться Опубликовано 8 мая, 2015 Он записывает побайтово адрес куда прыгать в перевернутом виде (так нужно делать, так как инструкция 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-addresshttp://stackoverflow.com/questions/8196835/calculate-the-jmp-opcodesНу и еще можешь погуглить.Спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения