Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Проблема с написанием memory patcher’а; процесс жертвы не создается
Посл.ответ Сообщение

Ранг: 3.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 апреля 2007 22:49
· Личное сообщение · #1

Только начинаю учится крэкерству, и вот пришла необходимость написать лоадер. Базой выбрал Билдер, т.к ассемблер знаю совсем плохо. Прога-жертва очень простая (даже не запакована, и требуется изменить в ней только один байт). Но на ее основе я хочу понять общую технологию патчинга в памяти. Так как лоадеров раньше не писал, за основу взял статью "Memory Patcher для ASProtect" ALEX’а. Подогнал прогу из статьи под Билдер. Откомпилил. Но работает она неправильно. По неизвестной мне причине процесс, который должен запускать жертву не создается. Видимо что-то не так с параметрами. Жертва естественно находится в той же директории. Листинг функции memorypatch приведен ниже:




unsigned char ChoosenFile[12]={'c','r','a','c','k','m','e','1','.','e','x','e'};

long int offset = { 1037 }; // 0000040D - Offset address
unsigned char data[2] = { 117, 116 }; // 75h, 74h - Data to be written

STARTUPINFO *SI;
PROCESS_INFORMATION *PI;
if(!CreateProcess(0,ChoosenFile,0,0,false,CREATE_NEW_CONSOLE||NORMAL_P RIORITY_CLASS,0,0,SI,PI)){
Form1->RichEdit1->Lines->Strings[0]="SHIT!!!";
}
else{
Form1->RichEdit1->Lines->Strings[0]="Memory patching...";
SuspendThread(PI->hThread);
WriteProcessMemory(PI->hProcess,Pointer(offset[0]),&data[1],1,NULL);
Form1->RichEdit1->Lines->Strings[0]= Form1->RichEdit1->Lines->Strings[0]+" SUCCESS!";
ResumeThread(PI->hThread);
CloseHandle(PI->hProcess);
}


После запуска в RichEdit'e выдается "SHIT!!!"
Помогите разобраться.



Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 апреля 2007 02:45
· Личное сообщение · #2

Не знаю как это делается в Билдере (и кто это вообще такой). На асме я делал как указано в аттаче.

2c06_07.04.2007_CRACKLAB.rU.tgz - cut.rar



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 апреля 2007 03:10
· Личное сообщение · #3

обожемой
а экземпл в мсдне посмотреть не судьба? ты даже описание функции не открывал, я более чем уверен. плюс явное отсутствие понимания программирования под си.
плюс правильным тоном лоадеров считается создавать процесс с CREATE_SUSPENDED, дабы не получать шит



Ранг: 3.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 апреля 2007 07:40
· Личное сообщение · #4

LifeIsPain пишет:
а экземпл в мсдне посмотреть не судьба? ты даже описание функции не открывал, я более чем уверен. плюс явное отсутствие понимания программирования под си.

Я смотрел хелп по WIN32, и примера создания процесса там небыло, только описание. А нащет отсутствия понимания программирования, дак я и не говорил что мега-крутой программер.
Короче из всего что ты тут сказал, по теме является только последннее предложение, со всем остальным можешь идти сам знаешь куда...

Germsoft пишет:
На асме я делал как указано в аттаче.

Пасиб, буду изучать...



Ранг: 27.7 (посетитель), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 09 апреля 2007 13:25
· Личное сообщение · #5

ошибочно используются непроинициализированные указатели в двух последних параметрах.

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

void main( VOID )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
TEXT("MyChildProcess"), // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}



Ранг: 3.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 апреля 2007 18:51
· Личное сообщение · #6

ant_man
Пасиб за краткую справку. В хелпе который есть у меня примеров вообще мало. Надо доставать MSDN.

Короче разобрался я полностью, пасиб всем. Окончательный вариант функции приведен ниже (на случай если кому понадобится):

unsigned char file[] = "crackme1.exe";
long int address = 0x40100D; // Адрес функции, которую нужно изменить
unsigned char data[2] = { 0x75, 0x74 }; // jne, je
int error;

STARTUPINFO SI;
PROCESS_INFORMATION PI;
ZeroMemory(&SI,sizeof(SI));
SI.cb=sizeof(SI);
ZeroMemory(&PI,sizeof(PI));
if(!CreateProcess(NULL,TEXT(file),NULL,NULL,false,0,NULL,NULL,&SI,&PI) ){
error=GetLastError();
RichEdit1->Lines->Strings[0]="CreateProcess failed! Error #" + IntToStr(error) + ".\n";
}
else{
SuspendThread(PI.hThread);
ReadProcessMemory(PI.hProcess,Pointer(address),&data[0],1,NULL);
if(data[0]==0x75){
WriteProcessMemory(PI.hProcess,Pointer(address),&data[1],1,NULL);
RichEdit1->Lines->Strings[0]="Successful finish.\n";
}
else{
RichEdit1->Lines->Strings[0]="Error!\nProbably different file.\n";
}
ResumeThread(PI.hThread);
WaitForSingleObject(PI.hProcess,INFINITE);
CloseHandle(PI.hProcess);
CloseHandle(PI.hPThread);
}


 eXeL@B —› Программирование —› Проблема с написанием memory patcher’а; процесс жертвы не создается
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати