2016-06-11 19 views
0

there's dieser emscripten Port von DosBox (ein Dos-Emulator), der alte DOS-Software in-Browser ausführen kann. Nun möchte ich eine Art Speicherscanner erstellen, der es ermöglicht, einige Speicherwerte innerhalb der Dosbox zu verändern. Ich habe auf der Google Chrome-Registerkarte "Profil" nachgesehen und festgestellt, dass DosBox ein großes UInt-Array erstellt, das wie ein ganzer Programmspeicher aussieht, aber ich habe keine Ahnung, wie ich darauf zugreifen kann.Zugriff em-Dosbox-Speicher von der Konsole

Irgendwelche Ideen? Vielen Dank im Voraus!

Antwort

1

Das Standard-Setup von Emscripten fügt ein Module-Objekt in den globalen Bereich auf der Seite ein, der verschiedene Ansichten des Array-Puffers enthält, der als Speicher für das Programm dient. Zum Beispiel ist

Module.HEAPU8 

eine Uint8Array Ansicht. Suchen Sie in der Konsole auf https://archive.org/details/msdos_Prince_of_Persia_1990, die Emscripten verwendet, ist die komplette Liste:

Module.HEAP16 
Module.HEAP32 
Module.HEAPF32 
Module.HEAPF64 
Module.HEAPU8 
Module.HEAPU16 
Module.HEAPU32 
+0

Ich war auf der Suche nach https: //archive.org/details/msdos_One_Must_Fall_2097_1994 Es hat diese Variablen auf Fensterobjekt veröffentlicht – Lu4

+0

@ Lu4 Ich habe das Gefühl, dass neuere Versionen von Emscripten nicht alle diese Variablen auf den globalen Bereich, nur das Modul Objekt (/ Funktion, wenn Sie Verwenden Sie die Option MODULARIZE). –

+0

Ok, ich habe einen Kommentar zu Ihrer Information hinterlassen (anybodies) – Lu4

0

Nur für den Hinweis, hier ist der Scanner-Code, die ich verwendet habe

class MemoryScanner { 
    constructor(target) { 
    this.set = new Set(); 
    this.target = target; 
    } 

    search(value) { 
    let target = this.target, length = target.length, set = this.set; 
    for (let i = 0; i < length; i++) { 
     if (target[i] === value) { 
     set.add(i); 
     } 
    } 
    } 

    search2(value1, value2) { 
    let target = this.target, length = target.length, set = this.set; 
    for (let i = 0; i < length; i++) { 
     if (target[i] === value1 && target[i + 1] === value2) { 
     set.add(i); 
     } 
    } 
    } 

    search4(value1, value2, value3, value4) { 
    let target = this.target, length = target.length, set = this.set; 
    for (let i = 0; i < length; i++) { 
     if (target[i + 0] === value1 && 
      target[i + 1] === value2 && 
      target[i + 2] === value3 && 
      target[i + 3] === value4) { 
     set.add(i); 
     } 
    } 
    } 

    search8(value1, value2, value3, value4, value5, value6, value7, value8) { 
    let target = this.target, length = target.length, set = this.set; 
    for (let i = 0; i < length; i++) { 
     if (target[i + 0] === value1 && 
      target[i + 1] === value2 && 
      target[i + 2] === value3 && 
      target[i + 3] === value4 && 
      target[i + 4] === value5 && 
      target[i + 5] === value6 && 
      target[i + 6] === value7 && 
      target[i + 7] === value8) { 
     set.add(i); 
     } 
    } 
    } 

    intersect(value) { 
    let target = this.target, length = target.length, set = this.set; 

    for (let index of this.set) { 
     if (target[index] !== value) { 
     set.delete(index) 
     } 
    } 
    } 

    intersect2(value1, value2) { 
    let target = this.target, length = target.length, set = this.set; 

    for (let index of this.set) { 
     if (target[index] !== value1 || target[index + 1] !== value2) { 
     set.delete(index) 
     } 
    } 
    } 

    intersect4(value1, value2, value3, value4) { 
    let target = this.target, length = target.length, set = this.set; 

    for (let index of this.set) { 
     if (target[index + 0] !== value1 || 
      target[index + 1] !== value2 || 
      target[index + 2] !== value3 || 
      target[index + 3] !== value4) { 
     set.delete(index) 
     } 
    } 
    } 

    intersect8(value1, value2, value3, value4, value5, value6, value7, value8) { 
    let target = this.target, length = target.length, set = this.set; 

    for (let index of this.set) { 
     if (target[index + 0] !== value1 || 
      target[index + 1] !== value2 || 
      target[index + 2] !== value3 || 
      target[index + 3] !== value4 || 
      target[index + 4] !== value5 || 
      target[index + 5] !== value6 || 
      target[index + 6] !== value7 || 
      target[index + 7] !== value8) { 
     set.delete(index) 
     } 
    } 
    } 
}