source: pwntcha/trunk/src/livejournal/decoder.c @ 2317

Last change on this file since 2317 was 2317, checked in by Sam Hocevar, 12 years ago
  • Preparing a huge PWNtcha reorganisation. First step: put each decoder in its own subdirectory.
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1/*
2 * livejournal.c: decode livejournal captchas
3 * $Id: decoder.c 2317 2008-04-26 08:41:35Z 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
21static void find_glyphs(struct image *img);
22
23/* Our macros */
24char *result;
25
26/* Main function */
27char *decode_livejournal(struct image *img)
28{
29    struct image *tmp;
30
31    /* livejournal captchas have 7 characters */
32    result = malloc(8 * sizeof(char));
33    strcpy(result, "       ");
34
35    tmp = image_dup(img);
36    filter_detect_lines(tmp);
37    filter_fill_holes(tmp);
38    filter_median(tmp);
39//    filter_smooth(tmp);
40//    filter_contrast(tmp);
41    filter_threshold(tmp, 128);
42image_save(tmp, "foo.bmp");
43    find_glyphs(tmp);
44
45    image_free(tmp);
46
47    return result;
48}
49
50static void find_glyphs(struct image *img)
51{
52    static struct font *font = NULL;
53    struct image *tmp;
54    int x, y, i = 0;
55    int r, g, b;
56    int xmin, xmax, ymin, ymax, startx = 0, cur = 0;
57    int distmin, distx, disty, distch;
58
59    if(!font)
60    {
61        font = font_load_variable("x_font_freesansbold_32_09az.bmp",
62                                  "0123456789abcdefghijklmnopqrstuvwxyz");
63        if(!font)
64            exit(1);
65    }
66
67    tmp = image_new(img->width, img->height);
68
69    for(y = 0; y < img->height; y++)
70        for(x = 0; x < img->width; x++)
71        {
72            getpixel(img, x, y, &r, &g, &b);
73            setpixel(tmp, x, y, 255, g, 255);
74        }
75
76    while(cur < 7)
77    {
78        /* Try to find 1st letter */
79        distmin = INT_MAX;
80        for(i = 0; i < font->size; i++)
81        {
82int sqr;
83            int localmin = INT_MAX, localx, localy;
84            xmin = font->glyphs[i].xmin;
85            ymin = font->glyphs[i].ymin;
86            xmax = font->glyphs[i].xmax;
87            ymax = font->glyphs[i].ymax;
88sqr = sqrt(xmax - xmin);
89            for(y = -16; y < 8; y++)
90                for(x = 25 * cur; x < 25 * cur + 5; x++)
91                {
92                    int z, t, dist;
93                    dist = 0;
94                    for(t = 0; t < ymax - ymin; t++)
95                        for(z = 0; z < xmax - xmin; z++)
96                        {
97                            int r2;
98                            getgray(font->img, xmin + z, ymin + t, &r);
99                            getgray(img, x + z, y + t, &r2);
100                            dist += abs(r - r2);
101                        }
102                    //dist = dist * 128 / font->glyphs[i].count;
103                    dist = dist / (xmax - xmin) / sqr;
104                    if(dist < localmin)
105                    {
106                        localmin = dist;
107                        localx = x;
108                        localy = y;
109                    }
110                }
111            if(localmin < distmin)
112            {
113                distmin = localmin;
114                distx = localx;
115                disty = localy;
116                distch = i;
117            }
118        }
119
120        /* Print min glyph */
121        xmin = font->glyphs[distch].xmin;
122        ymin = font->glyphs[distch].ymin;
123        xmax = font->glyphs[distch].xmax;
124        ymax = font->glyphs[distch].ymax;
125        for(y = 0; y < ymax - ymin; y++)
126            for(x = 0; x < xmax - xmin; x++)
127            {
128                getpixel(font->img, xmin + x, ymin + y, &r, &g, &b);
129                if(r > 128)
130                    continue;
131                setpixel(tmp, distx + x, disty + y, r, g, b);
132            }
133
134        startx = distx + 20;
135        result[cur++] = font->glyphs[distch].c;
136    }
137
138image_save(tmp, "foo2.bmp");
139    image_free(tmp);
140}
141
Note: See TracBrowser for help on using the repository browser.