JSLinux rewritten to be human readable, hand deobfuscated and annotated.
Go to file
Anselm Levskaya e7b0f1b321 Merge pull request #11 from danluu/deobfuscate
Various devices
2013-03-23 01:06:43 -07:00
refactoring_hacks autocommented the weird operation-size-counting function 2011-12-23 21:08:07 -08:00
CMOS.js CMOS addressing; reads and writes 2013-03-21 10:45:13 -04:00
KBD.js Document KB command 2013-03-21 00:25:29 -04:00
PCEmulator.js POST codes? 2013-03-23 00:32:41 -04:00
PIC.js PIC ICW1 2013-03-23 00:12:08 -04:00
PIT.js PIT ports and modes 2013-03-23 00:31:14 -04:00
Serial.js Split massive emulator code into logical parts. 2011-12-20 21:34:38 -08:00
clipboard.js Split massive emulator code into logical parts. 2011-12-20 21:34:38 -08:00
cpux86-ta.js document CPUID, with one puzzling exception 2013-03-20 12:19:39 -04:00
cpux86-ta.original.js added the actual original cpu code for reference 2011-12-21 01:08:54 -08:00
index.html Split massive emulator code into logical parts. 2011-12-20 21:34:38 -08:00
jslinux.js moved files 2011-12-16 21:38:46 -08:00
linuxstart-20110820.tar.gz more notes 2011-12-17 04:22:50 -08:00
linuxstart.bin moved files 2011-12-16 21:38:46 -08:00
readme.md document CPUID, with one puzzling exception 2013-03-20 12:19:39 -04:00
root.bin moved files 2011-12-16 21:38:46 -08:00
term.js finished naming functions insofar as I can without overspeculating on a few of the cryptic flow-control routines. 2011-12-25 06:32:25 -08:00
vmlinux-2.6.20.bin moved files 2011-12-16 21:38:46 -08:00

readme.md

De-obfuscated JSLinux

I wanted to understand how the amazing JsLinux worked.

I have no idea if he passed it through a minifier or if the code was generated algorithmically from stuff in the QEMU codebase. In any case, it's hard to follow the action as presented originally, let alone extend it to do new tricks.

I hand de-obfuscated the codebase (primarily the core cpu-emulation routines and a bit of the rest as well) while studying it over a few days' time.

In the off-chance someone else might be interested in this code as a basis for further weird in-browser x86 hacking I'm posting this redacted version of the code here.

There is a much more complete, ground-up project to build a 386-style emulator in javascript called jslm32.

Status

It's still a dense code base, it's an emulator of a rather complicated architecture, after all. However this version is nowhere near so incomprehensible as the original. Nearly all of the global variables and function names have been named somewhat sensibly. Many comments have been added.

The core opcode execution loop has been autocommented to indicate what instruction operation the opcode refers to.

One mystery is, why does CPUID(1) return 8 << 8 in EBX? EBX[15:8] is now used to indicate CLFLUSH line size, but that field must have been used for something else in the past.

ETC

I highly recommend, by the way, the excellent JSShaper library for transforming large javascript code bases. The hacks I made from it are in this repo: a little symbol-name-transformer node.js script and an emacs function for doing this in live buffers.

Caveat Coder

This is a pedagogical/aesthetic reinterpretation of the original JSLinux code Copyright (c) 2011 Fabrice Bellard. It seems to run identically to the original.

References

Some other helpful references for understanding what's going on:

x86

Bit Hacking

Other devices