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

Last change on this file since 482 was 482, checked in by Sam Hocevar, 15 years ago
  • filter_equalize -> filter_threshold
  • Property svn:keywords set to Id
File size: 2.8 KB
Line 
1/*
2 * tickets.c: decode tickets.com captchas
3 * $Id: tickets.c 482 2005-05-30 15:22:02Z sam $
4 *
5 * Copyright: (c) 2005 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 <limits.h>
16
17#include "config.h"
18#include "common.h"
19
20#define FONTS 8
21
22/* Main function */
23char *decode_tickets(struct image *img)
24{
25    static struct font *fonts[FONTS];
26    char *result;
27    struct image *tmp;
28    int x, y, r, g, b, cur, i, j, f;
29    int curx, bestx, besty;
30
31    for(i = 0; i < FONTS; i++)
32    {
33        if(!fonts[i])
34        {
35            char buf[BUFSIZ];
36            sprintf(buf, "font_tickets%i.png", i + 1);
37            fonts[i] = font_load_variable(buf, "0123456789");
38            if(!fonts[i])
39                exit(-1);
40        }
41    }
42
43    /* tickets.com captchas have 7 characters */
44    result = malloc(8 * sizeof(char));
45    strcpy(result, "       ");
46
47    /* captcha is jpeg; threshold the image */
48    tmp = image_dup(img);
49    filter_threshold(tmp, 127);
50
51    /* Guess all glyphs */
52    curx = 50;
53    for(cur = 0; cur < 7; cur++)
54    {
55        for(f = 0; f < FONTS; f++)
56        {
57            for(x = curx - 5; x < curx + 10; x++)
58            {
59                for(y = 5; y < 15; y++)
60                {
61                    for(i = 0; i < fonts[f]->size; i++)
62                    {
63                        int xmin, xmax, ymin, ymax;
64                        int t, z;
65
66                        xmin = fonts[f]->glyphs[i].xmin;
67                        ymin = fonts[f]->glyphs[i].ymin;
68                        xmax = fonts[f]->glyphs[i].xmax;
69                        ymax = fonts[f]->glyphs[i].ymax;
70                        for(t = 0; t < ymax - ymin; t++)
71                        {
72                            for(z = 0; z < xmax - xmin; z++)
73                            {
74                                int r, r2;
75                                getgray(fonts[f]->img, xmin + z, ymin + t, &r);
76                                getgray(tmp, x + z, y + t, &r2);
77                                if(r < 127 && r2 > 127)
78                                    goto char_failed;
79                            }
80                        }
81                        goto char_ok;
82                    char_failed:
83                        continue;
84                    }
85                }
86            }
87        }
88        result[cur] = '?';
89        curx += 10; /* XXX: totally random */
90        continue;
91    char_ok:
92        result[cur] = fonts[f]->glyphs[i].c;
93        curx = x + fonts[f]->glyphs[i].xmax - fonts[f]->glyphs[i].xmin;
94    }
95
96    image_free(tmp);
97
98    return result;
99}
100
Note: See TracBrowser for help on using the repository browser.