反向设计Javascript对象?

时间:2010-05-24 14:56:15

标签: javascript debugging object reverse-engineering

我有一个Javascript对象,我想传递更多参数,但文档是不存在的。我唯一的选择似乎是对Javascript对象进行反向工程,以查看我可以传递的参数和值。

例如,我想查看对象是否有“zoom”参数以及我可以传递给“mapType”参数的值:

<script type="text/javascript" src="http://maps.google.com/maps?oe=utf-8&amp;file=api&amp;v=2&amp;key=your-gmap-key"></script>
<script type="text/javascript" src="https://share.findmespot.com/spot-widget/js/SpotMain.js"></script>
<script type="text/javascript">
 var widget = new Spot.Ui.LiveWidget({ renderTo: "spot-live-widget",
   feeds: [ "0Wl3diTJcqqvncI6NNsoqJV5ygrFtQfBB" ],
   height: 400,
   width: 500,
   mapType: "physical"
 });
</script>
<div id="spot-live-widget"/>

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:3)

Function#toString

如果调用函数实例的toString方法,大多数Javascript实现都将返回函数的源代码:

function foo() {
    return a;
}
alert(foo.toString()); // Alerts "function foo() { return a; }"

这是非标准行为,但受到广泛支持;您可能会发现它对逆向工程非常有用。在Spot.Ui.LiveWidget函数上调用它可能很有趣,以及绑定到它返回的对象属性的函数。这带给我们......

编辑当然,如果unobfuscated source is available(向肖恩喊出来),你不需要这个......

通过属性循环:for..in

如果它确实是一个Javascript对象,您可以这样做以找出它具有的属性:

var name, own;

for (name in obj) {
    own = obj.hasOwnProperty(name);
    alert(name + " (" + (own ? "own" : "inherited") + ")");
}

这会告诉你它(可枚举)属性的名称,以及它们是实例本身的属性,还是它的原型对象。

for..in示例

function Thingy() {
}
Thingy.prototype.alpha = "a";

var t = new Thingy();
t.beta = "2";

上面的循环会显示:

    alpha (inherited)
    beta (own)

(没有特别的顺序。)

更多信息

可枚举与不可枚举的属性

请注意,并非所有属性都是“可枚举的”。例如,由ArrayString等对象上的规范指定的所有(或几乎所有)属性都是不可枚举的。但直到最近,这只是Javascript实现本身可以完成的事情;没有机制将自己的属性标记为不可枚举。新的第5版规范提供了一种方法,但它尚未广泛支持或使用(尚未)。

不存在的属性

您要查询的对象可能会根据属性存在来改变其行为;在那种情况下,你无法知道,因为一个不存在的属性没有显示在for..in循环中(与存在但具有undefined值的属性不同, )。 E.g:

function doSomething(options) {
    if (options.foo) {
        // There's a `foo` and it has a value; do something with it
}

foo上的options属性可能不存在 ,因此这种逆向工程不会显示代码对它做了什么。

警告

不要在主机对象(例如DOM节点)上尝试上面的for..in循环。它可能在某些实现中有效,但通常不会,在某些情况下(IE6)它会使浏览器崩溃。但是,它对于Javascript对象来说是完全安全的。

答案 1 :(得分:3)

嗯......你可以看一下来源......

您的代码会导致https://share.findmespot.com/spot-widget/js/SpotMain.js 这导致https://share.findmespot.com/spot-widget/js/Spot.js,你使用http://jsbeautifier.org/解压缩,它显示不,它不能在其构造函数中使用'zoom'参数,但它确实有setZoomAndCenter方法

setZoomAndCenter: function (C) {
    var B = new GLatLngBounds;
    for (var A = 0; A < C.length; A++) {
        B.extend(C[A].getPoint())
    }
    this._map.setZoom(this._map.getBoundsZoomLevel(B));
    this._map.setCenter(B.getCenter())
},

从中我们可以看到它有一个'私有'成员_map,它有一个setZoom方法。

这有帮助吗?

<强>更新

上述方法实际上是Spot.Ui.MapRenderer的成员,而不是LiveWidget。

MapRenderer在LiveWidget内部使用,但未公开......

答案 2 :(得分:0)

无法保证配置参数中列出的属性与结果对象的属性相匹配,或者它们将被复制到生成的对象中,即使它们是。

唯一的方法是查看LiveWidget“构造函数”函数中的代码,并查看配置参数所需的属性。