MichaelXF / js-confuser

JS-Confuser is a JavaScript obfuscation tool to make your programs *impossible* to read.
https://js-confuser.com
MIT License
204 stars 32 forks source link

feat: convert while loops to for loops #92

Closed Le0Developer closed 4 days ago

Le0Developer commented 1 year ago

Is your feature request related to a problem? Please describe. Would make reverse engineering a tiny bit harder.

Describe the solution you'd like

// before
while(cond) { /* ... */ }
// after
for(;cond;) { /* ... */ }
// or with dead code, to make it less obvious
for(let _temp = 0; _temp >= 0 && cond; _temp+) { /* ... */ }
MichaelXF commented 1 year ago

Hi this is already done with Control Flow Flattening

// Input
while(cond) { /* ... */ }

var filler1;
var filler2;

// Output 
var C9ao9H = -657;
var jp6fQY = 409;
var CBsxum = 343;
var XAx1z8 = 40;
var vi13y9_ = {
    'n': function () {
        typeof (vi13y9_['a'] = cond, vi13y9_['h']());
        return 'l';
    },
    'H': function () {
        !(vi13y9_['a'] = cond, XAx1z8 += -70, vi13y9_['b'] = false);
        return 'F';
    },
    'aj': -398,
    'P': function (XAx1z8 = vi13y9_['K'] == -777) {
        if (!XAx1z8) {
            return C9ao9H == -2;
        }
        return C9ao9H += 57, jp6fQY += vi13y9_['O'], CBsxum += -92;
    },
    'Y': function (jp6fQY = CBsxum == -55) {
        if (jp6fQY) {
            return vi13y9_;
        }
        return C9ao9H += vi13y9_['Q'] == 67 ? vi13y9_['X'] : -57;
    },
    'J': 852,
    'ab': 768,
    'Q': 686,
    't': function () {
        return CBsxum *= 2, CBsxum -= 145;
    },
    'h': function (jp6fQY = XAx1z8 == vi13y9_['i']) {
        if (jp6fQY) {
            return 'j';
        }
        return C9ao9H += -50, vi13y9_['g'](), XAx1z8 += -70, vi13y9_['b'] = false;
    },
    'an': function () {
        return CBsxum += 99;
    },
    'g': () => {
        return CBsxum += jp6fQY == -56 ? 'e' : 99;
    },
    'u': function (jp6fQY = C9ao9H == 521) {
        if (!jp6fQY) {
            return vi13y9_['w']();
        }
        return CBsxum *= 2, CBsxum -= 435;
    },
    's': 37,
    'ao': 429,
    'af': function () {
        return C9ao9H += 0;
    },
    'O': -105,
    'i': -33,
    'U': function () {
        return CBsxum += -92;
    },
    'ap': 1033,
    'z': function (Mp_d3Mm = vi13y9_['i'] == 343) {
        if (Mp_d3Mm) {
            return arguments;
        }
        if (XAx1z8 == C9ao9H + 667) {
            void (C9ao9H += 1178, jp6fQY += C9ao9H + -1184, vi13y9_['u'](), XAx1z8 += -438);
            return 'x';
        }
        C9ao9H += CBsxum + -306;
        return 'x';
    },
    'K': -777,
    'N': function () {
        return XAx1z8 += CBsxum == 70 ? vi13y9_['M'] : 154;
    },
    'ai': () => {
        return C9ao9H += jp6fQY == -21 ? 53 : -1235;
    },
    'd': () => {
        return C9ao9H *= CBsxum + -237, C9ao9H -= -1661;
    },
    ['aw']: function (vi13y9_, jp6fQY) {
        return vi13y9_['c'] ? 231 : jp6fQY != -254 && jp6fQY - -466;
    },
    ['ax']: function (vi13y9_) {
        return vi13y9_['b'] ? -531 : 102;
    },
    ['ay']: function (XAx1z8) {
        return XAx1z8 - -95;
    }
};
while (C9ao9H + jp6fQY + CBsxum + XAx1z8 != 15) {
    switch (C9ao9H + jp6fQY + CBsxum + XAx1z8) {
    case 118:
    case 817:
    case 905:
    case 623:
        var Mp_d3Mm;
        typeof (vi13y9_['d'](), jp6fQY += -768, CBsxum += 12, XAx1z8 += -438);
        break;
    case 53:
    case 177:
    case 354:
        void (C9ao9H += CBsxum + (jp6fQY + 314), XAx1z8 += -368, vi13y9_['c'] = false);
        break;
    case 353:
    case 841:
    case 23:
    case 149:
        vi13y9_['N']();
        break;
    case 980:
    case C9ao9H - 441:
        if (false) {
            !(vi13y9_['af'](), jp6fQY += 0, CBsxum += 0, XAx1z8 += 0);
            break;
        }
        typeof (jp6fQY = -105, vi13y9_['ai'](), jp6fQY += CBsxum + (vi13y9_['aj'] == -398 ? 452 : 18), vi13y9_['an'](), XAx1z8 += 438);
        break;
    case 166:
    case 113:
    default:
        typeof (C9ao9H += -1141, jp6fQY += 777, XAx1z8 += 438);
        break;
    case 123:
        if (vi13y9_['n']() == 'l') {
            break;
        }
    case 172:
        if (vi13y9_['H']() == 'F') {
            break;
        }
    case 34:
    case 798:
    case 437:
        void (vi13y9_ = undefined, CBsxum = 56, C9ao9H += -57, jp6fQY += XAx1z8 + vi13y9_['ao'], CBsxum *= 2, CBsxum -= XAx1z8 + (XAx1z8 + vi13y9_['ap']));
        break;
    case 36:
        !(vi13y9_['a'] = vi13y9_['r'] = cond, C9ao9H += vi13y9_['s'], vi13y9_['t'](), XAx1z8 += -70, vi13y9_['b'] = false);
        break;
    case 212:
    case 110:
    case 369:
        if (false) {
            vi13y9_['P']();
            break;
        }
        var sHhWPd;
        vi13y9_['U']();
        break;
    case 342:
    case 72:
    case 584:
    case 133:
        !(C9ao9H = 109, vi13y9_['Y'](), jp6fQY += 105, CBsxum += 92);
        break;
    case 498:
    case vi13y9_['ax'](vi13y9_):
        if ((XAx1z8 == -30 ? vi13y9_ : undefined)['a']) {
            void (C9ao9H += vi13y9_['J'], jp6fQY += vi13y9_['K'], XAx1z8 += -154);
            break;
        }
        !(C9ao9H += 1141, jp6fQY += -663, XAx1z8 += -368);
        break;
    case 120:
    case 117:
    case 709:
        var Mp_d3Mm;
        jp6fQY += -105;
        break;
    case vi13y9_['ay'](XAx1z8):
        delete vi13y9_['as'];
        if (vi13y9_['z']() == 'x') {
            break;
        }
    case 1:
    case 92:
    case 121:
    case 65:
        void (jp6fQY = -150, C9ao9H += -1198, jp6fQY += vi13y9_['ab'], CBsxum += CBsxum + -145, XAx1z8 += vi13y9_['s'] == 409 ? vi13y9_['ae'] : 368, vi13y9_['b'] = false);
        break;
    }
}

There is a requirement of 3 or more statements for Control Flow Flattening to apply. Maybe this could change?

MichaelXF commented 4 days ago

Closing for now