Skip to content

Instantly share code, notes, and snippets.

View gsuberland's full-sized avatar

Graham Sutherland gsuberland

View GitHub Profile
@gsuberland
gsuberland / mastodon_local_link.user.js
Last active September 22, 2023 14:34
Tampermonkey script that adds a link to view remote posts locally.
@gsuberland
gsuberland / ClusterFunctionsByFID.java
Created May 7, 2023 20:05
Ghidra script to cluster functions by their function ID, applying tags to functions in clusters of size >1. Helps identify functions that have identical or very similar behaviour.
// Clusters functions by their function ID and applies tags to functions in clusters with a size larger than 1.
//@category FunctionID
//@author Graham Sutherland
import java.io.IOException;
import java.util.*;
import ghidra.app.script.GhidraScript;
import ghidra.feature.fid.hash.FidHashQuad;
import ghidra.feature.fid.plugin.HashLookupListMode;
@gsuberland
gsuberland / forced_alignment_srt.cs
Last active October 12, 2022 05:50
Automatic forced alignment transcription for creating timed SRT subtitles from a script document, using speech recognition.
/*
works in LinqPad 5 (.NET Framework)
requires System.Speech.dll to be loaded
*/
string script = @"
This is a test of automatic forced alignment transcription.
When I read these words, the program will automatically follow along and output SRT subtitle entries.
The code also handles situations where two lines in the script are the same.
For example, I can repeat the first line of this script:
@gsuberland
gsuberland / mastodon_unlist_replies.user.js
Created May 21, 2022 19:45
Tampermonkey / Greasemonkey script to automatically set the privacy of replies to unlisted by default on Mastodon.
// ==UserScript==
// @name Mastodon Unlisted Replies
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Sets the privacy of replies to unlisted by default on Mastodon.
// @author Graham Sutherland (@gsuberland@chaos.social)
// @match https://chaos.social/* https://mastodon.social/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=chaos.social
// @grant none
// @run-at document-idle
@gsuberland
gsuberland / dump_windows_productpolicy.cs
Last active April 7, 2022 12:55
Dump Windows ProductPolicy Structure in C#
// dump ProductPolicy data structure from Windows
// ref: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/slmem/productpolicy.htm
using (var pok = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\ControlSet001\Control\ProductOptions", false))
{
byte[] policy = (byte[])pok.GetValue(@"ProductPolicy");
using (var ms = new MemoryStream(policy))
using (var br = new BinaryReader(ms))
{
Console.WriteLine("total license data size (including header): {0}", br.ReadUInt32());
@gsuberland
gsuberland / MoveDisplays.cs
Created November 25, 2021 04:08
Move displays programmatically on Windows in C#
// quick bit of code to move displays to specific locations in C#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
@gsuberland
gsuberland / twitter_video_hq_tampermonkey.js
Created November 7, 2021 14:45
Tampermonkey / Greasemonkey script to force high quality video on Twitter
// ==UserScript==
// @name Load HQ Video on Twitter
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Forces Twitter to always load the highest bitrate video available.
// @author Graham Sutherland
// @match https://twitter.com/*
// @icon https://www.google.com/s2/favicons?domain=twitter.com
// @grant none
// ==/UserScript==
@gsuberland
gsuberland / icm_handle_leak_fix.cpp
Last active October 13, 2021 12:55
Extremely hacky solution to close leaked handles in mscms.dll!OpenDisplay
// see: https://bugs.chromium.org/p/chromium/issues/detail?id=1201106
// see: https://twitter.com/gsuberland/status/1445547814965055488
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
#include <memory>
#include <cassert>
#include <vector>
@gsuberland
gsuberland / le_exe_dumper.cs
Created August 28, 2021 04:02
Linear Executable (LE) EXE header dumper for mixed 16/32-bit VXDs
// dump LE EXE headers for mixed 16/32-bit VXDs
// ref: https://faydoc.tripod.com/formats/exe-LE.htm
// ref: https://github.com/open-watcom/open-watcom-v2/blob/master/bld/watcom/h/exeflat.h
// ref: http://www.textfiles.com/programming/FORMATS/lxexe.txt (this is for LX, not LE, but layout is roughly the same)
enum Endianness : byte
{
LittleEndian = 0,
BigEndian = 1
@gsuberland
gsuberland / le_exe_headers.h
Created August 28, 2021 03:56
Linear Executable (LE) file format structures
// ref: http://fileformats.archiveteam.org/wiki/Linear_Executable
// ref: https://moddingwiki.shikadi.net/wiki/Linear_Executable_(LX/LE)_Format
// ref: https://github.com/open-watcom/open-watcom-v2/blob/master/bld/watcom/h/exeflat.h (this is specifically for LE VXDs)
// ref: http://www.textfiles.com/programming/FORMATS/lxexe.txt (comprehensive but actually for LX, not LE)
typedef unsigned char undefined;
typedef unsigned char byte;
typedef unsigned long dword;
typedef unsigned long uint3;