Snippets
Created by
Alexander Hanel
last modified
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | /*
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)
You can clone a snippet to your computer for local editing. Learn more.