[C++] Methodus Toolz 3 Keygen

update 2022; after 20 years, the original website(methodus2000.com) for the program has been revived, this won't affect serial authentication process as it relies on another domain(buymethodus.com).

• correction; i previously stated the expiration system was broken but this is not the case. the 15 day trial regards to the number of individual days methodus is used instead of consecutive days since its installation.

• update; minor bug fixes in keygen code has also been made in august 2022.


description; Methodus Toolz 3 is a program created by ChiefDreegFleer and Jump0ffABuilding. It's made up of various tools, most of them deal with AOL(old versions). It was released in 2001 and has been abandoned for many years, neither can you buy it or authenticate your keys.

how to compile; ~$ g++ -o meth meth.cpp

usage example; ./meth <userid>

input conditions; keygen only accepts a-z character set & length of 2-40.

various info;
• There are two variables that you enter to register Methodus, one is ID, other is Key. ID only accepts standard lowercase alphabet(a-z) characters with length between 2 and 40. The key contains only numbers and must be the length of 16.
• When you attempt to register Methodus, it connects to www.buymethodus.com/cgi-bin/crippay.pl with two parameters, "id" and "idkey". Methodus then awaits for one of two possible responses, "keygood" and "keyabused".
• It has a trial of 15 days, but I think it is broken. I recall it doesn't keep track of days as it should.
• The number of days tracked is located at:(64-bit) "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DDE Classes\class1", and makes Methodus registered if changed to "-1".
• Regarding the date registry key located at:(64-bit) "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DDE Classes\class2". This key gets set to current date every time methodus is used. If the dates differ, then class1 gets incremented.

various memory editing info;
• Take every jump at 00682D9C to remove character restriction in ID
• Take every jump at 00683072 to remove minimum length restriction in ID
• Take every jump at 00682F20 to remove maximum length restriction in ID
• Jump from 00682C42 to 0068310D to bypass all ID validation checks
• Don't jump at 006832B7 to accept any ID and Key combination

download original software;  methodus3b9.exe  methodus2.exe

Easily compilable with standard C++ libraries. Portable.
/*
*	[C++] Methodus Toolz 3 Keygen
*	Written by Phillip Housden @ https://starwolf.net/
*/

#include <cstdio>
#include <cstring>

int main(int argc,char **argv) {
	char szID[42];
	memset(szID,0,sizeof(szID));

	if(argc==2) strncat(szID,argv[1],41);

	int idLength=strlen(szID);
	if(idLength < 2 || idLength > 40) {
		printf("\nError: invalid ID - bad length - keep between 2 & 40 characters\n\n");
		return 0;
	}

	for(int i=0; i<idLength; i++) {
		if(szID[i] < 'a' || szID[i] > 'z') {
			printf("\nError: invalid ID - lowercase alpha only\n\n");
			return 0;
		}
	}

	unsigned char hex[16] = {
		0x2E,0x29,0x95,0x45,
		0xE7,0x20,0x7B,0x36,
		0x1C,0x61,0xF8,0x29,
		0x88,0x29,0x4E,0xA9
	};

	unsigned char szNumberArray[513];
	memset(szNumberArray,0,sizeof(szNumberArray));

	unsigned short int szBigHexArray[513];
	memset(szBigHexArray,0,sizeof(szBigHexArray));

	short int szID2[16];
	memset(szID2,0,sizeof(szID2));

	short int Seed2[16];
	memset(Seed2,0,sizeof(Seed2));

	char szSeed[8];
	memset(szSeed,0,sizeof(szSeed));
	strcat(szSeed,"caapass");
	short int iSeedLen=strlen(szSeed);

	char szResult[32];
	memset(szResult,0,sizeof(szResult));

	for(int i=0; i<=512; i++) szBigHexArray[i]=i;
	for(int i=0; i<=512; i++) {
		static int iNum1,iNum2;

		iNum1=iNum1+i;
		iNum1=iNum1&0xFF;

		iNum2=szBigHexArray[i];
		szBigHexArray[i]=szBigHexArray[iNum1];
		szBigHexArray[iNum1]=iNum2;
	}

	for(int i=0,k=0; i<=512; i++,k++) {
		if(k>=10) k=0;
		szNumberArray[szBigHexArray[i]]=k;
	}

	int iPos=0;
	int iStacked=0;

	for(int i=0; i<idLength; i++,iPos++) {
		if(((i>>3)<<3)==i) iPos=0;
		static int LOCAL_59;
		LOCAL_59=szID[i]+szID2[iPos];
		LOCAL_59=LOCAL_59^0x12;

		szID2[iPos]=LOCAL_59;

		iStacked=iStacked+LOCAL_59;
	}

	for(int i=0; i<iSeedLen; i++,iPos++) {
		if(((iPos>>3)<<3)==iPos) iPos=0;

		Seed2[iPos]=szSeed[i]^0x19;

		iStacked=iStacked+Seed2[iPos];
	}

	iStacked=iStacked&0x1FF;

	for(int i=0; i<16; i++) {
		static int LOCAL_59;
		Seed2[i]=Seed2[i]^hex[i];
		LOCAL_59=szID2[i]^Seed2[i];

		LOCAL_59=LOCAL_59&0x1FF;
		LOCAL_59=LOCAL_59-iStacked;

		if(LOCAL_59<0x0) {
			LOCAL_59=-LOCAL_59;
		}

		szResult[i]=(szNumberArray[LOCAL_59]+48);
	}

	printf("Key: %s\n",szResult);

	return 0;
}