decoder.py hinzugefügt
This commit is contained in:
		
							parent
							
								
									f13f9fafc9
								
							
						
					
					
						commit
						6605d3cf9c
					
				
							
								
								
									
										71
									
								
								decoder.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								decoder.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Decoder for Paul Butler's emoji steganography method
 | 
				
			||||||
 | 
					Usage: python3 decoder.py "🥜[encoded-text]"
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def variation_selector_to_byte(char):
 | 
				
			||||||
 | 
					    """Convert a variation selector character back to its byte value"""
 | 
				
			||||||
 | 
					    code = ord(char)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Original variation selectors (VS1-VS16): U+FE00 to U+FE0F
 | 
				
			||||||
 | 
					    if 0xFE00 <= code <= 0xFE0F:
 | 
				
			||||||
 | 
					        return code - 0xFE00
 | 
				
			||||||
 | 
					    # Supplementary variation selectors (VS17-VS256): U+E0100 to U+E01EF  
 | 
				
			||||||
 | 
					    elif 0xE0100 <= code <= 0xE01EF:
 | 
				
			||||||
 | 
					        return code - 0xE0100 + 16
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def decode_emoji_text(encoded_text):
 | 
				
			||||||
 | 
					    """Decode hidden text from emoji with variation selectors"""
 | 
				
			||||||
 | 
					    bytes_data = []
 | 
				
			||||||
 | 
					    found_variation_selector = False
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for char in encoded_text:
 | 
				
			||||||
 | 
					        byte_val = variation_selector_to_byte(char)
 | 
				
			||||||
 | 
					        if byte_val is not None:
 | 
				
			||||||
 | 
					            bytes_data.append(byte_val)
 | 
				
			||||||
 | 
					            found_variation_selector = True
 | 
				
			||||||
 | 
					        elif found_variation_selector:
 | 
				
			||||||
 | 
					            # Stop when we hit a non-variation selector after finding some
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        return bytes(bytes_data).decode('utf-8')
 | 
				
			||||||
 | 
					    except UnicodeDecodeError:
 | 
				
			||||||
 | 
					        return f"Raw bytes: {bytes_data}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    if len(sys.argv) < 2 or len(sys.argv) > 3:
 | 
				
			||||||
 | 
					        print("Usage: python3 decoder.py '<encoded-emoji-text>' [output-file]")
 | 
				
			||||||
 | 
					        print("  If no output file specified, uses 'decoded_output.txt'")
 | 
				
			||||||
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    encoded = sys.argv[1]
 | 
				
			||||||
 | 
					    output_file = sys.argv[2] if len(sys.argv) == 3 else "decoded_output.txt"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    decoded = decode_emoji_text(encoded)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Write results to file
 | 
				
			||||||
 | 
					    with open(output_file, 'w', encoding='utf-8') as f:
 | 
				
			||||||
 | 
					        f.write("=== EMOJI STEGANOGRAPHY DECODER RESULTS ===\n\n")
 | 
				
			||||||
 | 
					        f.write(f"Encoded text: {encoded}\n\n")
 | 
				
			||||||
 | 
					        f.write(f"Decoded result:\n{decoded}\n\n")
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Unicode breakdown
 | 
				
			||||||
 | 
					        f.write("=== CHARACTER ANALYSIS ===\n")
 | 
				
			||||||
 | 
					        for i, char in enumerate(encoded):
 | 
				
			||||||
 | 
					            code = ord(char)
 | 
				
			||||||
 | 
					            vs_byte = variation_selector_to_byte(char)
 | 
				
			||||||
 | 
					            if vs_byte is not None:
 | 
				
			||||||
 | 
					                printable_char = chr(vs_byte) if 32 <= vs_byte <= 126 else f'\\x{vs_byte:02x}'
 | 
				
			||||||
 | 
					                f.write(f"  {i:3d}: U+{code:04X} -> byte {vs_byte:3d} ('{printable_char}')\n")
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                f.write(f"  {i:3d}: U+{code:04X} '{char}' (base character)\n")
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    print(f"✓ Decoding complete! Results saved to: {output_file}")
 | 
				
			||||||
 | 
					    print(f"✓ Decoded {len([c for c in encoded if variation_selector_to_byte(c) is not None])} hidden bytes")
 | 
				
			||||||
 | 
					    print(f"✓ Preview: {decoded[:100]}{'...' if len(decoded) > 100 else ''}")
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user