diff -urpN john-1.7.6-jumbo-12/src/john.c john-1.7.6-jumbo-12-lm2ntlm/src/john.c
--- john-1.7.6-jumbo-12/src/john.c	2011-02-04 16:00:55.000000000 +0100
+++ john-1.7.6-jumbo-12/src/john.c	2011-03-24 18:54:11.426660001 +0100
@@ -100,6 +100,7 @@ extern int unshadow(int argc, char **arg
 extern int unafs(int argc, char **argv);
 extern int undrop(int argc, char **argv);
 extern int unique(int argc, char **argv);
+extern int lm2ntlm(int argc, char **argv);
 
 static struct db_main database;
 static struct fmt_main dummy_format;
@@ -488,6 +489,9 @@ int main(int argc, char **argv)
 
 	if (!strcmp(name, "undrop"))
                return undrop(argc, argv);
+
+	if (!strcmp(name, "lm2ntlm"))
+		return lm2ntlm(argc, argv);
  
 	john_init(name, argc, argv);
 	john_run();
diff -urpN john-1.7.6-jumbo-12/src/lm2ntlm.c john-1.7.6-jumbo-12-lm2ntlm/src/lm2ntlm.c
--- john-1.7.6-jumbo-12/src/lm2ntlm.c	1970-01-01 01:00:00.000000000 +0100
+++ john-1.7.6-jumbo-12/src/lm2ntlm.c	2011-03-30 00:06:05.125720002 +0200
@@ -0,0 +1,227 @@
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42b):
+ * <earthquake@rycon.hu > wrote this file. As long as you retain this notice 
+ * you can do whatever you want with this stuff. If we meet some day, and you
+ * think this stuff is worth it, you can buy me a beer in return Balázs Bucsay
+ * And of course Poul-Henning Kamp too, for the license :)
+ * ----------------------------------------------------------------------------
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <sys/stat.h>
+#include "misc.h"
+#include "common.h"
+#include "formats.h"
+
+extern struct fmt_main fmt_NT;
+
+static struct fmt_methods crk_methods;
+static int crk_key_index, crk_last_key;
+static void *crk_last_salt;
+static char crk_stdout_key[PLAINTEXT_BUFFER_SIZE];
+extern char crypt_key;
+
+int hash_ntlm(char *plain, char *ntlm)
+{
+	int index;	
+	
+	fmt_register(&fmt_NT);
+	common_init();
+	
+	memcpy(&crk_methods, &(fmt_NT.methods), sizeof(struct fmt_methods));	
+	
+	crk_last_key = crk_key_index = 0;                                                                                                                                         
+	crk_last_salt = NULL;
+	crk_stdout_key[0] = 0;
+	crk_methods.init();	
+	crk_methods.set_key(plain, 0);
+	crk_methods.crypt_all(1);
+	
+	if (crk_methods.cmp_all(crk_methods.binary(ntlm), 1))	
+		if (crk_methods.cmp_one(crk_methods.binary(ntlm), 0))
+		{
+			return 1;
+		}
+		
+	
+	return 0;
+}
+
+int lm2ntlm_search(char *plain, char *ntlm)
+{
+	int alpha = 0, j = 0, i;
+	int *pos = NULL;
+	char *found = NULL;
+	
+	strlwr(plain);
+	strlwr(ntlm);
+	
+	if (strlen(plain)>14) 
+	{
+		plain = 0;
+		return 1337;
+	}
+	
+	if ((pos = malloc(sizeof(int)*strlen(plain))) == NULL) 
+	{
+		plain = 0;
+		return 1337;
+	}
+	memset(pos, 0, sizeof(int)*strlen(plain));
+	for (i=0;i<strlen(plain);i++)
+	{
+		if ((plain[i] > 96) && (plain[i] < 123))
+		{
+			alpha++;
+			pos[j++] = i;
+		}
+	}
+	for (i=0;i<pow(2,alpha);i++)
+	{
+		for (j=0;j<alpha;j++)
+		{
+			if (i & (int)pow(2, j))
+			{
+				if ((plain[pos[j]] > 64) && (plain[pos[j]] < 91)) plain[pos[j]] = plain[pos[j]]+32;				
+			}
+			else
+			{
+				if ((plain[pos[j]] > 96) && (plain[pos[j]] < 123)) plain[pos[j]] = plain[pos[j]]-32;
+			}
+		}
+		if (hash_ntlm(plain, ntlm))
+		{
+			found = plain;
+			free(pos);
+			return 0;
+		}
+	}
+	
+	free(pos);
+	plain = 0;
+	return 1337;
+}
+
+void parsejohnpot(char *fgdumptxt)
+{
+	FILE *fgdump;
+	FILE *pot;
+	struct stat b;
+	char buffer[1024 + 1]; // if it longer, dont care...
+	char lm1[16 + 1], lm2[16 + 1];
+	char lmpass[14 + 1], ntlm[4 + 32 + 1];
+	char *username, *p, *tmp;
+	unsigned int len = 0;
+	
+	if (stat(fgdumptxt, &b))
+	{
+		printf("[-] No such file: %s\n", fgdumptxt);
+		return;
+	}
+	if (stat("john.pot", &b))
+	{
+		printf("[-] No such file: john.pot\n");
+		return;
+	}
+	fgdump = fopen(fgdumptxt, "r");
+	pot = fopen("john.pot", "r");
+	
+	while (fgets(buffer, 1024, fgdump))
+	{
+		p = buffer;
+		len = strstr(p, ":")-p;
+		if (len >= 512)
+		{
+			continue;
+		}
+		username = malloc(sizeof(char)*(len + 1));
+		memset(username, 0, sizeof(char)*(len + 1));
+		strncpy(username, p, len);
+		
+		
+		p += len + 1;
+		len = strstr(p, ":")-p;
+		if (len > 10) 
+		{
+			free(username);
+			continue;
+		}
+		p += len + 1;
+		if ((strstr(p, ":")-p) != 32)
+		{
+			printf("[-] Error in line: %s", buffer);
+		}
+		
+		memset(lm1, 0, sizeof(char)*17);
+		strncpy(lm1, p, 16);
+		strlwr(lm1);
+		memset(lm2, 0, sizeof(char)*17);
+		strncpy(lm2, p+16, 16);
+		strlwr(lm2);
+		
+		if ((strstr(p, ":")-p) != 32)
+		{
+			printf("[-] Error in line: %s", buffer);
+		}
+		
+		p += 32 + 1;
+		memset(ntlm, 0, sizeof(char)*37);
+		ntlm[0] = '$';ntlm[1] = 'N';ntlm[2] = 'T';ntlm[3] = '$';
+		tmp = ntlm+4;
+		strncpy(tmp, p, 32);
+		strlwr(tmp);	
+		
+		memset(lmpass, 0, 15);
+		
+		while (fgets(buffer, 1024, pot))
+		{
+			if (strncmp(buffer, "$LM$", 4))
+				continue;
+			if (!strncmp(buffer+4, lm1, 16))
+			{
+				len = strlen(buffer)-(strstr(buffer, ":")-buffer+1);
+				if (len < 9)
+				{
+					strncpy(lmpass, strstr(buffer, ":")+1, len-1);
+				}
+			}
+			if (!strncmp(buffer+4, lm2, 16))
+			{
+				len = strlen(buffer)-(strstr(buffer, ":")-buffer+1);
+				if (len < 9)
+				{
+					strncpy(lmpass+7, strstr(buffer, ":")+1, len-1);
+				}
+			}
+		}
+		if (*lmpass) 
+		{
+			if (!lm2ntlm_search(lmpass, ntlm)) printf("%s:%s\n", username, lmpass);
+		}
+		fseek(pot, 0, SEEK_SET);
+		
+		free(username);
+	}
+	
+	return;
+}
+
+int lm2ntlm(int argc, char **argv)
+{
+	if (argc != 2)
+	{
+		printf("[-] Usage: %s fgdump.txt\n", argv[0]);
+		return 1337;
+	}
+	else {
+		parsejohnpot(argv[1]);
+	}
+
+	return 0;
+}
+
diff -urpN john-1.7.6-jumbo-12/src/Makefile john-1.7.6-jumbo-12-lm2ntlm/src/Makefile
--- john-1.7.6-jumbo-12/src/Makefile	2011-02-04 15:52:06.000000000 +0100
+++ john-1.7.6-jumbo-12/src/Makefile	2011-03-24 18:54:11.536660001 +0100
@@ -92,6 +92,7 @@ JOHN_OBJS = \
 	unshadow.o \
 	unafs.o \
 	undrop.o \
+	lm2ntlm.o \
 	unique.o
 
 BENCH_DES_OBJS_ORIG = \
@@ -122,7 +123,7 @@ GENMKVPWD_OBJS = \
 
 PROJ = ../run/john ../run/unshadow ../run/unafs ../run/unique ../run/undrop \
 	../run/genmkvpwd ../run/mkvcalcproba ../run/calc_stat \
-	../run/tgtsnarf
+	../run/tgtsnarf ../run/lm2ntlm
 PROJ_DOS = ../run/john.bin ../run/john.com \
 	../run/unshadow.com ../run/unafs.com ../run/unique.com ../run/undrop.com
 PROJ_WIN32 = ../run/john.exe \
@@ -888,6 +889,10 @@ bench: $(BENCH_OBJS)
 	$(RM) ../run/unique
 	ln -s john ../run/unique
 
+../run/lm2ntlm: ../run/john
+	$(RM) ../run/lm2ntlm
+	ln -s john ../run/lm2ntlm
+
 ../run/john.bin: $(JOHN_OBJS)
 	$(LD) $(JOHN_OBJS) $(LDFLAGS) -o ../run/john.exe
 	if exist ..\run\john.bin del ..\run\john.bin
