File Coverage

blib/lib/Digest/MD5/Reverse.pm
Criterion Covered Total %
statement 13 13 100.0
branch n/a
condition n/a
subroutine 5 5 100.0
pod 0 1 0.0
total 18 19 94.7


line stmt bran cond sub pod time code
1             package Digest::MD5::Reverse;
2              
3 1     1   21452 use warnings;
  1         2  
  1         26  
4 1     1   5 use strict;
  1         1  
  1         28  
5 1     1   971 use Socket;
  1         5012  
  1         626  
6 1     1   9 use Exporter;
  1         2  
  1         810  
7              
8             =head1 NAME
9              
10             Digest::MD5::Reverse - MD5 Reverse Lookup
11              
12             =cut
13              
14             our $VERSION = "1.3";
15             our @ISA = qw(Exporter);
16             our @EXPORT = qw(&reverse_md5);
17              
18              
19             =head1 VERSION
20              
21             Version 1.3
22              
23             =head1 SYNOPSIS
24              
25             use Digest::MD5::Reverse;
26             my $plaintext = reverse_md5($md5);
27              
28             =head1 DESCRIPTION
29              
30             MD5 sums (see RFC 1321 - The MD5 Message-Digest Algorithm) are used as a one-way
31             hash of data. Due to the nature of the formula used, it is impossible to reverse
32             it.
33              
34             This module provides functions to search several online MD5 hashes database and
35             return the results (or return undefined if no match found).
36              
37             We are not breaking security. We are however making it easier to lookup the
38             source of a MD5 sum.
39              
40             =head1 EXAMPLES
41              
42             use Digest::MD5::Reverse;
43             print "Data is ".reverse_md5("acbd18db4cc2f85cedef654fccc4a4d8")."\n";
44             # Data is foo
45              
46             =head1 DATABASE
47              
48             =over 4
49              
50             =item * milw0rm.com
51              
52             =item * gdataonline.com
53              
54             =item * hashreverse.com
55              
56             =item * us.md5.crysm.net
57              
58             =item * nz.md5.crysm.net
59              
60             =item * ice.breaker.free.fr
61              
62             =item * hashchecker.com
63              
64             =item * md5.rednoize.com
65              
66             =item * md5.xpzone.de
67              
68             =item * md5encryption.com
69              
70             =back
71              
72             =cut
73              
74             our $DATABASE = [
75             {
76             host => "milw0rm.com",
77             path => "/cracker/search.php",
78             meth => "POST",
79             content => "hash=%value%&Submit=Submit",
80             mreg => qr{
81            
82             md5<\/TD>
83             \w{32}<\/TD>
84             (.+?)<\/TD>
85             cracked<\/TD>
86             <\/TR>
87             }x
88             },
89             {
90             host => "gdataonline.com",
91             path => "/qkhash.php?mode=xml&hash=%value%",
92             meth => "GET",
93             mreg => qr{
94             (.+?)<\/result>
95             }x
96             },
97             {
98             host => "hashreverse.com",
99             path => "/index.php?action=view",
100             meth => "POST",
101             content => "hash=%value%&Submit2=Search+for+a+SHA1+or+MD5+hash",
102             mreg => qr{
103            
  • (.+?)<\/li>
  • 104             }x
    105             },
    106             {
    107             host => "us.md5.crysm.net",
    108             path => "/find?md5=%value%",
    109             meth => "GET",
    110             mreg => qr{
    111            
  • (.+?)<\/li>
  • 112             }x
    113             },
    114             {
    115             host => "nz.md5.crysm.net",
    116             path => "/find?md5=%value%",
    117             meth => "GET",
    118             mreg => qr{
    119            
  • (.+?)<\/li>
  • 120             }x
    121             },
    122             {
    123             host => "ice.breaker.free.fr",
    124             path => "/md5.php?hash=%value%",
    125             meth => "GET",
    126             mreg => qr{
    127            
    \s-\s(.+?)
    128             }x
    129             },
    130             {
    131             host => "hashchecker.com",
    132             path => "/index.php",
    133             meth => "POST",
    134             content => "search_field=%value%&Submit=search",
    135             mreg => qr{
    136             (.+?)<\/b>\sused\scharlist
    137             }x
    138             },
    139             {
    140             host => "md5.rednoize.com",
    141             path => "/?s=md5&q=%value%",
    142             meth => "GET",
    143             mreg => qr{
    144             (.+?)<\/div>
    145             }x
    146            
    147             },
    148             {
    149             host => "md5.xpzone.de",
    150             path => "/?string=%value%&mode=decrypt",
    151             meth => "GET",
    152             mreg => qr{
    153             Code:\s(.+?)
    154             }x
    155             },
    156             {
    157             host => "md5encryption.com",
    158             path => "/?mod=decrypt",
    159             meth => "POST",
    160             content => "hash2word=%value%",
    161             mreg => qr{
    162             Decrypted\sWord:<\/b>\s(.*?)(?:){2}
    163             }x
    164             }
    165             ];
    166              
    167             my $get = sub
    168             {
    169             my($url,$path) = @_;
    170             socket(my $socket, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "Socket Error : $!\n";
    171             connect($socket,sockaddr_in(80, inet_aton($url))) or die "Connect Error: $!\n";
    172             send($socket,"GET $path HTTP/1.1\015\012Host: $url\015\012User-Agent: Firefox\015\012Connection: Close\015\012\015\012",0);
    173             return do { local $/; <$socket> };
    174             };
    175              
    176             my $post = sub
    177             {
    178             my($url,$path,$content) = @_;
    179             my $len = length $content;
    180             socket(my $socket, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "Socket Error : $!\n";
    181             connect($socket,sockaddr_in(80, inet_aton($url))) or die "Connect Error : $!\n";
    182             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);
    183             return do { local $/; <$socket> };
    184             };
    185              
    186             my $reverseit = sub
    187             {
    188             my $md5 = shift;
    189             return undef if length $md5 != 32;
    190             my($string,$page);
    191             SEARCH:
    192             for my $site (@{ $DATABASE })
    193             {
    194             my $host = $site->{host};
    195             my $path = $site->{path};
    196             my $meth = $site->{meth};
    197             my $mreg = $site->{mreg};
    198             my $content = $site->{content};
    199             if($meth eq "POST")
    200             {
    201             $content =~ s/%value%/$md5/ig;
    202             $page = $post->($host,$path,$content);
    203             }
    204             else
    205             {
    206             $path =~ s/%value%/$md5/ig;
    207             $page = $get->($host,$path);
    208             }
    209             next unless $page;
    210             last SEARCH if(($string) = $page =~ /$site->{mreg}/);
    211             }
    212             return $string ? $string : undef;
    213             };
    214              
    215             sub reverse_md5
    216             {
    217 1     1 0 317 return $reverseit->(shift);
    218             }
    219              
    220             =head1 SEE ALSO
    221              
    222             L
    223              
    224             =head1 AUTHOR
    225              
    226             Raoul-Gabriel Urma << blwood@skynet.be >>
    227              
    228             =head1 COPYRIGHT & LICENSE
    229              
    230             Copyright 2007 Raoul-Gabriel Urma, all rights reserved.
    231              
    232             This program is free software; you can redistribute it and/or modify it
    233             under the same terms as Perl itself.
    234              
    235             =cut
    236              
    237             1;