Changeset 453


Ignore:
Timestamp:
01/12/05 03:28:37 (8 years ago)
Author:
sam
Message:
  • attempt at the xanga decoder. roughly 50% success.
  • fonts useful to the xanga decoder. x_* fonts are convert'ed with -blur 3.
Location:
pwntcha/trunk
Files:
12 added
2 edited

Legend:

Unmodified
Added
Removed
  • pwntcha/trunk/src/main.c

    r448 r453  
    210210 
    211211        printf("%s\n", result); 
     212        fflush(stdout); 
    212213        free(result); 
    213214    } 
  • pwntcha/trunk/src/xanga.c

    r448 r453  
    2020 
    2121static void fill_white_holes(struct image *img); 
     22static void find_glyphs(struct image *img); 
     23 
     24static char *result; 
    2225 
    2326/* Main function */ 
    2427char *decode_xanga(struct image *img) 
    2528{ 
    26     static struct font *font1 = NULL, *font2 = NULL, *font3 = NULL; 
    2729    struct image *tmp; 
    28     char *result; 
    29  
    30     if(!font1) 
    31     { 
    32         font1 = font_load_variable("font_freemonobold_32_az.bmp", 
    33                                    "abcdefghijklmnopqrstuvwxyz"); 
    34         if(!font1) 
    35             exit(1); 
    36     } 
    37  
    38     if(!font2) 
    39     { 
    40         font2 = font_load_variable("font_freemonobold_32_az.bmp", 
    41                                    "abcdefghijklmnopqrstuvwxyz"); 
    42         if(!font2) 
    43             exit(1); 
    44     } 
    45  
    46     if(!font3) 
    47     { 
    48         font3 = font_load_variable("font_freemonobold_32_az.bmp", 
    49                                    "abcdefghijklmnopqrstuvwxyz"); 
    50         if(!font3) 
    51             exit(1); 
    52     } 
    53  
    54     /* Xanga captchas have 7 characters */ 
    55     result = malloc(8 * sizeof(char)); 
    56     strcpy(result, "       "); 
     30 
     31    /* Xanga captchas have 6 characters */ 
     32    result = malloc(7 * sizeof(char)); 
     33    strcpy(result, "      "); 
    5734 
    5835    tmp = image_dup(img); 
     
    6542    fill_white_holes(tmp); 
    6643//    filter_fill_holes(tmp); 
     44    filter_smooth(tmp); 
     45    //filter_median(tmp); 
    6746image_save(tmp, "xanga3.bmp"); 
    6847    //filter_detect_lines(tmp); 
    6948//    filter_median(tmp); 
    7049//image_save(tmp, "xanga4.bmp"); 
    71     filter_equalize(tmp, 128); 
     50//    filter_equalize(tmp, 128); 
     51    filter_contrast(tmp); 
    7252image_save(tmp, "xanga4.bmp"); 
    73 return NULL; 
    74  
     53 
     54#if 0 
    7555    /* Detect small objects to guess image orientation */ 
    7656    filter_median(tmp); 
     
    7959    /* Invert rotation and find glyphs */ 
    8060    filter_median(tmp); 
     61#endif 
     62    find_glyphs(tmp); 
     63image_save(tmp, "xanga5.bmp"); 
    8164 
    8265    /* Clean up our mess */ 
     
    131114} 
    132115 
     116static void find_glyphs(struct image *img) 
     117{ 
     118#define FONTS 6 
     119    static struct font *fonts[FONTS]; 
     120    static char *files[] = 
     121    { 
     122        "x_font_freemonobold_32_az.bmp", "abcdefghijklmnopqrstuvwxyz", 
     123        "x_font_freemonobold_24_az.bmp", "abcdefghijklmnopqrstuvwxyz", 
     124        "x_font_freesansbold_32_az.bmp", "abcdefghijklmnopqrstuvwxyz", 
     125        //"x_font_freeserifbold_32_az.bmp", "abcdefghijklmnopqrstuvwxyz", 
     126        "x_font_comic_32_az.bmp", "abcdefghijklmnopqrstuvwxyz", 
     127        "x_font_comic_24_az_messed.bmp", "abcdefghijklmnopqrstuvwxyz", 
     128        "x_font_freesansbold_36_az_messed.bmp", "abcdefghijklmnopqrstuvwxyz", 
     129    }; 
     130    struct image *tmp; 
     131    int x, y, i = 0, f; 
     132    int r, g, b; 
     133    int xmin, xmax, ymin, ymax, startx = 10, cur = 0; 
     134    int bestdist, bestfont, bestx, besty, bestch; 
     135 
     136    for(f = 0; f < FONTS; f++) 
     137    { 
     138        if(!fonts[f]) 
     139        { 
     140            fonts[f] = font_load_variable(files[f * 2], files[f * 2 + 1]); 
     141            if(!fonts[f]) 
     142                exit(1); 
     143            //filter_smooth(fonts[f]->img); 
     144            //filter_contrast(fonts[f]->img); 
     145        } 
     146    } 
     147 
     148    tmp = image_new(img->width, img->height); 
     149 
     150    for(y = 0; y < img->height; y++) 
     151        for(x = 0; x < img->width; x++) 
     152        { 
     153            getpixel(img, x, y, &r, &g, &b); 
     154            setpixel(tmp, x, y, 255, g, 255); 
     155        } 
     156 
     157    while(cur < 6) 
     158    { 
     159        /* Try to find 1st letter */ 
     160        bestdist = INT_MAX; 
     161        for(f = 0; f < FONTS; f++) for(i = 0; i < fonts[f]->size; i++) 
     162        { 
     163            int localmin = INT_MAX, localx, localy; 
     164int sqr; 
     165            if(fonts[f]->glyphs[i].c == 'l' || fonts[f]->glyphs[i].c == 'z') 
     166                continue; 
     167            xmin = fonts[f]->glyphs[i].xmin - 5; 
     168            ymin = fonts[f]->glyphs[i].ymin - 3; 
     169            xmax = fonts[f]->glyphs[i].xmax + 5; 
     170            ymax = fonts[f]->glyphs[i].ymax + 3; 
     171sqr = sqrt(xmax - xmin); 
     172            for(y = -15; y < 15; y++) 
     173                //for(x = startx; x < startx + 15; x++) 
     174                for(x = 22 - (xmax - xmin) / 2 + 25 * cur; x < 28 - (xmax - xmin) / 2 + 25 * cur; x++) 
     175                { 
     176                    int z, t, dist; 
     177                    dist = 0; 
     178                    for(t = 0; t < ymax - ymin; t++) 
     179                        for(z = 0; z < xmax - xmin; z++) 
     180                        { 
     181                            int r2; 
     182                            getgray(fonts[f]->img, xmin + z, ymin + t, &r); 
     183                            getgray(img, x + z, y + t, &r2); 
     184                            if(r < r2) 
     185                                dist += (r - r2) * (r - r2); 
     186                            else 
     187                                dist += (r - r2) * (r - r2) * 3 / 4; 
     188                        } 
     189    //                printf("%i %i -> %i\n", x, y, dist); 
     190//                    dist /= (xmax - xmin); 
     191//                    dist = dist / sqrt((ymax - ymin) * (xmax - xmin)) / (xmax - xmin); 
     192                    dist = dist / (xmax - xmin) / sqr; 
     193//                    dist = dist * 128 / fonts[f]->glyphs[i].count; 
     194                    if(dist < localmin) 
     195                    { 
     196                        localmin = dist; 
     197                        localx = x; 
     198                        localy = y; 
     199                    } 
     200                } 
     201            //fprintf(stderr, "%i (%i,%i)\n", localmin, localx - startx, localy); 
     202            if(localmin < bestdist) 
     203            { 
     204//printf("  bestch is now %i (%c) in font %i\n", i, fonts[f]->glyphs[i].c, f); 
     205                bestdist = localmin; 
     206                bestfont = f; 
     207                bestx = localx; 
     208                besty = localy; 
     209                bestch = i; 
     210            } 
     211        } 
     212//printf("%i (%c) in font %i\n", i, fonts[bestfont]->glyphs[bestch].c, bestfont); 
     213//printf("%i < %i < %i\n", 10 + 25 * cur, bestx, 30 + 25 * cur); 
     214 
     215        /* Draw best glyph in picture (debugging purposes) */ 
     216        xmin = fonts[bestfont]->glyphs[bestch].xmin - 5; 
     217        ymin = fonts[bestfont]->glyphs[bestch].ymin - 3; 
     218        xmax = fonts[bestfont]->glyphs[bestch].xmax + 5; 
     219        ymax = fonts[bestfont]->glyphs[bestch].ymax + 3; 
     220        for(y = 0; y < ymax - ymin; y++) 
     221            for(x = 0; x < xmax - xmin; x++) 
     222            { 
     223                getpixel(fonts[bestfont]->img, xmin + x, ymin + y, &r, &g, &b); 
     224                if(r > 128) continue; 
     225                setpixel(tmp, bestx + x, besty + y, r, g, b); 
     226            } 
     227 
     228        startx = bestx + xmax - xmin; 
     229        result[cur++] = fonts[bestfont]->glyphs[bestch].c; 
     230    } 
     231 
     232    image_swap(img, tmp); 
     233    image_free(tmp); 
     234} 
     235 
Note: See TracChangeset for help on using the changeset viewer.