LittleBigSnake Cheat Engiene

find and edit any game memory value

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         LittleBigSnake Cheat Engiene
// @namespace    http://tampermonkey.net/
// @version      2026-04-08
// @description  find and edit any game memory value
// @author       You
// @match        https://littlebigsnake.com/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=littlebigsnake.com
// @grant        none
// ==/UserScript==

(function() {
    let foundAddresses = [];
    let cheatTable = [];
    let currentHeapView = 'All';
    let isInputActive = false;
    let unityInst = null;

    function getUnityInstance() {
        if (window.UnityBridge.unityInstance && window.UnityBridge.unityInstance.Module) return window.UnityBridge.unityInstance.Module;
        if (window.Module) return window.Module;
        return null;
    }

    const heapTypes = {
        All: { view: null, type: 'all', getter: (addr, type) => { return null; } },
        HEAP8: { view: 'HEAP8', type: 'Int8', getter: (addr, module) => module.HEAP8[addr] },
        HEAPU8: { view: 'HEAPU8', type: 'Uint8', getter: (addr, module) => module.HEAPU8[addr] },
        HEAP16: { view: 'HEAP16', type: 'Int16', getter: (addr, module) => module.HEAP16[addr] },
        HEAPU16: { view: 'HEAPU16', type: 'Uint16', getter: (addr, module) => module.HEAPU16[addr] },
        HEAP32: { view: 'HEAP32', type: 'Int32', getter: (addr, module) => module.HEAP32[addr] },
        HEAPU32: { view: 'HEAPU32', type: 'Uint32', getter: (addr, module) => module.HEAPU32[addr] },
        HEAPF32: { view: 'HEAPF32', type: 'Float32', getter: (addr, module) => module.HEAPF32[addr] },
        HEAPF64: { view: 'HEAPF64', type: 'Float64', getter: (addr, module) => module.HEAPF64[addr] }
    };

    const style = document.createElement('style');
    style.innerHTML = `
        #ce-menu { position: fixed; top: 50px; right: 50px; width: 500px; background: #f0f0f0; border: 2px solid #666; z-index: 10000; font-family: 'Segoe UI', Tahoma, sans-serif; font-size: 12px; color: black; display: flex; flex-direction: column; box-shadow: -5px 0 15px rgba(0,0,0,0.3); resize: both; overflow: auto; min-width: 300px; min-height: 400px; }
        .ce-header { background: linear-gradient(to bottom, #eee, #ccc); padding: 5px; border-bottom: 1px solid #999; font-weight: bold; display: flex; justify-content: space-between; cursor: move; }
        .ce-header-buttons { display: flex; gap: 5px; }
        .ce-collapse-btn { cursor: pointer; padding: 0 5px; }
        .ce-collapse-btn:hover { background: rgba(0,0,0,0.1); }
        .ce-main-controls { padding: 10px; display: flex; gap: 10px; border-bottom: 1px solid #ccc; flex-wrap: wrap; }
        .ce-scan-area { flex: 2; }
        .ce-heap-select { flex: 1; }
        .ce-list-container { flex: 1; overflow: auto; background: white; border: 1px solid #999; margin: 5px; min-height: 150px; max-height: 300px; }
        .ce-table { width: 100%; border-collapse: collapse; cursor: default; table-layout: fixed; }
        .ce-table th { background: #e1e1e1; position: sticky; top: 0; border: 1px solid #ccc; padding: 2px; text-align: left; }
        .ce-table td { border: 1px solid #eee; padding: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px; }
        .ce-table tr:hover { background: #e8f2ff; }
        .ce-footer-table { max-height: 200px; border-top: 2px solid #666; }
        button { cursor: pointer; padding: 3px 8px; }
        input[type="text"], select { border: 1px solid #999; padding: 2px; width: 100%; }
        .ce-found-count { font-size: 10px; color: #444; }
    `;
    document.head.appendChild(style);

    const container = document.createElement('div');
    container.id = 'ce-menu';
    container.innerHTML = `
        <div class="ce-header">
            <span>Cheat Engine JS</span>
            <div class="ce-header-buttons">
                <span class="ce-collapse-btn">_</span>
            </div>
        </div>
        <div class="ce-content">
            <div class="ce-main-controls">
                <div class="ce-scan-area">
                    <input type="text" id="ce-scan-val" style="width:100%" placeholder="Value...">
                    <div style="margin-top:5px; display:flex; gap:5px;">
                        <button id="ce-new-scan">New Scan</button>
                        <button id="ce-next-scan">Next Scan</button>
                    </div>
                </div>
                <div class="ce-heap-select">
                    <select id="ce-heap-view">
                        <option value="All" selected>All Variables</option>
                        <option value="HEAP8">HEAP8 (Int8)</option>
                        <option value="HEAPU8">HEAPU8 (Uint8)</option>
                        <option value="HEAP16">HEAP16 (Int16)</option>
                        <option value="HEAPU16">HEAPU16 (Uint16)</option>
                        <option value="HEAP32">HEAP32 (Int32)</option>
                        <option value="HEAPU32">HEAPU32 (Uint32)</option>
                        <option value="HEAPF32">HEAPF32 (Float32)</option>
                        <option value="HEAPF64">HEAPF64 (Float64)</option>
                    </select>
                </div>
            </div>
            <div style="padding:0 10px;"><span class="ce-found-count">Found: <span id="ce-count">0</span></span></div>
            <div class="ce-list-container">
                <table class="ce-table"><thead id="ce-results-head"><tr><th>Address</th><th>Value</th></tr></thead><tbody id="ce-results-body"></tbody></table>
            </div>
            <div class="ce-list-container ce-footer-table">
                <table class="ce-table"><thead><tr><th>Frozen</th><th>Description</th><th>Address</th><th>Value</th></tr></thead><tbody id="ce-table-body"></tbody></table>
            </div>
        </div>
    `;
    document.body.appendChild(container);

    function getModule() {
        let module = getUnityInstance();
        if (!module) {
            console.warn('Unity Module not found, trying window.Module');
            module = window.Module;
        }
        return module;
    }

    function scanHeap(target) {
        let results = [];
        let targetVal = isNaN(target) ? target : Number(target);
        let heapView = currentHeapView;
        let module = getModule();

        if (!module) {
            console.error('Unity Module not available');
            return results;
        }

        if (heapView === 'All') {
            let maxLen = module.HEAP32 ? module.HEAP32.length : 0;
            for (let i = 0; i < maxLen; i++) {
                try {
                    if (module.HEAP8 && module.HEAP8[i] == targetVal) results.push({ addr: i, heap: 'HEAP8', val: module.HEAP8[i] });
                    if (module.HEAPU8 && module.HEAPU8[i] == targetVal) results.push({ addr: i, heap: 'HEAPU8', val: module.HEAPU8[i] });
                    if (i % 2 === 0) {
                        if (module.HEAP16 && module.HEAP16[i/2] == targetVal) results.push({ addr: i, heap: 'HEAP16', val: module.HEAP16[i/2] });
                        if (module.HEAPU16 && module.HEAPU16[i/2] == targetVal) results.push({ addr: i, heap: 'HEAPU16', val: module.HEAPU16[i/2] });
                    }
                    if (i % 4 === 0) {
                        if (module.HEAP32 && module.HEAP32[i/4] == targetVal) results.push({ addr: i, heap: 'HEAP32', val: module.HEAP32[i/4] });
                        if (module.HEAPU32 && module.HEAPU32[i/4] == targetVal) results.push({ addr: i, heap: 'HEAPU32', val: module.HEAPU32[i/4] });
                        if (module.HEAPF32 && module.HEAPF32[i/4] == targetVal) results.push({ addr: i, heap: 'HEAPF32', val: module.HEAPF32[i/4] });
                    }
                    if (i % 8 === 0 && module.HEAPF64 && module.HEAPF64[i/8] == targetVal) results.push({ addr: i, heap: 'HEAPF64', val: module.HEAPF64[i/8] });
                } catch(e) {}
            }
        } else {
            let view = heapTypes[heapView];
            if (!view || !module[view.view]) return results;
            let heap = module[view.view];
            let byteMultiplier = 1;
            if (heapView === 'HEAP16' || heapView === 'HEAPU16') byteMultiplier = 2;
            else if (heapView === 'HEAP32' || heapView === 'HEAPU32' || heapView === 'HEAPF32') byteMultiplier = 4;
            else if (heapView === 'HEAPF64') byteMultiplier = 8;

            for (let i = 0; i < heap.length; i++) {
                try {
                    if (heap[i] == targetVal) results.push({ addr: i * byteMultiplier, heap: heapView, val: heap[i] });
                } catch(e) {}
            }
        }
        return results;
    }

    function filterHeapScan(target, previousResults) {
        let results = [];
        let targetVal = isNaN(target) ? target : Number(target);
        let module = getModule();

        if (!module) return results;

        previousResults.forEach(prev => {
            try {
                let currentVal = heapTypes[prev.heap].getter(prev.addr, module);
                if (currentVal == targetVal) results.push(prev);
            } catch(e) {}
        });
        return results;
    }

    function updateResults() {
        const body = document.getElementById('ce-results-body');
        body.innerHTML = '';
        let module = getModule();
        if (!module) return;

        foundAddresses.slice(0, 100).forEach(addr => {
            const tr = document.createElement('tr');
            let currentVal = heapTypes[addr.heap].getter(addr.addr, module);
            tr.innerHTML = `<td>${addr.heap}:${addr.addr}</td><td>${currentVal}</td>`;
            tr.onclick = () => addToTable(addr);
            body.appendChild(tr);
        });
        document.getElementById('ce-count').innerText = foundAddresses.length;
    }

    function addToTable(addrInfo) {
        if (!cheatTable.find(i => i.heap === addrInfo.heap && i.addr === addrInfo.addr)) {
            let module = getModule();
            cheatTable.push({ heap: addrInfo.heap, addr: addrInfo.addr, frozen: false, value: heapTypes[addrInfo.heap].getter(addrInfo.addr, module) });
            renderTable();
        }
    }

    function renderTable() {
        const body = document.getElementById('ce-table-body');
        body.innerHTML = '';
        let module = getModule();
        if (!module) return;

        cheatTable.forEach((item, index) => {
            const tr = document.createElement('tr');
            let currentVal = heapTypes[item.heap].getter(item.addr, module);
            tr.innerHTML = `
                <td style="text-align:center"><input type="checkbox" ${item.frozen ? 'checked' : ''} onchange="window._ce_freeze(${index}, this.checked)"></td>
                <td>No description</td>
                <td style="word-break:break-all;white-space:normal">${item.heap}:${item.addr}</td>
                <td style="color:blue; cursor:pointer" onclick="window._ce_edit(${index})">${currentVal}</td>
            `;
            body.appendChild(tr);
        });
    }

    window._ce_freeze = (idx, val) => {
        let module = getModule();
        cheatTable[idx].frozen = val;
        cheatTable[idx].value = heapTypes[cheatTable[idx].heap].getter(cheatTable[idx].addr, module);
    };

    window._ce_edit = (idx) => {
        let module = getModule();
        const newVal = prompt("Enter new value:", heapTypes[cheatTable[idx].heap].getter(cheatTable[idx].addr, module));
        if (newVal !== null) {
            let numVal = isNaN(newVal) ? newVal : Number(newVal);
            let heap = cheatTable[idx].heap;
            let addr = cheatTable[idx].addr;
            if (heap === 'HEAP8') module.HEAP8[addr] = numVal;
            else if (heap === 'HEAPU8') module.HEAPU8[addr] = numVal;
            else if (heap === 'HEAP16') module.HEAP16[addr/2] = numVal;
            else if (heap === 'HEAPU16') module.HEAPU16[addr/2] = numVal;
            else if (heap === 'HEAP32') module.HEAP32[addr/4] = numVal;
            else if (heap === 'HEAPU32') module.HEAPU32[addr/4] = numVal;
            else if (heap === 'HEAPF32') module.HEAPF32[addr/4] = numVal;
            else if (heap === 'HEAPF64') module.HEAPF64[addr/8] = numVal;
            renderTable();
        }
    };

    setInterval(() => {
        let module = getModule();
        if (!module) return;

        cheatTable.forEach(item => {
            if (item.frozen) {
                let heap = item.heap;
                let addr = item.addr;
                if (heap === 'HEAP8') module.HEAP8[addr] = item.value;
                else if (heap === 'HEAPU8') module.HEAPU8[addr] = item.value;
                else if (heap === 'HEAP16') module.HEAP16[addr/2] = item.value;
                else if (heap === 'HEAPU16') module.HEAPU16[addr/2] = item.value;
                else if (heap === 'HEAP32') module.HEAP32[addr/4] = item.value;
                else if (heap === 'HEAPU32') module.HEAPU32[addr/4] = item.value;
                else if (heap === 'HEAPF32') module.HEAPF32[addr/4] = item.value;
                else if (heap === 'HEAPF64') module.HEAPF64[addr/8] = item.value;
            }
        });
        if (cheatTable.length > 0) renderTable();
    }, 100);

    document.getElementById('ce-new-scan').onclick = () => {
        let searchVal = document.getElementById('ce-scan-val').value;
        if (searchVal === '') return;
        foundAddresses = scanHeap(searchVal);
        updateResults();
    };

    document.getElementById('ce-next-scan').onclick = () => {
        if (foundAddresses.length > 0) {
            let searchVal = document.getElementById('ce-scan-val').value;
            if (searchVal === '') return;
            foundAddresses = filterHeapScan(searchVal, foundAddresses);
            updateResults();
        }
    };

    document.getElementById('ce-heap-view').onchange = (e) => {
        currentHeapView = e.target.value;
    };

    let isDragging = false;
    let dragOffsetX, dragOffsetY;
    const header = container.querySelector('.ce-header');
    header.addEventListener('mousedown', (e) => {
        if (e.target.classList.contains('ce-collapse-btn')) return;
        isDragging = true;
        dragOffsetX = e.clientX - container.offsetLeft;
        dragOffsetY = e.clientY - container.offsetTop;
        container.style.position = 'fixed';
        container.style.margin = '0';
    });
    document.addEventListener('mousemove', (e) => {
        if (isDragging) {
            container.style.left = (e.clientX - dragOffsetX) + 'px';
            container.style.top = (e.clientY - dragOffsetY) + 'px';
            container.style.right = 'auto';
        }
    });
    document.addEventListener('mouseup', () => { isDragging = false; });

    const collapseBtn = container.querySelector('.ce-collapse-btn');
    const contentDiv = container.querySelector('.ce-content');
    collapseBtn.addEventListener('click', () => {
        if (contentDiv.style.display === 'none') {
            contentDiv.style.display = 'flex';
            collapseBtn.textContent = '_';
        } else {
            contentDiv.style.display = 'none';
            collapseBtn.textContent = '□';
        }
    });

    const inputField = document.getElementById('ce-scan-val');
    inputField.addEventListener('focus', () => { isInputActive = true; });
    inputField.addEventListener('blur', () => { isInputActive = false; });

    document.addEventListener('keydown', (event) => {
        if (!isInputActive) return;
        if (event.key === 'Escape') return;

        const input = document.getElementById('ce-scan-val');
        const start = input.selectionStart;
        const end = input.selectionEnd;
        let currentValue = input.value;

        if (event.key === 'Backspace') {
            event.preventDefault();
            if (start === end && start > 0) {
                input.value = currentValue.slice(0, start - 1) + currentValue.slice(end);
                input.setSelectionRange(start - 1, start - 1);
            } else if (start !== end) {
                input.value = currentValue.slice(0, start) + currentValue.slice(end);
                input.setSelectionRange(start, start);
            }
        } else if (event.key === 'Delete') {
            event.preventDefault();
            if (start === end && start < currentValue.length) {
                input.value = currentValue.slice(0, start) + currentValue.slice(start + 1);
                input.setSelectionRange(start, start);
            } else if (start !== end) {
                input.value = currentValue.slice(0, start) + currentValue.slice(end);
                input.setSelectionRange(start, start);
            }
        } else if (event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {
            event.preventDefault();
            input.value = currentValue.slice(0, start) + event.key + currentValue.slice(end);
            input.setSelectionRange(start + 1, start + 1);
        }

        input.dispatchEvent(new Event('input', { bubbles: true }));
    }, true);
})();