1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Скрыть объявление

Привет посетитель! У нас на форуме тебе откроются дополнительные разделы, которые скрыты от гостей! А так же ты найдёшь много полезной информации.

PE CheckSum calc func

Тема в разделе "C++ / C# / .NET", создана пользователем kick, 31 мар 2017.

  1. kick

    kick Магистр Йода Администратор

    Регистрация:
    20 янв 2015
    Сообщения:
    4.918
    Симпатии:
    3.483
    Баллы:
    6.235
    Код:
    //
    
    UINT32 CalcCheckSum(BYTE* _data, UINT32 _data_size, UINT32 _data_checkSumOffset)
    {
        UINT32 _checksum = 0, _i, _i_max;
    
        _i_max = (_data_checkSumOffset / sizeof(UINT16));
        for(_i = 0; _i < _i_max; _i++)
            _checksum += ((UINT16*)_data)[_i];
    
        _i_max = (_data_size / sizeof(UINT16));
        for(_i += (sizeof(UINT32) / sizeof(UINT16)); _i < _i_max; _i++)
            _checksum += ((UINT16*)_data)[_i];
    
        _checksum = ((_checksum >> (sizeof(UINT16) * CHAR_BIT)) + ((UINT16)_checksum));
        _checksum = (_checksum + (_checksum >> (sizeof(UINT16) * CHAR_BIT)));
        _checksum = (_data_size + ((UINT16)_checksum));
    
        return _checksum;
    };
    
    //
    
    VOID Msg(const WCHAR* format = L"", ...)
    {
        WCHAR pBuff[2048];
        va_list va;
        va_start(va, format);
        vswprintf_s(pBuff, 2048, format, va);
        MessageBoxW(0, pBuff, L"", MB_OK);
        va_end(va);
    };
    
    //
    
        FILE* pFile = _wfopen(L"DllFile.dll", L"rb");
        if(pFile)
        {
            fseek(pFile, 0, SEEK_END);
            UINT32 _file_size = (UINT32)ftell(pFile);
            fseek(pFile, 0, SEEK_SET);
    
            string _file_buff;
            _file_buff.resize(_file_size);
    
            if(fread((LPVOID)_file_buff.c_str(), _file_size, 1, pFile) == 1)
            {
                fclose(pFile); pFile = NULL;
    
                //
    
                ULONG_PTR _file = (ULONG_PTR)_file_buff.c_str(), _file_size = (ULONG_PTR)_file_buff.size();
    
                if(((PIMAGE_DOS_HEADER)_file)->e_magic == IMAGE_DOS_SIGNATURE)
                {
                    PIMAGE_NT_HEADERS _pinth = (PIMAGE_NT_HEADERS)(_file + ((PIMAGE_DOS_HEADER)_file)->e_lfanew);
    
                    switch(_pinth->OptionalHeader.Magic)
                    {
                    case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
                        {
                            PIMAGE_NT_HEADERS32 pinth = (PIMAGE_NT_HEADERS32)_pinth;
    
                            Msg(L"in_file: 0x%08X, calculated: 0x%08X (X86)", pinth->OptionalHeader.CheckSum, CalcCheckSum((BYTE*)_file, ((UINT32)_file_size), ((UINT32)(((ULONG_PTR)&pinth->OptionalHeader.CheckSum) - _file))));
    
                            break;
                        }
                    case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
                        {
                            PIMAGE_NT_HEADERS64 pinth = (PIMAGE_NT_HEADERS64)_pinth;
    
                            Msg(L"in_file: 0x%08X, calculated: 0x%08X (X64)", pinth->OptionalHeader.CheckSum, CalcCheckSum((BYTE*)_file, ((UINT32)_file_size), ((UINT32)(((ULONG_PTR)&pinth->OptionalHeader.CheckSum) - _file))));
    
                            break;
                        }
                    }
    
                    //
                }
    
                //
            }
            else
            {
                fclose(pFile); pFile = NULL;
            }
        }
    
    //
    
     
Похожие темы
  1. kick

    Софт Augmentation Calc 1.1

    kick, 29 янв 2015, в разделе: Софт
    Ответов:
    0
    Просмотров:
    466
  2. Emphatic
    Ответов:
    1
    Просмотров:
    413
Загрузка...