Snippets

Alexander Hanel Generate track 1 and track 2 data in memory

Created by Alexander Hanel last modified
/*
	Author: Alexander Hanel
	Description: Poorly written C code that generates fake track 1 and track 2 credit card data. 
	Execute and then kill process when done. It will generate 1000 credit card numbers, sleep
	for five seconds and then generate another 1000 credit card numbers. All the cards will be 
	expired. 
	Example Output: 

	B2223822903672586^Hartfield/Lamonica^1101000000001000000510525607?;2223822903672586=1101424000000835291?
	B2225310582889943^Beller/Paul^0007000000001000000016751550?
	B2225310582889943^Beller/Paul^0007000000001000000016751550?;2225310582889943=0007157000000293994?
	B6011328218622347^Kline/Michiko^0900000000001000000368112686?
	B6011328218622347^Kline/Michiko^0900000000001000000368112686?;6011328218622347=0900243000000033023?
	B6011575512190344^Beller/Sylvia^0906000000001000000861587285?
	B6011575512190344^Beller/Sylvia^0906000000001000000861587285?;6011575512190344=0906704000000414244?
	B6011814402428468^Hartfield/Salvador^0811000000001000000002005270?
	B6011814402428468^Hartfield/Salvador^0811000000001000000002005270?;60

	Note: In memory the track data starts with "%B" but the output starts with "B", not sure why but it works.   	
	Useful read - http://blog.opensecurityresearch.com/2012/02/deconstructing-credit-cards-data.html
*/

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
#include <string.h>
#include <windows.h>


struct Credit{
	char t1[80];
	// hands down the best 90s action movie. 
	char t2[120];
};

unsigned int rand_interval(unsigned int min, unsigned int max)
{
	/* Source - http://stackoverflow.com/a/17554531 */
    int r;
    const unsigned int range = 1 + max - min;
    const unsigned int buckets = RAND_MAX / range;
    const unsigned int limit = buckets * range;

    /* Create equal size buckets all in a row, then fire randomly towards
     * the buckets until you land in one of them. All buckets are equally
     * likely. If you land off the end of the line of buckets, try again. */
    do
    {
        r = rand();
    } while (r >= limit);

    return min + (r / buckets);
}

unsigned int generateSum(const char* cc)
{
	int i = strlen( cc );
	int digits = 0;
	char digitv = 0;
	
	while(i--){
		digitv = cc[i] - '0';
        digitv <<= !( i % 2 );
        digitv -=  9 * ( digitv > 9 );
        digits += digitv;
	}
	digits = (digits * 9 ) % 10;
	return digits;
}

const char * createPan()
{
	int ccSize = 16;
	char *cc = (char *)malloc(ccSize+1);
	memset(cc, 0, sizeof(cc));
	char temp[2];
	
	const char *CCPrefix[] = {"4556", "4916", "4532", "4929", "2221", "2222", "2223", "2224", "2225", "2226", "6011" }; 
	
	strcpy(cc, CCPrefix[rand_interval(0,10)]);
	// prefix is 4, 11 is random and 1 is for the sum. 
	for (int k=0; k < 11; k++){
		sprintf(temp, "%d", rand_interval(0,9));
		strcat(cc, temp );
	}
	sprintf(temp, "%d", generateSum(cc));
	strcat(cc, temp );
	return cc;
}

const char * createDiscretionaryData ()
{
	char temp[2];
	int ddSize = 24;
	char *dd = (char *)malloc(ddSize+1);
	strcpy(dd,"000000001000000");
	for (int k=0; k < 9; k++){
		sprintf(temp, "%d", rand_interval(0,9));
		strcat(dd, temp );
	}
	return dd;
}

const char * createDiscretionaryDataTrack2 ()
{
	char temp[2];
	int ddSize = 24;
	char *dd = (char *)malloc(ddSize+1);
	strcpy(dd,"000000");
	for (int k=0; k < 6; k++){
		sprintf(temp, "%d", rand_interval(0,9));
		strcat(dd, temp );
	}
	return dd;
}

const char * createFirstName()
{
	const char *firstName[] = {"Anya", "Mark", "Elaine", "Gwendolyn", "Darrell", "Luigi", "Hans", "Jeromy", "Franz", "Marie", "Sylvia", "Alexander", "Salvador", "Lyman", "Nick", "Nikole", "Jackson", "Michiko", "Xiao", "Lamonica", "Paul", "Edward", "Felipe", "Jeanelle", "Willem", "Louetta", "Delinda", "Raphael", "Ewa", "Ginny"};
	return firstName[rand_interval(0,20)];
}

const char * createLastName()
{
	const char *lastName[] = {"Beller", "Haugen", "Kennell", "de Kooning", "Duong", "Lefkowitz", "Hansel", "Murtagh", "Heuser", "Orear", "Kline", "Calder", "Hartfield", "Pollack", "Langhorne", "Olmsted", "Arens", " Willem", "Sidhu", "Bacon", "Hopper", "Rothko", "Cezanne", "Gutierez", "Bollin", "Vierra", "Dupuis", "Hunt", "Swiger", "Dali"};
	return lastName[rand_interval(0,20)];
}

struct Credit createTrack()
{
	struct Credit cc_t;
	char pan[17]; 
	int month = rand_interval(0,12);
	int year = rand_interval(0,17); 
	
	strcpy(pan,createPan());

	sprintf(cc_t.t1, "%%B%s^%s/%s^%02d%02d%s?", pan , createLastName(), createFirstName(), year, month, createDiscretionaryData());
	sprintf(cc_t.t2,"%s;%s=%02d%02d%03d%s?", cc_t.t1, pan, year, month, rand_interval(0,999), createDiscretionaryDataTrack2());
	return cc_t;
}

int main()
{
	srand(time(NULL));
	Credit cct[1000];
	while(1){
		for (int k=0; k < 1000; k++){
			cct[k] = createTrack();
			printf(cct[k].t1);
			printf("\n");
			printf(cct[k].t2);
			printf("\n");
		}
		printf("1000 CCs generated. Sleeping for 5 seconds\n");
		Sleep( 1000 * 5 );
	}
    return(0);
}



Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.