source: pwntcha/trunk/src/main.c @ 1003

Last change on this file since 1003 was 1003, checked in by sam, 8 years ago
  • Started working on ticketmaster captcha.
  • Property svn:keywords set to Id
File size: 8.3 KB
Line 
1/*
2 * main.c: main function
3 * $Id$
4 *
5 * Copyright: (c) 2004 Sam Hocevar <sam@zoy.org>
6 *   This program is free software; you can redistribute it and/or
7 *   modify it under the terms of the Do What The Fuck You Want To
8 *   Public License as published by Banlu Kemiyatorn. See
9 *   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <getopt.h>
16#include <stdarg.h>
17
18#include "config.h"
19#include "common.h"
20
21#ifdef HAVE_GETOPT_LONG
22#   define MOREINFO "Try `%s --help' for more information.\n"
23#else
24#   define MOREINFO "Try `%s -h' for more information.\n"
25#endif
26
27/* Used for the debug messages */
28char *argv0 = NULL;
29char *share = NULL;
30int debug = 1;
31
32int main(int argc, char *argv[])
33{
34    char *mode = "auto";
35    int c;
36    int digit_optind = 0;
37
38    argv0 = argv[0];
39    share = "share";
40
41    for(;;)
42    {
43        int this_option_optind = optind ? optind : 1;
44#ifdef HAVE_GETOPT_LONG
45        int option_index = 0;
46        static struct option long_options[] =
47        {
48            { "help", 0, 0, 'h' },
49            { "mode", 1, 0, 'm' },
50            { "share", 1, 0, 's' },
51            { "quiet", 0, 0, 'q' },
52            { "version", 0, 0, 'v' },
53            { 0, 0, 0, 0 }
54        };
55
56        c = getopt_long(argc, argv, "hm:s:qv", long_options, &option_index);
57#else
58        c = getopt(argc, argv, "hm:s:qv");
59#endif
60        if(c == -1)
61            break;
62
63        switch(c)
64        {
65        case 'h': /* --help */
66            printf("Usage: %s [OPTION]... IMAGE...\n", argv[0]);
67#ifdef HAVE_GETOPT_LONG
68            printf("  -m, --mode <mode>  force operating mode\n");
69            printf("  -s, --share <dir>  specify shared dir\n");
70            printf("  -q, --quiet        do not print information messages\n");
71            printf("  -h, --help         display this help and exit\n");
72            printf("  -v, --version      output version information and exit\n");
73#else
74            printf("  -m <mode>   force operating mode\n");
75            printf("  -s <dir>    specify shared dir\n");
76            printf("  -q          do not print information messages\n");
77            printf("  -h          display this help and exit\n");
78            printf("  -v          output version information and exit\n");
79#endif
80            return 0;
81        case 'm': /* --mode */
82            mode = optarg;
83            break;
84        case 'q': /* --quiet */
85            debug = 0;
86            break;
87        case 's': /* --quiet */
88            share = optarg;
89            break;
90        case 'v': /* --version */
91            printf("pwntcha (captcha decoder) %s\n", VERSION);
92            printf("Written by Sam Hocevar.\n");
93            printf("\n");
94            printf("Copyright (C) 2004-2005 Sam Hocevar <sam@zoy.org>\n");
95            printf("This is free software; see the source for copying conditions.  There is NO\n");
96            printf("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
97            return 0;
98        case '?':
99            printf(MOREINFO, argv[0]);
100            return 1;
101        default:
102            printf("%s: invalid option -- %i\n", argv[0], c);
103            printf(MOREINFO, argv[0]);
104            return 1;
105        }
106    }
107
108    if(optind >= argc)
109    {
110        printf("%s: too few arguments\n", argv[0]);
111        printf(MOREINFO, argv[0]);
112        return 1;
113    }
114
115    for(; optind < argc; optind++)
116    {
117        char *input = argv[optind], *result;
118        struct image *img;
119        int count;
120
121        img = image_load(argv[optind]);
122        if(!img)
123        {
124            pwnprint("cannot load %s\n", input);
125            printf("\n");
126            continue;
127        }
128
129        count = filter_count(img);
130        pwnprint("image size %ix%i, %i colours\n",
131                 img->width, img->height, count);
132
133        if(!strcmp(mode, "test"))
134            result = decode_test(img);
135        else if(!strcmp(mode, "authimage"))
136            result = decode_authimage(img);
137        else if(!strcmp(mode, "clubic"))
138            result = decode_clubic(img);
139        else if(!strcmp(mode, "java"))
140            result = decode_java(img);
141        else if(!strcmp(mode, "linuxfr"))
142            result = decode_linuxfr(img);
143        else if(!strcmp(mode, "livejournal"))
144            result = decode_livejournal(img);
145        else if(!strcmp(mode, "lmt"))
146            result = decode_lmt(img);
147        else if(!strcmp(mode, "paypal"))
148            result = decode_paypal(img);
149        else if(!strcmp(mode, "phpbb"))
150            result = decode_phpbb(img);
151        else if(!strcmp(mode, "scode"))
152            result = decode_scode(img);
153        else if(!strcmp(mode, "slashdot"))
154            result = decode_slashdot(img);
155        else if(!strcmp(mode, "vbulletin"))
156            result = decode_vbulletin(img);
157        else if(!strcmp(mode, "xanga"))
158            result = decode_xanga(img);
159        else
160        {
161            if(img->width == 155 && img->height == 50)
162            {
163                pwnprint("probably an authimage captcha\n");
164                result = decode_authimage(img);
165            }
166            else if(img->width == 175 && img->height == 35)
167            {
168                pwnprint("probably a livejournal captcha\n");
169                result = decode_livejournal(img);
170            }
171            else if(img->width == 100 && img->height == 40 && count < 6)
172            {
173                pwnprint("probably a linuxfr captcha\n");
174                result = decode_linuxfr(img);
175            }
176            else if(img->width == 69 && img->height == 35)
177            {
178                pwnprint("probably a lmt.lv captcha\n");
179                result = decode_lmt(img);
180            }
181            else if(img->width == 208 && img->height == 26)
182            {
183                pwnprint("probably a Paypal captcha\n");
184                result = decode_paypal(img);
185            }
186            else if(img->width == 320 && img->height == 50)
187            {
188                pwnprint("probably a phpBB captcha\n");
189                result = decode_phpbb(img);
190            }
191            else if(img->width == 170 && img->height == 50)
192            {
193                pwnprint("probably a Xanga captcha\n");
194                result = decode_xanga(img);
195            }
196            else if(img->height <= 40 && count < 10)
197            {
198                pwnprint("probably a scode/trencaspammers captcha\n");
199                result = decode_scode(img);
200            }
201            else if(img->height <= 30 && count < 100)
202            {
203                pwnprint("probably a clubic captcha\n");
204                result = decode_clubic(img);
205            }
206            else if(img->height == 69)
207            {
208                pwnprint("probably a slashdot captcha\n");
209                result = decode_slashdot(img);
210            }
211            else if(img->width == 200 && img->height == 100)
212            {
213                pwnprint("probably a java captcha\n");
214                result = decode_java(img);
215            }
216            else if(img->width == 290 && img->height == 80)
217            {
218                pwnprint("probably a ticketmaster captcha\n");
219                result = decode_ticketmaster(img);
220            }
221            else if(img->width == 200 && img->height == 40)
222            {
223                pwnprint("probably a tickets.com captcha\n");
224                result = decode_tickets(img);
225            }
226            else if(img->height == 61)
227            {
228                pwnprint("probably a vbulletin captcha\n");
229                result = decode_vbulletin(img);
230            }
231            else if(img->width == 480 && img->height == 360 && count == 253)
232            {
233                pwnprint("probably not a captcha\n");
234                result = decode_easter_eggs(img);
235            }
236            else
237            {
238                pwnprint("could not guess captcha type\n");
239                printf("\n");
240                image_free(img);
241                continue;
242            }
243        }
244
245        image_free(img);
246
247        if(!result)
248        {
249            pwnprint("sorry, decoding failed\n");
250            printf("\n");
251            continue;
252        }
253
254        printf("%s\n", result);
255        fflush(stdout);
256        free(result);
257    }
258
259    return 0;
260}
261
262void pwnprint(const char *fmt, ...)
263{
264    va_list args;
265
266    if(!debug)
267        return;
268
269    va_start(args, fmt);
270    fprintf(stderr, "%s: ", argv0);
271    vfprintf(stderr, fmt, args);
272    va_end(args);
273}
274
Note: See TracBrowser for help on using the repository browser.