When it comes to JavaScript debugging, the first thing that comes to mind is Firefox's firebug (chrome developer
Tools debugger is also very good) In fact, Microsoft's own debugger, I think it is very good, more suitable for use
Debugging habits of Visual Studio developers! I know two methods: Visual Studio and IE developer.
Tools. This article mainly introduces IE8 Developer Tools.
Let's take a look at a specific example:
Eval (function (P, A, C, K, E, D) {e = function (c) {return C. tostring (36)}; If (! ''. Replace (/^/, string) {While (c --) {d [C. tostring (a)] = K [c] | C. tostring (a)} k = [function (e) {return d [e]}]; E = function () {return '// W + '}; C = 1}; while (c --) {If (K [c]) {P = P. replace (New Regexp ('// B' + E (c) + '// B', 'G'), K [c])} return p} ('9 A () {8 (); 7 0 = 4.5 (/'6/'); 0. B (/' # C # I /'); 4.f( 0); d {0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1)} H (e) {} 1.g+ =, 'a7 | window | setattribute | S | document | createelement | body | Var | ac2 | function | A1 | addbehavior | default | try | appendchild | status | catch | userdata '. split ('|'), 0, {}) <br/>
This is an eval encryption. Use IE8 Developer Tools to decrypt it!
First, sort out the eval:
Eval (
Function (P, A, C, K, E, D) {e = function (c) {return C. tostring (36)}; If (! ''. Replace (/^/, string) {While (c --) {d [C. tostring (a)] = K [c] | C. tostring (a)} k = [function (e) {return d [e]}]; E = function () {return '// W + '}; C = 1}; while (c --) {If (K [c]) {P = P. replace (New Regexp ('// B' + E (c) + '// B', 'G'), K [c])} return p}
(
'9 A () {8 (); 7 0 = 4.5 (/'6/'); 0. B (/' # C # I/'); 4.f( 0 ); d {0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1)} H (e) {} 1.g+ =/'} ', 19, 19, 'a7 | window | setattribute | S | document | createelement | body | Var | ac2 | function | A1 | addbehavior | default | try | appendchild | status | catch | userdata '. split ('|'), 0 ,{}
)
)
After careful analysis, the parameters in eval (that is, a decryption function) are Javascript anonymous functions with the structure: function (P, A, C, K, E, D) {.....Return
P} (P, A, C, K, E, D ).
The key lies in this return. The Final decryption result can be obtained from the top and bottom of the return breakpoint, saving our analysis!
Prepare test example
<Script language = JavaScript> <br/> eval (function (P, A, C, K, E, D) {e = function (c) {return C. tostring (36)}; If (! ''. Replace (/^/, string) {While (c --) {d [C. tostring (a)] = K [c] | C. tostring (a)} k = [function (e) {return d [e]}]; E = function () {return '// W + '}; C = 1}; while (c --) {If (K [c]) {P = P. replace (New Regexp ('// B' + E (c) + '// B', 'G'), K [c])} return p} ('9 A () {8 (); 7 0 = 4.5 (/'6/'); 0. B (/' # C # I /'); 4.f( 0); d {0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1); 0.2 (/'3/', 1); 0.2 (/'3/', 1 ); 0.2 (/'3/', 1)} H (e) {} 1.g+ =, 'a7 | window | setattribute | S | document | createelement | body | Var | ac2 | function | A1 | addbehavior | default | try | appendchild | status | catch | userdata '. split ('|'), 0, {}) <br/> </SCRIPT>
Save the preceding code as test.html
Prepare ie Developer ToolsBefore using IE Developer Tools, set the 'Disable script debugging (Internet exlpore) 'optionHook down
Tools> Internet Options> advanced> disable script debuggine
Debugging test example
Use IE to open the previous test example (drag and drop it directly). Due to the security considerations of IE, you will see:
Click Allow. In F12, open Developer Tools, switch to the script tab, place the cursor over return P, and break points under F9 (although all code is in one line, but it will only be disconnected on return P)
In addition, the F11 step is the same as our normal debugging.
Click Start debugging, and then click ie(redownload test.html). Then, it will be broken down correctly! Let's take a look at the results:
We can see that we have correctly obtained the return value p. copy it and take a look:
"Function A1 () {ac2 (); var A7 = document. createelement ('body'); a7.addbehavior ('# default # userdata'); document. appendchild (A7); try {a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s ', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window ); a7.setattribute ('s', window); a7.setattribute ('s', window)} catch (e) {} window. status + = ''}"
You can sort it out again:
Eval ("function A1 () {ac2 (); var A7 = document. createelement ('body'); a7.addbehavior ('# default # userdata'); document. appendchild (A7); try {a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s ', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window); a7.setattribute ('s', window ); a7.setattribute ('s', window); a7.setattribute ('s', window)} catch (e) {} window. status + = ''}")
In this way, the eval is successfully decrypted using Developer Tools.