можно помешать дактилоскопии браузера, вернув поддельный список установленных шрифтов? - PullRequest
3 голосов
/ 07 января 2011

Можно ли написать программу, которая маскирует набор шрифтов, установленных на компьютере, чтобы список шрифтов выглядел "простым ванилью" и не имел большого значения для создания уникального отпечатка пальца?https://panopticlick.eff.org/

Ответы [ 2 ]

1 голос
/ 07 января 2011

Возможно, в некоторых браузерах это поддерживается, но в любом браузере вы можете перехватывать вызовы winapi для перечисления списка шрифтов.

По сути, вы пишете DLL, которая будет загружена в процесс браузера, а затем она будет перехватывать вызовы, которые браузер будет выполнять с ОС, когда будет перечислять шрифты. Просто посмотрите, какие функции в окнах используются для перечисления шрифтов, и подделайте их в своей dll. (хотя это может потребовать некоторых усилий, потому что вам придется переписать логику перечисления шрифтов).

Кроме того, некоторые браузеры могут просто читать реестр, чтобы перечислить шрифты, и не использовать специализированные функции шрифтов, в этом случае вам придется перехватывать функции registry-winapi и сообщать о списке шрифтов, который ты хочешь.

Для загрузки вашей dll в целевой процесс вы можете использовать хуки Windows или использовать редактор файлов .exe, чтобы добавить dll для импорта таблицы exe-файла браузера. В реестре также есть специальное место, где, если вы добавите туда dll, он будет загружен для каждого процесса в системе. (тогда вам придется проверять процесс браузера и только тогда перехватывать вызовы API, так что не каждая программа в вашей системе получит фиктивный список шрифтов).

Кроме того, возможно, что браузер запустит какой-нибудь плагин, или элемент управления activex, или java, или что-то подобное в другом процессе (например, chrome запускает каждую вкладку в разных процессах), поэтому я бы проверил родителя каждого процесса и, если вы видите, что он был запущен браузером, перехватите список шрифтов в этом процессе. Таким образом, целевая веб-страница не сможет получить реальный список шрифтов через flash, плагины, java или что-либо еще.

Хорошее начало для перехвата вызовов Winapi можно найти здесь: http://www.codeproject.com/KB/system/InterceptWinAPICalls.aspx

Так что это надежный способ сделать это, и хотя это не может быть сделано за час, это не слишком сложно.

Конечно, это не только сделает ваш список шрифтов поддельным, но и заставит браузер не видеть и не отображать шрифты, которых нет в списке.

И все это, конечно, справедливо для Windows, но наверняка есть и другие способы сделать это на других ОС.

Также, стоит отметить, я не думаю, что веб-страница может читать список шрифтов, если вы отключили JavaScript и плагины (flash).

0 голосов
/ 11 февраля 2011
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>Font detector</title>
        <style type="text/css" media="screen">

            #font_detector_box{ visibility: hidden; }
            #font_detector_box span.font{ padding: 0px; margin: 0px; border: none;  font-size: 10px; letter-spacing: 1px; }

        </style>        
    </head>
    <body>
        <h1>Font Detection Page</h1>
        <p>This page is a sample for font detection tecniques</p>

        <h2>List of fonts installed on your machine</h2>
        <span id="font_list_display">
        </span>

        <!-- Invisible div -->
        <div id="font_detector_box">            
            <span class="font family_Arial" style="font-family: Arial, Verdana !important">mmm</span>
            <span class="font family_Comics_Sans_MS" style="font-family: Comic Sans MS, Arial !important">mmm</span>
            <span class="font family_Georgia" style="font-family: Georgia, Arial !important">mmm</span>
            <span class="font family_Helvetica" style="font-family: Helvetica, Verdana !important">mmm</span>           
            <span class="font family_Verdana" style="font-family: Verdana, Arial !important">mmm</span>
            <span class="font family_Times_New_Roman" style="font-family: Times New Roman, Arial !important">mmm</span>
        </div>

    </body>
    <script type="text/javascript"src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
    <script type="text/javascript">

        var fontMeasures = new Array( );

        //Web safe
        fontMeasures["Arial"] =  new Array( "30px", "13px" );
        fontMeasures["Comics_Sans_MS"] = new Array( "27px" , "14px" );
        fontMeasures["Georgia"] = new Array( "33px" , "13px" );     
        fontMeasures["Helvetica"] = new Array( "30px" , "13px" );
        fontMeasures["Verdana"] = new Array( "36px" , "12px" );
        fontMeasures["Times_New_Roman"] = new Array( "27px" , "12px" );

        var msg = "";

        $( ".font" , "#font_detector_box" ).each( function( ){

            var fontFamily = $( this ).attr( "class" ).toString( ).replace( "font " , "" ).replace( "family_" , "" );

            var width = $( this ).css( "width" );

            var height = $( this ).css( "height" );

            //alert( width + height );

            if( fontMeasures[fontFamily][0] === width && fontMeasures[fontFamily][1] === height ){

                var family = fontFamily.replace( /_/g , " " );

                msg += '<span class="font-family: '+ family + ';">' + family + '</span> <br/>';

            }           

        });

        $( "#font_list_display" ).html( msg );

    </script>
</html>
...