调试反混淆的javascript

时间:2010-12-14 09:09:04

标签: javascript debugging reverse-engineering

我正在尝试对一个我不拥有的网站进行逆向工程,弄清楚一些愚蠢的“加密”是如何工作的,以便能够通过浏览器之外的功能自动执行某些操作。

其中一个文件特别有意义,我们称之为javascript.js。它链接在HTML文档中,如

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

我有

  • deobfuscated javascript.js
  • 漂亮地打印了它的代码

现在我的问题是,考虑到我正在使用venkman和firefox,如何用我自己漂亮的代码替换现场混淆的javascript.js,以了解它是如何工作的。

Venkman旁边的任何其他工具都应该这样做,只要我仍然可以逐步执行反混淆代码。

其他问题(以防我可能会遇到这种相关情况):

如果在javascript.js这样的html代码中内联<script>code</script>,该如何做同样的事情?


对于那些想知道这是多么合法的人,我的问题不是第一个关于反向工程的问题:https://stackoverflow.com/questions/tagged/reverse-engineering

显然这些问题没有问题,为什么要跟我一起?

我的目标是理解代码我的问题是关于TOOLS,如“在哪里指向并点击”或哪个工具可以帮助我(如果venkman不能)。

3 个答案:

答案 0 :(得分:3)

您也可以使用拦截代理(类似Paros),这样您就可以按照自己喜欢的方式替换响应的任何部分。因此,当浏览器请求JS文件时,您可以在Paros中捕获响应,用您的版本替换内容,然后就完成了。我经常将Paros用于我需要拦截或观察点的其他东西,并且它在其可能的应用程序中非常简单且数量众多。它基本上只是运行它并将浏览器代理设置设置为在Paros正在侦听的端口上使用localhost上的代理。然后,您可以通过选中几个框来告诉Paros实际停止并允许您编辑请求或响应。希望有所帮助。

答案 1 :(得分:1)

如果不使用浏览器调试/扩展功能(如GreaseMonkey或Chrome的Extension API),这将是非常困难的,如果不是不可能的话。原因是,如果您没有参与页面加载序列,则已经运行了混淆代码,设置了JavaScript对象,事件处理程序等等。您必须确保更换新脚本那些对象和事件处理程序,这将是复杂和困难的。

使用GreaseMonkey或Chrome扩展程序或类似的浏览器,我希望可以检测页面加载脚本X并将其替换为您的本地脚本Y.这些东西在该级别运行,它们是参与这个过程。

但是,尽管你的目标是高于一切,在其他人的网站上调试是一个坏主意 。如果您通过反混淆过程引入了一个错误,或者在尝试理解代码的过程中,那么至少可能浪费时间在另一端。对于试图在我运行的网站上进行此操作的人,我不会满意。 (也就是说,一个站点应该能够处理客户端抛出的任何,因为你不能相信来自客户端的任何东西。)

我可能会尽力记录(通过Firebug或Chrome / Safari的Dev Tools等)ajax示例交互,然后在我自己的本地服务器上设置一个虚拟页面,而不是在他们的网站上进行调试。只会回应那种互动,回放风格。然后你可以试验你的心脏的内容,而不用担心在有问题的网站上扔怪异的东西。我认为与其他人的网站以这种方式玩游戏是不道德的,无论他们是否应该能够处理它。

答案 2 :(得分:0)

方式1 : 将使用该代码的网页导出到您的驱动器(我知道Opera,Firefox和Chrome支持这一点 - ctrl + s - 确保保存所有内容)。他们下载所有链接的内容(css,脚本,图像),并修复网址,以便加载下载的内容。然后替换你想调试的javascript文件,在浏览器中打开下载的html,用firebug说firefox,然后开始调试。这应该有效,除非页面被大量滥用。

方式2 : 我已经设法在没有jQuery的页面上使用谷歌浏览器 v8.0.552.215 - 我需要更新BTW)(例如{{ 3}}) - 自己尝试一下,只需将其粘贴到地址栏中并等待页面消失:)

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,但是 none 都有效。我猜想如果文件不在线可用也可能存在问题(如果您使用'file://')。


更新:也适用于Chrome v8.0.552.224