- 221
- 359
Есть WinAPI приложение. В нем - листбокс с дефолтным скроллбаром. Нужно изменить цвет скроллбара (фона и каретки).
Как я понял, дефолтный цвет получается изанусаконфигурации ОС при помощи функции GetSysColor библиотеки user32.dll.
Долго не думая, решил хукнуть эту функцию и менять в ней нужные значения на свои
после чего запустил приложение и обосрался: хук ведь устанавливается в начале функции main, а GetSysColor вызывается раньше нее. В итоге функция-то хукнута, но профита в этом нет.
Посмотрел на вызовы этой функции:
Выглядит законно. Как я понимаю, в ds кладется адрес поля какой-то структуры внутри либы comctl32.dll. Вернемся в тело функи GetSysColor:
Остановился непосредственно на чтении значения цвета из [eax+ecx*4+0x11d8], где:
eax == USER32.gSharedInfo+238 == *(user32.dll+A4BA0) == указатель на что-то,
ecx == аргумент функции (константа с msdn)
0x11d8 == неведомаяхуйняконстанта
Отлично, значит по адресу *(user32.dll+0xA4BA0) + 0x11d8 начинается структура, хранящая цвета различных элементов. Проверил пару значений с мсдн:
Рассчитал оффсет COLOR_BTNTEXT: *(user32.dll+A4BA0) + 11d8 + 4*0x12 = 0x392260. По этому адресу лежит 0x00000000 - код черного цвета. Справедливо для BTNTEXT.
Аналогично рассчитал для COLOR_GRAYTEXT - по рассчитанному адресу оказалось значение 0x006d6d6d, что также справедливо, похоже на серый. Да и в целом эта область памяти выглядит похожей на правду, много повторяющихся байт(монохром):
Указатель на этот блок с цветами лежит тут: comctl32.dll+0x76c00 (да-да, уже не user32.dll)
Окей. Заговнокодил:
и даже защиту на ридонли поставил. (скрин с начала функции winMain, до создания интересующего меня листбокса со скроллбаром.
Профита ноль. Может, я вообще не в ту сторону шагаю? В чем ошибка?
ПС нужно сделать без драйверов
Как я понял, дефолтный цвет получается из
Долго не думая, решил хукнуть эту функцию и менять в ней нужные значения на свои
Посмотрел на вызовы этой функции:
eax == USER32.gSharedInfo+238 == *(user32.dll+A4BA0) == указатель на что-то,
ecx == аргумент функции (константа с msdn)
0x11d8 == неведомая
Отлично, значит по адресу *(user32.dll+0xA4BA0) + 0x11d8 начинается структура, хранящая цвета различных элементов. Проверил пару значений с мсдн:
Аналогично рассчитал для COLOR_GRAYTEXT - по рассчитанному адресу оказалось значение 0x006d6d6d, что также справедливо, похоже на серый. Да и в целом эта область памяти выглядит похожей на правду, много повторяющихся байт(монохром):
Окей. Заговнокодил:
Профита ноль. Может, я вообще не в ту сторону шагаю? В чем ошибка?
ПС нужно сделать без драйверов
Вложения
Последнее редактирование: