• XSS.stack #1 – первый литературный журнал от юзеров форума

Проблема с memcpy

n0kkster

HDD-drive
Пользователь
Регистрация
12.04.2021
Сообщения
45
Реакции
12
Всем привет, решил переписать LoadPE от одного хорошего человека так, чтобы можно было перевести в шеллкод и все работало. Как альтернативу встроенному memcpy юзаю самописный с тем же функционалом. Однако загвоздка в том, что я вызываю свою memcpy 2 раза - все ок, вызываю третий раз - компилятор дает ошибку "неразрешенный внешний символ _memcpy". Подскажите, как быть?
C++:
void* MyMemcpy(void* dest, const void* src, size_t bytes)
    {
        byte* cdest = (byte*)dest;
        const byte* csrc = (byte*)src;
        for (size_t i = 0; i < bytes; ++i) *cdest++ = *csrc++;
        return dest;
    }

...
retadr = (unsigned long)pVirtualAlloc(0, PeHeader.OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

                if (retadr) // если память выделилась
                {
                    // скопируем туда DOS заголовок
                    MyMemcpy((void*)retadr, &DosHeader, sizeof(IMAGE_DOS_HEADER));
                    // скопируем туда PE заголовок
                    MyMemcpy((void*)(retadr + DosHeader.e_lfanew), &PeHeader, sizeof(IMAGE_NT_HEADERS));
                    // ошибка возникает при использовании последующих MyMemcpy
                    // скопируем туда таблицу секций

                    MyMemcpy((void*)(retadr + DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS)), &Section[0], sizeof(IMAGE_SECTION_HEADER) * PeHeader.FileHeader.NumberOfSections);
                    ...
                }
1658416916555.png
Ошибка возникает при отключении оптимизации всей программы.
1658424409750.png
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажите, как быть?
А как компилятор должен узнать , что ваш самописный memcpy и есть тот, что ему нужен? Пиши как ниже и будет норм, ну или переименуй свою функу в такую, как надо.

C:
#pragma function(memcpy, memset)

void* memcpy(void* dst, const void* src, size_t count)
{
    void* ret = dst;

    while (count--) {
        *(char*)dst = *(char*)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }

    return ret;
}


void* memset(void* dst, int val, size_t count)
{
    void* start = dst;

    while (count--) {
        *(char*)dst = (char)val;
        dst = (char*)dst + 1;
    }

    return start;
}
 
А как компилятор должен узнать , что ваш самописный memcpy и есть тот, что ему нужен? Пиши как ниже и будет норм, ну или переименуй свою функу в такую, как надо.

C:
#pragma function(memcpy, memset)

void* memcpy(void* dst, const void* src, size_t count)
{
    void* ret = dst;

    while (count--) {
        *(char*)dst = *(char*)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }

    return ret;
}


void* memset(void* dst, int val, size_t count)
{
    void* start = dst;

    while (count--) {
        *(char*)dst = (char)val;
        dst = (char*)dst + 1;
    }

    return start;
}
Спасибо большое за совет, помогло)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Главное еще оптимизации отключить не забудьте. У меня как-то проблема была, что моя memcpy заменялась на memcpy из стандартной библиотеки.
Хотя названия разные были. Решилось всё через #pragma optimize("", off) <code> #pragma optimize("", on)
А вы тут еще и одинаковые названия решили сделать)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх