본문으로 바로가기

1. 바이너리 파일 읽기

1
2
3
4
5
6
7
8
9
10
11
fread(buffer, 1001, in);
for (int j = 0; j < sizeof(buffer); ++j)
{
    if (buffer[j] < 0xffffff00)
    {
        printf("\n\n%x\n\n", buffer[j]);
        printf("\n\n%x\n\n", buffer[j] ^ 0xffffff00);
        buffer[j] = (buffer[j] ^ 0xffffff00);
        printf("\n\n%x\n\n", buffer[j]);
    }
}
cs


처음에 바이너리를 BUFFER에다가 저장하고 이안에있는 내용을 %x로 출력해보았더니 aa나 a1등 읽은 내용에 0xffffffaa이런식으로 0xffffff이 붙었다. (파일 포인터는 rb형태)

하지만 이것이 모든내용에 다적용이되면 비교값에 0xffffff를 붙여서 비교하면되는데, 값이 숫자로만 이루어져있을때(예를 들어 11,12등)는 11이런식으로 바로 저장된다. 그렇기때문에 아래와같이 0xffffff00보다 값이더 작으면 저거랑 xor을 해서 값자체를 읽은값 두자리로 만들어 보려했으나, xor해서 출력하면 잘되는데 그상태로 저장해서 출력하면 또 0xffffff가 붙어서 출력된다. 이것을보아 저장자체에서 저런식으로 변하는듯 싶다. 그런데 비교하려면 한번 비교하는게아니라 여러가지를 비교해야하기때문에 하나씩 그값을 비교하고 비교구문 자체에 xor연산을 넣기에는 코드가 너무많이 복잡해져서 어쩔수없이 손으로 직접 코드를 수정해주려고했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
if (buffer[0== 0xffffffaa && buffer[1== 0xffffffaa)
    {
        printf("Testing File Mady By Youngjoo\n");
    }
    if (buffer[3== 0xffffffaf && buffer[4== 0x11)
    {
        printf("FLI \nGraphics – Autodesk Animator\n");
    }
    if (buffer[4== 0xffffffaf && buffer[5== 0x12)
    {
        printf("FLC \nGraphics – Autodesk 3D Studio\n");
    }
    if (buffer[2== 0xffffff2D && buffer[3== 0xffffff6C && buffer[4== 0xffffff68 && buffer[5== 0xffffff35 && buffer[6== 0xffffff2D)
    {
        printf("LZH \nArchive – LHA Compressed Archive File\n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff00 && buffer[3== 0xffffff02)
    {
        printf("MAC \nGraphics – MAC Picture Format\n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff00 && buffer[3== 0xffffff14 && buffer[4== 0xffffff66 && buffer[5== 0xffffff74 && buffer[6== 0xffffff79 && buffer[7== 0xffffff70 && buffer[8== 0xffffff33 && buffer[9== 0xffffff67 && buffer[10== 0xffffff70)
    {
        printf("3GG \n3rd Generation Partnership Project 3GPP \n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff00 && buffer[3== 0xffffff20 && buffer[4== 0xffffff66 && buffer[5== 0xffffff74 && buffer[6== 0xffffff79 && buffer[7== 0xffffff70 && buffer[8== 0xffffff33 && buffer[9== 0xffffff67 && buffer[10== 0xffffff70 && buffer[11!= 0xffffff35)
    {
        printf("3G2 \n3GPP2 Multimedia File\n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff00 && buffer[3== 0xffffff18 && buffer[4== 0xffffff66 && buffer[5== 0xffffff74 && buffer[6== 0xffffff79 && buffer[7== 0xffffff70 && buffer[8== 0xffffff33 && buffer[9== 0xffffff67 && buffer[10== 0xffffff70 && buffer[11== 0xffffff35)
    {
        printf("MP4 \nMPEG-4 Video File\n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff01 && buffer[3== 0xffffff00)
    {
        printf("ICO \nGraphics – Windows Icon Format");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff01 && (buffer[3== 0xffffffb1 || buffer[3== 0xffffffb2 || buffer[3== 0xffffffb3 || buffer[3== 0xffffffb4 || buffer[3== 0xffffffb5 || buffer[3== 0xffffffb6 || buffer[3== 0xffffffb7 || buffer[3== 0xffffffb8 || buffer[3== 0xffffffb9 || buffer[3== 0xffffffba || buffer[3== 0xffffffbb || buffer[3== 0xffffffbc || buffer[3== 0xffffffbd || buffer[3== 0xffffffbe || buffer[3== 0xffffffbf))
    {
        printf("MPG \nMPEG Video File\n");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff02 && buffer[3== 0xffffff00 && buffer[4!= 0xffffff04 && buffer[4!= 0xffffff05 && buffer[4!= 0xffffff06)
    {
        printf("1. CUR \nGraphics – Windows Cursor File \n2. WB2 \nSpreadsheet – QuattroPro");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff02 && buffer[3== 0xffffff00 && buffer[4== 0xffffff04 && buffer[5== 0xffffff04)
    {
        printf("WKS \nSpreadsheet – Lotus 1-2-3");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff02 && buffer[3== 0xffffff00 && buffer[4== 0xffffff05 && buffer[5== 0xffffff04)
    {
        printf("WRK \nSpreadsheet – Symphony");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff02 && buffer[3== 0xffffff00 && buffer[4== 0xffffff06 && buffer[5== 0xffffff04)
    {
        printf("1. WR1 \nSpreadsheet – Symphony \n2. Spreadsheet \n Lotus 1-2-3");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff1A && buffer[3== 0xffffff00 && buffer[4== 0xffffff00 && buffer[5== 0xffffff10)
    {
        printf("WK3 \nSpreadsheet – Lotus 1-2-3");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffff49 && buffer[3== 0xffffff49 && buffer[4== 0xffffff58 && buffer[5== 0xffffff50 && buffer[5== 0xffffff52)
    {
        printf("QXD \nQuark Express Document (dependant endian)");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff00 && buffer[2== 0xffffffEF && buffer[3== 0xffffffFF)
    {
        printf("--- \nByte-order mark for 32-bit Unicode Transformation");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff01 && buffer[2== 0xffffff00 && buffer[3== 0xffffff00 && buffer[4== 0xffffff4D && buffer[5== 0xffffff53 && buffer[6== 0xffffff49 && buffer[7== 0xffffff53 && buffer[8== 0xffffff41 && buffer[9== 0xffffff4D && buffer[10== 0xffffff20 && buffer[11== 0xffffff44 && buffer[12== 0xffffff61 && buffer[13== 0xffffff74 && buffer[14== 0xffffff61 && buffer[15== 0xffffff74 && buffer[16== 0xffffff61 && buffer[17== 0xffffff62 && buffer[18== 0xffffff61 && buffer[19== 0xffffff73 && buffer[20== 0xffffff65)
    {
        printf("MNY \nMicrosoft Money File");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff01 && buffer[2== 0xffffff00 && buffer[3== 0xffffff00 && buffer[4== 0xffffff53 && buffer[5== 0xffffff74 && buffer[6== 0xffffff61 && buffer[7== 0xffffff72 && buffer[8== 0xffffff64 && buffer[9== 0xffffff61 && buffer[10== 0xffffff72 && buffer[11== 0xffffff64 && buffer[12== 0xffffff20 && buffer[13== 0xffffff4A && buffer[14== 0xffffff65 && buffer[15== 0xffffff74 && buffer[16== 0xffffff20 && buffer[17== 0xffffff44 && buffer[18== 0xffffff42)
    {
        printf("MDB \nDatabase – Microsoft Access File");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff01 && buffer[2== 0xffffff00 && buffer[3== 0xffffff08)
    {
        printf("IMG \nGraphics – GEM Image Format");
    }
    if (buffer[0== 0xffffff00 && buffer[1== 0xffffff01 && buffer[2== 0xffffff01)
    {
        printf("FLT \nGraphics – OpenFlight 3D File");
    }
 
}
 
cs


그래서 위와같이 비교구문을 작성하였지만, 너무힘들고 숫자부분을 일일이 다시 수정해야되는데 (예 0xffffff01 -> 0x01) 짜기 너무힘들고 불편해서 중간에 포기하고 새롭게 코드를 구성했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
char buffer[1000= { 0, };
char tembuf[10= { 0, };
int cnt = 0;
while (100 > cnt++)
{
    sprintf(tembuf , "%02x", getc(in));
    strcat(buffer, tembuf);
}
 
    if (strncmp(&buffer[0], "aaaaaaaa"8== 0)
{
    printf("Testing File Made By Youngjoo\n");
}
cs


이런식으로하면 getc로 한문자를 받아서 %02x 방식으로 출력하고 그걸 tembuf에 넣어서 strcat으로 buffer에 문자열로 넣어주고 strncmp로 특정부분만 비교하면 훨씬쉽게 만들 수 있다.