Как разыменовать указатель на функцию и читать как данные в MSVC ++? - PullRequest
4 голосов
/ 04 декабря 2011

Ниже приведена моя попытка прочитать машинный код, на который указывает указатель функции, и распечатать его.В настоящее время печатаемые данные не совпадают с генерируемым кодом ... Я проверил значения указателей, созданных в производимом исполняемом файле и перечисленных дизассемблером (есть разница между кодом / отладчиком), но нене вижу ничего слишком тревожного или понимаю, как я могу решить проблему.

void dummy();

int _tmain(int argc, _TCHAR* argv[])
{
    int i;

    printf("\nReading dummy...\n");
    for(i = 0; i < 25; i++)
        printf("%.2X ", ((char *)((void *)dummy))[i]);
    puts("");

    dummy();

    getchar();
    return 0;
}

void __declspec(naked) dummy()
{
    __asm
    {
        nop;
        nop;
        nop;
        nop;

        ret;
    }
}

Ответы [ 4 ]

12 голосов
/ 04 декабря 2011

Две распространенные ошибки, которые можно сделать здесь Прежде всего, приведите к unsigned char* вместо char *. Далее, и самый важный, Project + Properties, Linker, General и отключите инкрементное связывание.

Если включено инкрементное связывание, адрес функции фактически указывает на небольшую заглушку, которая не содержит ничего, кроме JMP для реальной функции. Что позволяет компоновщику заменить старый код новым кодом без необходимости перестраивать весь исполняемый образ. Ваш код читает эту заглушку вместо реальной функции, когда включено инкрементное связывание. Правильный вывод:

Reading dummy...
90 90 90 90 C3 //... rest is random
2 голосов
/ 04 декабря 2011

Дай угадаю, он напечатал это:

FFFFFF90 FFFFFF90 FFFFFF90 FFFFFF90 FFFFFFC3

Попробуйте использовать модификатор длины hh с printf:

printf("%02hhX ", ((char *)((void *)dummy))[i]);

Вывод:

90 90 90 90 C3

Спецификатор X сам по себе печатает значение как unsigned int, но вы передаете char, повышенное до signed int.Модификатор hh меняет его на unsigned char вместо unsigned int.

0 голосов
/ 04 декабря 2011

Изменить строку

printf("%.2X ", ((char *)((void *)dummy))[i]);

до

printf("%.2X ", ((unsigned char *)dummy)[i]);
0 голосов
/ 04 декабря 2011

Вот, пожалуйста:

#include <stdio.h>

void PrintHex(const char* input, const int len)
{
     char * tmp=new char[len*3+1];
     for(int i=0;i<len;++i)
          sprintf(tmp+i*3,"%02x ",*(input+i)&0xFF);

     printf("%s\n",tmp);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...