отладка деобфусцированного JavaScript - PullRequest
1 голос
/ 14 декабря 2010

Я пытаюсь перепроектировать веб-сайт, которым я не владею, выясняя, как работает какое-то тупое «шифрование», чтобы можно было выполнять некоторые операции автоматически, перенося функциональность за пределы браузера.

Один из файлов представляет особый интерес, назовем его javascript.js. Это связано в HTML-документе, как это

<script src="/javascript.js" type="text/javascript"></script>

У меня есть

  • деобфусцировано javascript.js
  • красиво напечатал свой код

Мой вопрос сейчас, учитывая, что я использую venkman и firefox, как заменить на месте обфусцированный javascript.js своим собственным довольно напечатанным кодом, чтобы узнать, как он работает.

Любой другой инструмент, кроме Venkman, должен подойти, если я еще смогу пройти через деобфусцированный код.

Дополнительный вопрос (на случай, если я смогу пересечь эту связанную ситуацию):

Как сделать то же самое, если javascript.js будет встроен в HTML-код, например <script>code</script>?


Для тех из вас, кто интересуется, насколько это законно, мой вопрос не первый о реверс-инжиниринге в SO: https://stackoverflow.com/questions/tagged/reverse-engineering

Видимо, нет проблем с этими вопросами, почему должен быть один с моим?

Моя цель состоит в том, чтобы понять код И мой вопрос касается ИНСТРУМЕНТОВ, например, «где указывать и щелкать» или какой инструмент может мне помочь (если venkman не может).

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

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

1 голос
/ 14 декабря 2010

Это будет очень сложно, если не невозможно, обойтись без использования функций отладки / расширения браузера, таких как GreaseMonkey или Chrome Extension API.Причина в том, что если вы не будете вовлечены в последовательность загрузки страницы, запутанный код уже будет запущен, настроив объекты JavaScript, обработчики событий и т. Д., И т. Д., И т. Д. Вы должны убедиться, что ваш новый скрипт замененте объекты и обработчики событий, которые были бы сложными и трудными.

С GreaseMonkey или Chrome Extensions или аналогичными в любом браузере, который вы используете, я бы ожидал, что будет возможно обнаружить скрипт загрузки страницы X изамените его своим локальным сценарием Y. Эти вещи выполняются на том уровне, они вовлекаются в процесс.

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

Вместо отладки на своем сайтеЯ, вероятно, приложу все усилия, чтобы записать (через Firebug или Chrome / Safari Dev Tools и т. Д.) Пример взаимодействия ajax, а затем настроить фиктивную страницу на моем собственном локальном сервере, которая бы просто отражала это взаимодействие, стиль воспроизведения.Тогда вы можете поэкспериментировать с душой, не рискуя бросать странные вещи на данный сайт.Я бы посчитал неэтичным для меня играть таким образом с чужим сайтом, независимо от того, смогут ли они справиться с этим или нет.

0 голосов
/ 14 декабря 2010

Путь 1 : Экспортируйте веб-страницу, которая использует код, на ваш диск (я точно знаю, что Opera, Firefox и Chrome поддерживают это - ctrl + s - обязательно сохраните весь контент). Они загружают весь связанный контент (CSS, скрипты, изображения) и фиксируют URL-адреса, чтобы загруженные загружались. Затем замените файл javascript, который вы хотите отладить, и откройте загруженный html в браузере, скажите firefox с firebug и начните отладку. Это должно работать, если страница не сильно отлажена.

Путь 2 : Мне удалось заставить это работать в Google Chrome ( v8.0.552.215 - мне нужно обновить BTW) на странице, где нет jQuery (например, w3c .org ) - попробуйте сами, просто скопируйте и вставьте его в адресную строку и подождите, пока страница не исчезнет:)

javascript:(eval("var script=document.createElement('script');script.src='http://code.jquery.com/jquery-1.4.4.min.js'; document.getElementsByTagName('head')[0].appendChild(script);window.setTimeout(\"$('body').fadeOut(5000);\", 2000)"));

Сценарий отображается в разделе сценариев консоли ( CTRL + SHIFT + J ), и вы можете установить точки останова. Так что-то вроде этого должно работать (не стесняйтесь изменять):

javascript:(eval("for (var allsuspects=document.getElementsByTagName('script'), i=allsuspects.length, oldfile=prompt('Remove script src:'); oldfile && i>=0; i--)   if (allsuspects[i] && allsuspects[i].getAttribute('src')!=null && allsuspects[i].getAttribute('src').indexOf(oldfile)!=-1)      allsuspects[i].parentNode.removeChild(allsuspects[i]);var script=document.createElement('script');script.src = prompt('Inject script src:');document.getElementsByTagName('head')[0].appendChild(script);"));

Сценарий расширен и объяснен:

for (var allsuspects=document.getElementsByTagName('script'), i=allsuspects.length, oldfile=prompt('Remove script src:'); oldfile && i>=0; i--) 
  if (allsuspects[i] && allsuspects[i].getAttribute('src')!=null && allsuspects[i].getAttribute('src').indexOf(oldfile)!=-1)
    allsuspects[i].parentNode.removeChild(allsuspects[i]); // remove old script
var script=document.createElement('script'); // inject new script
script.src = prompt('Inject script src:');
document.getElementsByTagName('head')[0].appendChild(script);

Скрипт работает только в Chrome (может, в Safari тоже?). Я пробовал Firefox, IE и Opera, но ни один из них не работал. Я полагаю, что также может быть проблема, если файл недоступен онлайн (если вы используете, вы используете 'file: //').


ОБНОВЛЕНИЕ : также работает в Chrome v8.0.552.224

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...