Шрифт в консоли

Тема в разделе "WASM.WIN32", создана пользователем BreakHeart, 13 ноя 2009.

  1. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    Подскажите пожалуйста как поменять шрифт в консоли?
    Нужно с точечного шрифта переключиться на Lucida!?
    ОС WinXP так что SetCurrentConsoleFontEx не предлагать если нет способа ее запустить на XP
     
  2. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    не уверен, но думаю что можно попробовать GetConsoleWindow и дальше применить шрифт к окну.
     
  3. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    а как применить шрифт?
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ну обычно через GetDC получить хендл ДЦ, а потом SelectObject... Вот только вопрос, что вернет GetDC для консоли?
     
  5. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    И как таким образом шрифт консоли установить?
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не прокатит ваша затея. Консольное окно - особое, в нем куча хаков. GetDС от него вернет ноль. А шрифт устанавливается не по HDC, а сообщением WM_SETFONT. Но для консоли это скорее всего тоже не прокатит.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Скорее всего придется прописывать реестр и рестартить процесс.
     
  8. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    К реестру очень не хотелось бы обращаться...
     
  9. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    А как получить хэндл консоли?а то че-то забыл и в мсдн найти не могу
     
  10. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    Код (Text):
    1. HFONT hFont;
    2. hFont = CreateFont(15, 0, 0, 0, 550, 0, 0, 0, 0, 0, 0, 0, 0, L"Lucida Console");
    3. SendMessage((HWND)GetStdHandle(STD_OUTPUT_HANDLE), WM_SETFONT, (UINT)hFont, TRUE);
    Попытался сделать так, но ничего не получилось(может еще какие идеи есть?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    BreakHeart

    GetConsoleWindow(). Только с этим окном мало что сделать получится.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    BreakHeart

    омг...)))
     
  13. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    На самом деле, это сделать почти невозможно. Есть более-менее нормальный способ - через правку реестра (выбором консольного шрифта по умолчанию - люцида), о чем и советуют. И есть неправильный способ - SetConsoleFont (недокументированная) - в принципе, если изучить все шрифты для консоли, по размеру, и найти такой вариант с люцидой, который по параметрам не имеет аналогов среди растровых, то можно, в цикле перебирая шрифты через SetConsoleFont, добраться до того, который нужен. Но это не гарантирует работу на другой системе, с другим сервис-паком, и так далее. Легче отказаться от требования "сменить шрифт в консоли", и объяснить, зачем и почему это нужно. Если речь идет о пресловутой русификации, то уже достало - CharToOem, и никому не надо ломать голову.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Far - одна из крутейших консольных прог - и тот не умеет самостоятельно менять свой шрифт.
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Если в свойствах ярлыка консольной программы можно поменять ей шрифт вручную, возможно, существует способ сделать то же самое программно. Временный ярлык это, конечно, мизерабль, но более прямого пути я не видел.
     
  16. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    поменять нужно т.к. только люцида поддерживает одновременно и немецкий и русский языки....если кто-нить подскажет локаль кот будет поддерживать оба эти языка буду благодарен...я пока такую еще не нашел
     
  17. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Тоже искал решение этой проблемы. В интернетах ниче не нашел, зато пару часов в обществе оли дали некоторые плоды.

    Диалог настроек консольного окна реализован в system32/console.dll

    Вот дамп того места, где выполняется непосредственно сама настройка:

    Код (Text):
    1. 6EA62E4C   53             PUSH EBX
    2. 6EA62E4D   8B5C24 08      MOV EBX,DWORD PTR SS:[ESP+8]
    3. 6EA62E51   56             PUSH ESI                                   ; USER32.LoadStringW
    4. 6EA62E52   33F6           XOR ESI,ESI
    5. 6EA62E54   39B3 C8000000  CMP DWORD PTR DS:[EBX+C8],ESI
    6. 6EA62E5A   75 04          JNZ SHORT CONSOLE.6EA62E60
    7. 6EA62E5C   33C0           XOR EAX,EAX
    8. 6EA62E5E   EB 6B          JMP SHORT CONSOLE.6EA62ECB
    9. 6EA62E60   55             PUSH EBP
    10. 6EA62E61   56             PUSH ESI
    11. 6EA62E62   FF33           PUSH DWORD PTR DS:[EBX]
    12. 6EA62E64   56             PUSH ESI
    13. 6EA62E65   6A 04          PUSH 4
    14. 6EA62E67   56             PUSH ESI
    15. 6EA62E68   6A FF          PUSH -1
    16. 6EA62E6A   FF15 7810A66E  CALL DWORD PTR DS:[<&KERNEL32.CreateFileMa>; kernel32.CreateFileMappingW
    17. 6EA62E70   8BE8           MOV EBP,EAX
    18. 6EA62E72   3BEE           CMP EBP,ESI
    19. 6EA62E74   75 04          JNZ SHORT CONSOLE.6EA62E7A
    20. 6EA62E76   33C0           XOR EAX,EAX
    21. 6EA62E78   EB 50          JMP SHORT CONSOLE.6EA62ECA
    22. 6EA62E7A   56             PUSH ESI
    23. 6EA62E7B   56             PUSH ESI
    24. 6EA62E7C   56             PUSH ESI
    25. 6EA62E7D   68 1F000F00    PUSH 0F001F
    26. 6EA62E82   55             PUSH EBP
    27. 6EA62E83   FF15 7410A66E  CALL DWORD PTR DS:[<&KERNEL32.MapViewOfFil>; kernel32.MapViewOfFile
    28. 6EA62E89   3BC6           CMP EAX,ESI
    29. 6EA62E8B   74 34          JE SHORT CONSOLE.6EA62EC1
    30. 6EA62E8D   8B0B           MOV ECX,DWORD PTR DS:[EBX]
    31. 6EA62E8F   8BD1           MOV EDX,ECX
    32. 6EA62E91   57             PUSH EDI
    33. 6EA62E92   C1E9 02        SHR ECX,2
    34. 6EA62E95   8BF8           MOV EDI,EAX
    35. 6EA62E97   8BF3           MOV ESI,EBX
    36. 6EA62E99   F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[>
    37. 6EA62E9B   8BCA           MOV ECX,EDX
    38. 6EA62E9D   83E1 03        AND ECX,3
    39. 6EA62EA0   50             PUSH EAX
    40. 6EA62EA1   F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ES>
    41. 6EA62EA3   FF15 6C10A66E  CALL DWORD PTR DS:[<&KERNEL32.UnmapViewOfF>; kernel32.UnmapViewOfFile
    42. 6EA62EA9   6A 00          PUSH 0
    43. 6EA62EAB   55             PUSH EBP
    44. 6EA62EAC   68 C9040000    PUSH 4C9
    45. 6EA62EB1   FFB3 C8000000  PUSH DWORD PTR DS:[EBX+C8]
    46. 6EA62EB7   FF15 9C11A66E  CALL DWORD PTR DS:[<&USER32.SendMessageW>] ; USER32.SendMessageW
    47. 6EA62EBD   33F6           XOR ESI,ESI
    48. 6EA62EBF   46             INC ESI
    49. 6EA62EC0   5F             POP EDI
    50. 6EA62EC1   55             PUSH EBP
    51. 6EA62EC2   FF15 6810A66E  CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>>; kernel32.CloseHandle
    52. 6EA62EC8   8BC6           MOV EAX,ESI
    53. 6EA62ECA   5D             POP EBP
    54. 6EA62ECB   5E             POP ESI
    55. 6EA62ECC   5B             POP EBX
    56. 6EA62ECD   C2 0400        RETN 4
    вольная сишная интерпритация:

    Код (Text):
    1. // Создаем не именованный файл отображенный в память
    2. HANDLE fmhandle = CreateFileMappingW(0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x10C, NULL);
    3.  
    4. LPVOID fmview = MapViewOfFile(fmhandle, F001F, 0, 0, 0);
    5.  
    6. // Записываем туда инфу о шрифте и т.п.
    7. CopyMemory(fmview, /*Указатель на структуру с настройкам*/, 0x10C);
    8.  
    9. UnmapViewOfFile(fmview);
    10.  
    11. // Посылаем нашему консольному окну специальную месагу
    12. SendMessageW(conhandle, 0x4C9, fmhandle, 0);
    13.  
    14. //Закроем файл
    15. CloseHandle(fmhandle);
    где
    conhandle - хэндл консольного окна,
    fmhandle - хэндл файла отображаемого в память, в который записана какая-то магическая структура, дамп которой выглядит следующим образом:

    Особый интерес представляет вызов SendMessage.

    А в качестве струкуры с настройкам, в отладчике подсмотрен такой вот дамп:

    Код (Text):
    1. 00145A70   0C 01 00 00 50 00 2C >...P.,
    2. 00145A78   50 00 19 00 D4 00 00 >P..Ф...
    3. 00145A80   7B 00 00 00 00 00 0C >{.......
    4. 00145A88   36 00 00 00 90 01 00 >6...ђ..
    5. 00145A90   4C 00 75 00 63 00 69 >L.u.c.i.
    6. 00145A98   64 00 61 00 20 00 43 >d.a. .C.
    7. 00145AA0   6F 00 6E 00 73 00 6F >o.n.s.o.
    8. 00145AA8   6C 00 65 00 00 00 00 >l.e.....
    9. 00145AB0   00 00 00 00 00 00 00 >........
    10. 00145AB8   00 00 00 00 00 00 00 >........
    11. 00145AC0   00 00 00 00 00 00 00 >........
    12. 00145AC8   00 00 00 00 00 00 00 >........
    13. 00145AD0   19 00 00 00 00 00 00 >.......
    14. 00145AD8   00 00 00 00 00 00 01 >.......
    15. 00145AE0   01 00 00 00 07 00 F5 >....х.
    16. 00145AE8   00 00 00 00 32 00 00 >....2...
    17. 00145AF0   04 00 00 00 00 00 00 >.......
    18. 00145AF8   00 00 80 00 00 80 00 >..Ђ..Ђ..
    19. 00145B00   00 80 80 00 80 00 00 >.ЂЂ.Ђ...
    20. 00145B08   80 00 80 00 80 80 00 >Ђ.Ђ.ЂЂ..
    21. 00145B10   C0 C0 C0 00 80 80 80 >ААА.ЂЂЂ.
    22. 00145B18   00 00 FF 00 00 FF 00 >..я..я..
    23. 00145B20   00 FF FF 00 FF 00 00 >.яя.я...
    24. 00145B28   FF 00 FF 00 FF FF 00 >я.я.яя..
    25. 00145B30   FF FF FF 00 62 03 00 >яяя.b..
    26. 00145B38   DC 01 52 00 25 00 53 >ЬR.%.S.
    27. 00145B40   79 00 73 00 74 00 65 >y.s.t.e.
    28. 00145B48   6D 00 52 00 6F 00 6F >m.R.o.o.
    29. 00145B50   74 00 25 00 5C 00 73 >t.%.\.s.
    30. 00145B58   79 00 73 00 74 00 65 >y.s.t.e.
    31. 00145B60   6D 00 33 00 32 00 5C >m.3.2.\.
    32. 00145B68   63 00 6D 00 64 00 2E >c.m.d...
    33. 00145B70   65 00 78 00 65 00 00 >e.x.e...
    34. 00145B78   00 00 00 00          >....
    Осталось узнать как интерпретировать байты этой структуры, чтобы можно было свободно менять шрифты, размеры и цвета...
    Может у кого-нить будут соображения по этому поводу?
     
  18. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    http://www.milw0rm.com/exploits/1198

    вот тут довольно похожая структура
     
  19. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Написал на сях. РАБОТАЕТ!!!

    Вот код:

    Код (Text):
    1. //---------------------------------------------------------------------------
    2. #include <iostream.h>
    3. #include <windows.h>
    4.  
    5. char fontdata[] =
    6. {
    7. 0x0C, 0x01, 0x00, 0x00, 0x50, 0x00, 0x2C, 0x01,
    8. 0x50, 0x00, 0x19, 0x00, 0x6E, 0x00, 0x00, 0x00,
    9. 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00,
    10. 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,
    11. 0x4C, 0x00, 0x75, 0x00, 0x63, 0x00, 0x69, 0x00,
    12. 0x64, 0x00, 0x61, 0x00, 0x20, 0x00, 0x43, 0x00,
    13. 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x6F, 0x00,
    14. 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
    15. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    16. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    17. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    18. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    19. 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    20. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
    21. 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF5, 0x00,
    22. 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
    23. 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    24. 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00,
    25. 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00,
    26. 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00,
    27. 0xC0, 0xC0, 0xC0, 0x00, 0x80, 0x80, 0x80, 0x00,
    28. 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
    29. 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
    30. 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
    31. 0xFF, 0xFF, 0xFF, 0x00, 0x62, 0x03, 0x00, 0x00,
    32. 0x84, 0x01, 0x4E, 0x00, 0x25, 0x00, 0x53, 0x00,
    33. 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00,
    34. 0x6D, 0x00, 0x52, 0x00, 0x6F, 0x00, 0x6F, 0x00,
    35. 0x74, 0x00, 0x25, 0x00, 0x5C, 0x00, 0x73, 0x00,
    36. 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00,
    37. 0x6D, 0x00, 0x33, 0x00, 0x32, 0x00, 0x5C, 0x00,
    38. 0x63, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x2E, 0x00,
    39. 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x00, 0x00,
    40. 0x00, 0x00, 0x00, 0x00
    41. };
    42.  
    43. int main(int argc, char* argv[])
    44. {
    45.     SetConsoleTitle("testconwnd");
    46.  
    47.     HANDLE FMHandle;
    48.     HWND ConWnd;
    49.     LPVOID MView;
    50.  
    51.     ConWnd = FindWindow(NULL, "testconwnd");
    52.  
    53.     if(ConWnd == NULL){ cout << "FindWindow"; goto exit;}
    54.  
    55.     FMHandle = CreateFileMappingW(
    56.         (HANDLE)0xFFFFFFFF,
    57.         NULL,
    58.         PAGE_READWRITE,
    59.         0,
    60.         sizeof(fontdata),
    61.         NULL);
    62.  
    63.     if(FMHandle == NULL) {cout << "CreateFileMappingW"; goto exit; }
    64.  
    65.     MView = MapViewOfFile(
    66.         FMHandle,
    67.         0xF001F,
    68.         0,
    69.         0,
    70.         0);
    71.  
    72.     if(MView == NULL) { cout << "MapViewOfFile"; goto exit;}
    73.  
    74.     CopyMemory(MView, fontdata, sizeof(fontdata));
    75.  
    76.     UnmapViewOfFile(MView);
    77.  
    78.     SendMessageW(ConWnd, 0x4C9, (unsigned)FMHandle, 0);
    79.  
    80.     CloseHandle(FMHandle);
    81.  
    82.     cout << "Hello world!" << endl;
    83.  
    84. exit:
    85.     cin.get();
    86.     return 0;
    87. }
    88. //---------------------------------------------------------------------------
    Код выполнен средствами Borland C++ Builder 6.0
     
  20. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    + Чтобы вывести русские буковки нужно указать еще кодовую страницу SetConsoleOutputCP(1251)


    Попробовал применить указанную там струкуру. Че-то не пашет.