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

Инъекция кода на c++


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

Смотрел вот эту 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]

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

Собственно,теперь попробую понятно объяснить,чего я хочу  :-D

#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-ричную систему счисления и переставить в обратном порядке),прошу объяснить как это сделать,желательно с примерами  :closeyes:

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

Спасибо кодеру за это видео,вроде все работает

Только я не понимаю как  :-D

#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;
}
Ссылка на комментарий
Поделиться на другие сайты

 

Спасибо кодеру за это видео,вроде все работает

 

Прошу объяснить мне,как работает вот этот цикл

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-address

http://stackoverflow.com/questions/8196835/calculate-the-jmp-opcodes

Ну и еще можешь погуглить.

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

Он записывает побайтово адрес куда прыгать в перевернутом виде (так нужно делать, так как инструкция 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

Ну и еще можешь погуглить.

Спасибо!

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

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

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

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