Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

stupidfs

More files per file: hide files by storing them in the metadata of other files


Want to hide files inside other files? Want to make the most out of your filesystem?

stupidfs stores files in the metadata of your files, allowing your filesystem to hold more files per file.

This can be used as a stealthy way to hide data, or as a useless waste of time.

How does it work?

stupidfs stores information in the 'last modified date' of files in the target directory. The data is stored in the sub-second portion of the timestamp, so it shouldn't have any visible effect when applied to a directory.

stupidfs is a good[citation needed] way to store files inconspicuously, since it's quite hard to tell if a directory contains data stored under stupidfs. in fact, the data itself is somewhat volatile: on my machine, copy pasting the folder updates the last modified date, rendering useless the idea of copying data from an existing drive for later use.

Usage

First, run cargo install stupidfs or compile it from source.

To read, give stupidfs a directory and read the data from it.

stupidfs -o ./data

To write, give stupidfs a directory and pipe data into it.

echo"Hello, world!"| stupidfs -i ./data

Some notes:

  • Output mode is enabled by default, so the -o is optional.
  • A warning will be produced while writing if extra bytes are provided.
  • One file is required for every two bytes of input.

stupidfs works on files with at least 128 nanosecond granularity. This includes NTFS and ext4, and doesn't include FAT32 and ext4 with small inodes.

Visibility

stupidfs stores data in the last few bits of the last modification date of each file (only up to granularity of 128ns so that NTFS is supported). The first few bits of the sub-second portion are not touched, meaning the actual change in the timestamp is very small (up to 8.388ms).

Accuracy

A filesystem supporting 128ns timestamp resolution does not necessarily mean the kernel and hardware support timestamps of such a resolution.

If the hardware doesn't support this resolution or the kernel doesn't update the system time that often, machine times might end up clustered around (or exactly on) some greatest common divisor (e.g. microseconds). If this is the case, it'll be pretty easy to figure out which files were artificially modified.

The fact that the last 128ns is untouched helps with this somewhat since modifying dates at a lower resolution is compatible with all higher resolutions, but this still shouldn't be relied on.

Information

Technically, more than 2 bytes of information is used per file, as other file metadata (e.g. filenames) is used to determine where a given file's bytes are situated within the actual stored data. This isn't particularly important though, since it's not correlated with actual file contents and can't be used to reconstruct anything—it's just an interesting technicality that is probably worth mentioning.

About

More files per file: hide files by storing them in the metadata of other files

Resources

Stars

141 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages