package Digest::MD5::Reverse; use warnings; use strict; use Socket; use Exporter; =head1 NAME Digest::MD5::Reverse - MD5 Reverse Lookup =cut our $VERSION = "1.3"; our @ISA = qw(Exporter); our @EXPORT = qw(&reverse_md5); =head1 VERSION Version 1.3 =head1 SYNOPSIS use Digest::MD5::Reverse; my $plaintext = reverse_md5($md5); =head1 DESCRIPTION MD5 sums (see RFC 1321 - The MD5 Message-Digest Algorithm) are used as a one-way hash of data. Due to the nature of the formula used, it is impossible to reverse it. This module provides functions to search several online MD5 hashes database and return the results (or return undefined if no match found). We are not breaking security. We are however making it easier to lookup the source of a MD5 sum. =head1 EXAMPLES use Digest::MD5::Reverse; print "Data is ".reverse_md5("acbd18db4cc2f85cedef654fccc4a4d8")."\n"; # Data is foo =head1 DATABASE =over 4 =item * milw0rm.com =item * gdataonline.com =item * hashreverse.com =item * us.md5.crysm.net =item * nz.md5.crysm.net =item * ice.breaker.free.fr =item * hashchecker.com =item * md5.rednoize.com =item * md5.xpzone.de =item * md5encryption.com =back =cut our $DATABASE = [ { host => "milw0rm.com", path => "/cracker/search.php", meth => "POST", content => "hash=%value%&Submit=Submit", mreg => qr{ md5<\/TD> \w{32}<\/TD> (.+?)<\/TD> cracked<\/TD> <\/TR> }x }, { host => "gdataonline.com", path => "/qkhash.php?mode=xml&hash=%value%", meth => "GET", mreg => qr{ (.+?)<\/result> }x }, { host => "hashreverse.com", path => "/index.php?action=view", meth => "POST", content => "hash=%value%&Submit2=Search+for+a+SHA1+or+MD5+hash", mreg => qr{
  • (.+?)<\/li> }x }, { host => "us.md5.crysm.net", path => "/find?md5=%value%", meth => "GET", mreg => qr{
  • (.+?)<\/li> }x }, { host => "nz.md5.crysm.net", path => "/find?md5=%value%", meth => "GET", mreg => qr{
  • (.+?)<\/li> }x }, { host => "ice.breaker.free.fr", path => "/md5.php?hash=%value%", meth => "GET", mreg => qr{
    \s-\s(.+?)
    }x }, { host => "hashchecker.com", path => "/index.php", meth => "POST", content => "search_field=%value%&Submit=search", mreg => qr{ (.+?)<\/b>\sused\scharlist }x }, { host => "md5.rednoize.com", path => "/?s=md5&q=%value%", meth => "GET", mreg => qr{ (.+?)<\/div> }x }, { host => "md5.xpzone.de", path => "/?string=%value%&mode=decrypt", meth => "GET", mreg => qr{ Code:\s(.+?)
    }x }, { host => "md5encryption.com", path => "/?mod=decrypt", meth => "POST", content => "hash2word=%value%", mreg => qr{ Decrypted\sWord:<\/b>\s(.*?)(?:){2} }x } ]; my $get = sub { my($url,$path) = @_; socket(my $socket, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "Socket Error : $!\n"; connect($socket,sockaddr_in(80, inet_aton($url))) or die "Connect Error: $!\n"; send($socket,"GET $path HTTP/1.1\015\012Host: $url\015\012User-Agent: Firefox\015\012Connection: Close\015\012\015\012",0); return do { local $/; <$socket> }; }; my $post = sub { my($url,$path,$content) = @_; my $len = length $content; socket(my $socket, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "Socket Error : $!\n"; connect($socket,sockaddr_in(80, inet_aton($url))) or die "Connect Error : $!\n"; send($socket,"POST $path HTTP/1.1\015\012Host: $url\015\012User-Agent: Firefox\015\012Content-Type: application/x-www-form-urlencoded\015\012Connection: Close\015\012Content-Length: $len\015\012\015\012$content\015\012",0); return do { local $/; <$socket> }; }; my $reverseit = sub { my $md5 = shift; return undef if length $md5 != 32; my($string,$page); SEARCH: for my $site (@{ $DATABASE }) { my $host = $site->{host}; my $path = $site->{path}; my $meth = $site->{meth}; my $mreg = $site->{mreg}; my $content = $site->{content}; if($meth eq "POST") { $content =~ s/%value%/$md5/ig; $page = $post->($host,$path,$content); } else { $path =~ s/%value%/$md5/ig; $page = $get->($host,$path); } next unless $page; last SEARCH if(($string) = $page =~ /$site->{mreg}/); } return $string ? $string : undef; }; sub reverse_md5 { return $reverseit->(shift); } =head1 SEE ALSO L =head1 AUTHOR Raoul-Gabriel Urma << blwood@skynet.be >> =head1 COPYRIGHT & LICENSE Copyright 2007 Raoul-Gabriel Urma, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;