File size: 3,287 Bytes
dcbb08f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26f7d9f
dcbb08f
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const puppeteer = require('puppeteer');

async function deobfuscateCode(code) {
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
  });

  try {
    const page = await browser.newPage();
    
    await page.goto('https://obf-io.deobfuscate.io/', {
      waitUntil: 'domcontentloaded',
      timeout: 30000
    });
    
    await new Promise(resolve => setTimeout(resolve, 2000));
    
    await page.waitForSelector('.cm-content', { timeout: 15000 });
    
    await page.evaluate((inputCode) => {
      const editors = document.querySelectorAll('.cm-content[contenteditable="true"]');
      if (editors.length > 0) {
        const editor = editors[0];
        editor.focus();
        document.execCommand('selectAll', false, null);
        document.execCommand('insertText', false, inputCode);
      }
    }, code);
    
    await new Promise(resolve => setTimeout(resolve, 1500));
    
    const buttonClicked = await page.evaluate(() => {
      const buttons = Array.from(document.querySelectorAll('button'));
      const deobfButton = buttons.find(btn => btn.textContent.includes('Deobfuscate'));
      if (deobfButton) {
        deobfButton.click();
        return true;
      }
      return false;
    });
    
    if (!buttonClicked) {
      throw new Error('Deobfuscate button not found');
    }
    
    await new Promise(resolve => setTimeout(resolve, 5000));
    
    await page.waitForFunction(() => {
      const editors = document.querySelectorAll('.cm-content[contenteditable="true"]');
      return editors.length > 1 && editors[1].textContent.trim().length > 0;
    }, { timeout: 15000 }).catch(() => {});
    
    const result = await page.evaluate(() => {
      const editors = document.querySelectorAll('.cm-content[contenteditable="true"]');
      if (editors.length > 1) {
        const outputEditor = editors[1];
        let text = '';
        const lines = outputEditor.querySelectorAll('.cm-line');
        lines.forEach((line, index) => {
          text += line.textContent;
          if (index < lines.length - 1) text += '\n';
        });
        return text.trim();
      }
      return null;
    });
    
    if (!result) {
      throw new Error('No result found');
    }
    
    return result;
    
  } finally {
    await browser.close();
  }
}

const handler = async (req, res) => {
  try {
    const { code } = req.body;

    if (!code) {
      return res.status(400).json({
        success: false,
        error: 'Missing required parameter: code'
      });
    }

    const deobfuscatedCode = await deobfuscateCode(code);

    res.json({
      author: "Herza",
      success: true,
      result: {
        original_length: code.length,
        deobfuscated_length: deobfuscatedCode.length,
        code: deobfuscatedCode
      }
    });

  } catch (error) {
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
};

module.exports = {
  name: 'JavaScript Deobfuscator',
  description: 'Deobfuscate obfuscated JavaScript code using obf-io.deobfuscate.io',
  type: 'POST',
  routes: ['api/tools/deobfuscate'],
  tags: ['tools', 'javascript', 'deobfuscate', 'code'],
  main: ['tools'],
  parameters: ['code'],
  enabled: true,
  limit: 2,
  handler
};