簡體   English   中英

對Javascript對象進行逆向工程?

[英]Reverse-engineer a Javascript object?

我有一個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"/>

關於如何做到這一點的任何想法?

Function#toString

如果調用函數實例的toString方法,大多數Javascript實現將返回函數的源代碼:

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

這是非標准行為,但得到廣泛支持; 您可能會發現它對逆向工程非常有用。 Spot.Ui.LiveWidget函數上以及在綁定到它返回的對象的屬性的函數上調用它可能會很有趣。 這帶我們去...

編輯當然,如果可以使用未混淆的源 (向Sean喊叫),則不需要此源...

for..in屬性: 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值的屬性不同)。 例如:

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對象來說,這是完全安全的。

好吧...你可以看看源頭...

您的代碼指向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方法。

這有幫助嗎?

UPDATE

上面的方法實際上是Spot.Ui.MapRenderer的成員,而不是LiveWidget的成員。

MapRenderer由LiveWidget內部使用,但未公開...

無法保證配置參數中列出的屬性將與結果對象的屬性匹配,或者即使將它們復制到結果對象,也無法保證。

找出此問題的唯一方法是查看LiveWidget“構造函數”函數中的代碼,並查看其對配置參數的期望屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM