unix-strings

A nodejs implementation of the unix utility strings, which dumps all the string content of a file. Useful for decompilers.

Usage no npm install needed!

<script type="module">
  import unixStrings from 'https://cdn.skypack.dev/unix-strings';
</script>

README

Unix Strings

A NodeJS implementation of the unix utility strings, which dumps all the string content of a file. Useful for decompilers. Contains no dependencies.

Example


const stringExtractor = require('unix-strings');
const fs = require('fs');

// Give it a file path
stringExtractor('path/to/some/file.exe', function (chunk, offset, fileStream) {
    console.log(chunk.toString()); // Output the string buffer to the console
    fileStream.pause(); // See NodeJS Docs: ReadableStream
})
// Returns a promise with the final result
.then(function (extracted) {
    // The entire buffer
    fs.writeFileSync('path/to/some/output.txt', extracted.toString());
});

// Use a already initalized file stream
var existingStream = fs.createReadStream('path/to/some/file.exe');
stringExtractor(existingStream, ...);

node node_modules/unix-strings/index.js path/to/some/file.exe

Notes

In order to make byte checking faster, some WebAssembly is used.

C Code

bool STRING_ISGRAPHIC(int c) {
  return ((c) >= 0 && (c) <= 255 && ((c) == '\t' || ((c >= ' ' && c <= '~') ? 1 : 0)));
}

WebAssemblyCode

(module
  (type $type0 (func (param i32) (result i32)))
  (table 0 anyfunc)
  (memory 1)
  (export "memory" memory)
  (export "_Z16STRING_ISGRAPHICi" $func0)
  (func $func0 (param $var0 i32) (result i32)
    (local $var1 i32) 
    i32.const 0
    set_local $var1
    block $label0
      get_local $var0
      i32.const 255
      i32.gt_u
      br_if $label0
      i32.const 1
      set_local $var1
      get_local $var0
      i32.const 9
      i32.eq
      br_if $label0
      get_local $var0
      i32.const -32
      i32.add
      i32.const 95
      i32.lt_u
      set_local $var1
    end $label0
    get_local $var1
  )
)

If you want to disable it and use the javascript version, just set a global variable before you require the file:

global._unixStringsAssembly = false;
const stringExtractor = require('unix-strings');