source: pwntcha/trunk/src/tickets.c @ 2315

Last change on this file since 2315 was 2315, checked in by Sam Hocevar, 12 years ago
  • Update build system and licensing terms to 2008 standards.
  • Property svn:keywords set to Id
File size: 2.8 KB
Line 
1/*
2 * tickets.c: decode tickets.com captchas
3 * $Id: tickets.c 2315 2008-04-26 07:25:03Z sam $
4 *
5 * Copyright: (c) 2005 Sam Hocevar <sam@zoy.org>
6 *  This program is free software. It comes without any warranty, to
7 *  the extent permitted by applicable law. You can redistribute it
8 *  and/or modify it under the terms of the Do What The Fuck You Want
9 *  To Public License, Version 2, as published by Sam Hocevar. See
10 *  http://sam.zoy.org/wtfpl/COPYING for more details.
11 */
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <limits.h>
17
18#include "config.h"
19#include "common.h"
20
21#define FONTS 8
22
23/* Main function */
24char *decode_tickets(struct image *img)
25{
26    static struct font *fonts[FONTS];
27    char *result;
28    struct image *tmp;
29    int x, y, r, g, b, cur, i, j, f;
30    int curx, bestx, besty;
31
32    for(i = 0; i < FONTS; i++)
33    {
34        if(!fonts[i])
35        {
36            char buf[BUFSIZ];
37            sprintf(buf, "font_tickets%i.png", i + 1);
38            fonts[i] = font_load_variable(buf, "0123456789");
39            if(!fonts[i])
40                exit(-1);
41        }
42    }
43
44    /* tickets.com captchas have 7 characters */
45    result = malloc(8 * sizeof(char));
46    strcpy(result, "       ");
47
48    /* captcha is jpeg; threshold the image */
49    tmp = image_dup(img);
50    filter_threshold(tmp, 127);
51
52    /* Guess all glyphs */
53    curx = 50;
54    for(cur = 0; cur < 7; cur++)
55    {
56        for(f = 0; f < FONTS; f++)
57        {
58            for(x = curx - 5; x < curx + 10; x++)
59            {
60                for(y = 5; y < 15; y++)
61                {
62                    for(i = 0; i < fonts[f]->size; i++)
63                    {
64                        int xmin, xmax, ymin, ymax;
65                        int t, z;
66
67                        xmin = fonts[f]->glyphs[i].xmin;
68                        ymin = fonts[f]->glyphs[i].ymin;
69                        xmax = fonts[f]->glyphs[i].xmax;
70                        ymax = fonts[f]->glyphs[i].ymax;
71                        for(t = 0; t < ymax - ymin; t++)
72                        {
73                            for(z = 0; z < xmax - xmin; z++)
74                            {
75                                int r, r2;
76                                getgray(fonts[f]->img, xmin + z, ymin + t, &r);
77                                getgray(tmp, x + z, y + t, &r2);
78                                if(r < 127 && r2 > 127)
79                                    goto char_failed;
80                            }
81                        }
82                        goto char_ok;
83                    char_failed:
84                        continue;
85                    }
86                }
87            }
88        }
89        result[cur] = '?';
90        curx += 10; /* XXX: totally random */
91        continue;
92    char_ok:
93        result[cur] = fonts[f]->glyphs[i].c;
94        curx = x + fonts[f]->glyphs[i].xmax - fonts[f]->glyphs[i].xmin;
95    }
96
97    image_free(tmp);
98
99    return result;
100}
101
Note: See TracBrowser for help on using the repository browser.