【问题标题】:debugging deobfuscated javascript调试反混淆的 javascript
【发布时间】:2011-05-25 03:52:31
【问题描述】:

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

其中一个文件特别有趣,我们称之为javascript.js。它像这样链接在 HTML 文档中

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

我有

  • 去混淆javascript.js
  • 漂亮的打印代码

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

除了 venkman 之外的任何其他工具都应该可以,只要我仍然可以单步执行反混淆代码。

附加问题(以防万一我遇到这种相关情况):

如果javascript.js 会嵌入到像&lt;script&gt;code&lt;/script&gt; 这样的html 代码中,该怎么做?


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

显然这些问题没有问题,为什么我的问题应该有一个?

我的目标是理解代码,我的问题是关于工具的,例如“指向和单击的位置”或哪个工具可以帮助我(如果 venkman 不能)。

【问题讨论】:

  • 这个问题很简单。 “如何替换代码” 在哪里?您是否尝试将其注入原始网站或其他内容?
  • 我想附录澄清了一些事情
  • 澄清一下,我假设您没有对相关服务器/文件的写入权限...
  • 我当然不会,否则我不会对自己的代码进行反混淆和/或我不会询问如何替换代码...... Doh
  • @Flavius:“我想附录澄清了一些事情” 勉强。不如你花五分钟详细地描述一下你真正想要做的事情。而不是让人猜测。并且没有必要对 tobyodavies 感到厌烦。他正在努力帮助你。

标签: javascript debugging reverse-engineering


【解决方案1】:

您也可以始终使用拦截代理(例如Paros),它允许您以任何您喜欢的方式替换响应的任何部分。所以当浏览器请求 JS 文件时,你可以在 Paros 中捕获响应,将内容替换为你的版本,就大功告成了。我经常将 Paros 用于需要拦截或观察点的其他事情,它非常简单并且在其可能的应用中相当多。这基本上只是运行它并设置浏览器代理设置以在 Paros 正在侦听的端口上的 localhost 上使用代理的问题。然后,您可以告诉 Paros 实际停止并允许您通过选中几个框来编辑请求或响应。希望有帮助。

【讨论】:

  • 确实这是最好的答案。虽然我还没有尝试过,但我会接受它。非常感谢。
  • 顺便说一句,你应该得到更多 +1,因为你已经跳出框框思考这个简单的事实。
【解决方案2】:

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

在您使用的任何浏览器上使用 GreaseMonkey 或 Chrome 扩展程序或类似功能,我希望它能够检测到页面加载脚本 X 并将其替换为您的本地脚本 Y。这些东西在那个级别运行,他们参与这个过程。

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

我可能会尽力记录(通过 Firebug 或 Chrome/Safari 的开发工具等)示例 ajax 交互,而不是在他们的网站上进行调试,然后在我自己的本地服务器上设置一个虚拟页面会简单地呼应这种交互、播放风格。然后,您可以随心所欲地进行试验,而不必冒险在相关站点上扔奇怪的东西。我认为我以这种方式玩弄别人的网站是不道德的,无论他们是否应该能够处理它。

【讨论】:

  • 好的,我去看看 XUL 和 XPCOM。
【解决方案3】:

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

方式 2: 我已经设法在没有 jQuery 的页面(例如 @987654321 @) - 自己试试,复制粘贴到地址栏等页面消失即可:)

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2023-03-13
    • 2020-12-04
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多