Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2010, 14:42   #1
Zlyden'
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию С++ и Windows Server 2003

Недавно освоил внедрение в код процесса. Создал программку для своего сервера - у меня все работает как часы! Кинул на сервер - ни фига. При запуске чмод показывает, что невозможно запустить, при простом клике по программе выдается что-то вроде "приложение было неправильно настроено, возможно, переустановка поможет". Программа простая, как два рубля - только dll и инъектор.
Думаю, дело в системе - на сервере стоит Windows Server 2003 (никогда ее не трогал, хотя отдельные dll на сервер заливал и все работало. У меня Windows XP sp2, на тестовом сервере сбоев нет. Вот код инъектора:
Код:
// Injector.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <windows.h>
#include <stddef.h>
#include <iostream>

#pragma pack (push,1)
struct INJECTORCODE{
	BYTE  instr_push_loadlibrary_arg;	//инструкция push
	DWORD loadlibrary_arg;			//аргумент push  

	WORD  instr_call_loadlibrary;		//инструкция call []  
	DWORD adr_from_call_loadlibrary;

	BYTE  instr_push_exitthread_arg;
	DWORD exitthread_arg;

	WORD  instr_call_exitthread;
	DWORD adr_from_call_exitthread;

	DWORD addr_loadlibrary;
	DWORD addr_exitthread;	//адрес функции ExitTHread
	BYTE  libraryname[100];	//имя и путь к загружаемой библиотеке  
};

#pragma pack (pop)

BOOL InjectDll(DWORD pid, char *lpszDllName){
	HANDLE hProcess;
	BYTE *p_code;
	INJECTORCODE cmds;
	DWORD wr, id;

	//открыть процесс с нужным доступом
	hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|
		PROCESS_VM_OPERATION, FALSE, pid);
	if(hProcess == NULL){
		MessageBoxA(NULL, "You have not enough rights to attach dlls", 
			"Error", 0);
		return FALSE;
	}

	//зарезервировать память в процессе
	p_code = (BYTE*)VirtualAllocEx(hProcess, 0, sizeof(INJECTORCODE),
		MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	if(p_code==NULL){
		MessageBoxA(NULL, "Unable to alloc memory in remote process",
			"Error", 0);
		return FALSE;
	}

	//инициализировать  машинный код
	cmds.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
	cmds.loadlibrary_arg = (DWORD)((BYTE*)p_code 
		+ offsetof(INJECTORCODE, libraryname));

	cmds.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
	cmds.adr_from_call_loadlibrary = 
		(DWORD)(p_code + offsetof(INJECTORCODE, addr_loadlibrary));

	cmds.instr_push_exitthread_arg  = 0x68;
	cmds.exitthread_arg = 0;

	cmds.instr_call_exitthread = 0x15ff; 
	cmds.adr_from_call_exitthread = 
		(DWORD)(p_code + offsetof(INJECTORCODE, addr_exitthread));

	cmds.addr_loadlibrary = 
		(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

	cmds.addr_exitthread  = 
		(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread");

	if(strlen(lpszDllName)>99){
		MessageBoxA(NULL, "Dll Name too long", "Error!", 0);
		return FALSE;
	}
	strcpy((char*)cmds.libraryname, lpszDllName );

	/*После инициализации cmds в мнемонике ассемблера выглядит следующим
	образом:
	push  adr_library_name               ;аргумент ф-ции loadlibrary
	call dword ptr [loadlibrary_adr]     ; вызвать LoadLibrary 
	push exit_thread_arg                 ;аргумент для ExitThread
	call dword ptr [exit_thread_adr]     ;вызвать ExitThread     
	*/

	//записать машинный код по зарезервированному адресу
	WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);

	//выполнить машинный код
	HANDLE z = CreateRemoteThread(hProcess, NULL, 0, 
		(unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);

	//ожидать завершения удаленного потока
	WaitForSingleObject(z, INFINITE);
	//освободить память
	VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);

	return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow){
	STARTUPINFO cif;
	ZeroMemory(&cif,sizeof(STARTUPINFO));
	PROCESS_INFORMATION pi;
	bool Process_Created;
	if (!lpCmdLine||!(*lpCmdLine))
		Process_Created=CreateProcess("server.exe\0",0,0,0,0,CREATE_DEFAULT_ERROR_MODE|CREATE_NEW_CONSOLE,0,0,&cif,&pi);
	else
		Process_Created=CreateProcess(0,lpCmdLine,0,0,0,CREATE_DEFAULT_ERROR_MODE|CREATE_NEW_CONSOLE,0,0,&cif,&pi);
	if (!Process_Created)
		MessageBoxA(NULL, "Couldn't load server!", "Error!", 0);
	else{
		InjectDll(pi.dwProcessId, "injected.dll");
	}
	//Ожидание выключения (для батника-рестартёра)
	WaitForSingleObject(pi.hProcess, INFINITE);
	DWORD exitCode=0;
	if (GetExitCodeProcess(pi.hProcess, &exitCode))
		if(exitCode){
			FILE * f = fopen("errorlog.log","w");
			fprintf(f,"%d\n",exitCode);
			fclose(f);
		}
	return 0;
}
Что примечательно - по словам админа ни одного окошка с сообщением об ошибке не вылезало.
В общем, что мне с этим делать? Надо, чтобы программа была совместима с Windows Server 2003
Zlyden' вне форума Ответить с цитированием
Старый 29.04.2010, 21:33   #2
Zlyden'
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию

Я в этой жизни ничего не понимаю.
Пересобирал программу и так и эдак, даже перевел в консольный вид - не пашет. Решил по очереди выявить проблему - сделал 5 программ с обрезками кода. Первая только запускается, вторая стартует сервер, третья еще и ждет его завершения, четвертая прибивает к нему длл. Запускали по очереди... И все заработало! Даже четвертая, точная копия первоначального проекта, запустилась без ругани!
Zlyden' вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
windows server 2003 Bat{CMD}_Men Windows 1 03.02.2010 21:55
Разница исполнения под Windows XP и Windows Server 2003? -Nast- Общие вопросы Delphi 0 02.06.2009 09:20
Доступ к БД (SQL server) в ОС Windows server 2003 Mann SQL, базы данных 2 07.12.2008 19:15
windows server 2003 necky Операционные системы общие вопросы 4 29.05.2008 14:50