source: pwntcha/trunk/src/lmt.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: 3.6 KB
RevLine 
[459]1/*
2 * lmt.c: decode lmt.lv captchas
3 * $Id: lmt.c 2315 2008-04-26 07:25:03Z sam $
4 *
5 * Copyright: (c) 2005 Sam Hocevar <sam@zoy.org>
[2315]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.
[459]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_lmt(struct image *img)
28{
29    struct image *tmp;
30
31    /* lmt captchas have 3 characters */
32    result = malloc(4 * sizeof(char));
33    strcpy(result, "   ");
34
35    tmp = image_dup(img);
36    filter_contrast(tmp);
37    filter_black_stuff(tmp);
[461]38    filter_smooth(tmp);
39    filter_median(tmp);
[459]40    find_glyphs(tmp);
41
42    image_free(tmp);
43
44    return result;
45}
46
47static void find_glyphs(struct image *img)
48{
49#define DELTA 2
50    static struct font *font;
51    int x, y, i = 0;
52    int r, g, b;
53    int xmin, xmax, ymin, ymax, startx = 0, cur = 0;
54    int bestdist, bestx, besty, bestch;
55
56    if(!font)
57    {
58        font = font_load_variable("font_freesans_24_09AZ.bmp",
59                                  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
[461]60        filter_smooth(font->img);
[459]61        if(!font)
62            exit(1);
63    }
64
65    while(cur < 3)
66    {
67        /* Try to find 1st letter */
68        bestdist = INT_MAX;
69        for(i = 0; i < font->size; i++)
70        {
71            int localmin = INT_MAX, localx, localy;
72            xmin = font->glyphs[i].xmin - DELTA;
73            ymin = font->glyphs[i].ymin;
74            xmax = font->glyphs[i].xmax + DELTA;
75            ymax = font->glyphs[i].ymax;
76            for(y = -5; y < 5; y++)
77            {
78                for(x = startx; x < startx + 15; x++)
79                {
80                    int z, t, dist;
81                    dist = 0;
82                    for(t = 0; t < ymax - ymin; t++)
83                        for(z = 0; z < xmax - xmin; z++)
84                        {
85                            int r2;
86                            getgray(font->img, xmin + z, ymin + t, &r);
87                            getgray(img, x + z, y + t, &r2);
88                            dist += (r - r2) * (r - r2);
89                        }
90                    dist  = dist / (xmax - xmin - 2 * DELTA);
91                    if(dist < localmin)
92                    {
93                        localmin = dist;
94                        localx = x;
95                        localy = y;
96                    }
97                }
98            }
99            if(localmin < bestdist)
100            {
101                bestdist = localmin;
102                bestx = localx;
103                besty = localy;
104                bestch = i;
105            }
106        }
107
108        /* Print min glyph */
109#if 0
110        xmin = font->glyphs[bestch].xmin - DELTA;
111        ymin = font->glyphs[bestch].ymin;
112        xmax = font->glyphs[bestch].xmax + DELTA;
113        ymax = font->glyphs[bestch].ymax;
114        for(y = 0; y < ymax - ymin; y++)
115            for(x = 0; x < xmax - xmin; x++)
116            {
117                getpixel(font->img, xmin + x, ymin + y, &r, &g, &b);
118                if(r > 128)
119                {
120                    getpixel(img, bestx + x, besty + y, &r, &g, &b);
121                    r = 255;
122                }
123                setpixel(img, bestx + x, besty + y, r, g, b);
124            }
125#endif
126
127        startx = bestx + font->glyphs[bestch].xmax - font->glyphs[bestch].xmin;
128        result[cur++] = font->glyphs[bestch].c;
129    }
130}
131
Note: See TracBrowser for help on using the repository browser.