Bonjour, je voudrais trouver l'offset du fichier à partir de l'adresse d'une string ascii à l'intérieur de la dll.
Je sais que je pourrais chercher à partir d'un pattern mais pour l'instant c'est la formule à partir d'une string qui m'intéresse.

1. voici les lignes de la string que je peux trouver en parcourant le fichier avec ifstream:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
33e2390h : 64 65 66 61 75 6C 74 2D 62 61 63 6B 67 72 6E 64 |
33e23a0h : 2D 63 6F 6C 72 00                               | "default-background-color"
2. offset obtenu par le debuggeur:
1180E33

3. voici la ligne de l'offset du debuggeur dans un editeur hexadecimal:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1180E30h : 00 00 00 48 8D 15 56 17 26 02 48 89 F9 E8 5E 09 |


Formule pour calculer le offset du fichier:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
offset_du_fichier = adresse_dans_le_code + adresse_de_la_ligne + longeur_de_la_commande - adresse_de_base
 
       ?          = 48 8D 15 56 17 26 02 +      0x1180E33      + 48 8D 15 56 17 26 02   -      0x400     
                    donc 0x02261756                              donc 0x7
Résultat = 33E2190 ---- 512 bytes avant l'adresse de la string "default-background-color"

Il me semble qu'il me manque une dernière donnée. Si je change de version de la dll et que je refais le calcul, le résultat change pour devenir 1024 et même 3072 bytes après l'adresse de la string.

Je dépose ici un code trouvé sur un autre site qui pourrait peut-être aider:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
88
89
90
91
92
93
94
95
96
97
98
99
LPCSTR fileName="c:\\program files (x86)\\.......\\chome.dll"; //dll 64 bits
    HANDLE hFile; 
    HANDLE hFileMapping;
    LPVOID lpFileBase;
    PIMAGE_DOS_HEADER dosHeader;
    PIMAGE_NT_HEADERS peHeader;
    PIMAGE_SECTION_HEADER sectionHeader;
 
    hFile = CreateFileA(fileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 
    if(hFile==INVALID_HANDLE_VALUE)
    {
        printf("\n CreateFile failed in read mode \n");
        return 1;
    }
 
    hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
 
    if(hFileMapping==0)
    {
        printf("\n CreateFileMapping failed \n");
        CloseHandle(hFile);
        return 1;
    }
 
    lpFileBase = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0); // Base pointer to file
 
    if(lpFileBase==0)
    {
        printf("\n MapViewOfFile failed \n");
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return 1;
    }
 
    dosHeader = (PIMAGE_DOS_HEADER) lpFileBase;  //pointer to dos headers
 
    if(dosHeader->e_magic==IMAGE_DOS_SIGNATURE)
    {
        //if it is executable file print different fileds of structure
        //dosHeader->e_lfanew : RVA for PE Header
        printf("\n DOS Signature (MZ) Matched");
 
        //pointer to PE/NT header
        peHeader = (PIMAGE_NT_HEADERS) ((u_char*)dosHeader+dosHeader->e_lfanew);
 
        if(peHeader->Signature==IMAGE_NT_SIGNATURE)
        {
            printf("\n PE Signature (PE) Matched \n");
            // valid executable so we can proceed
 
            //address of entry point
            DWORD ptr = peHeader->OptionalHeader.AddressOfEntryPoint;
 
            //instead of AEP send any pointer to get actual disk offset of it
            printf("\n RVA : %x \n",ptr); // this is in memory address i.e. RVA
            //suppose any one wants to know actual disk offset of "address of entry point" (AEP)
 
            sectionHeader = IMAGE_FIRST_SECTION(peHeader); //first section address
            UINT nSectionCount = peHeader->FileHeader.NumberOfSections;
            UINT i=0;
            //check in which section the address belongs
            for( i=0; i<=nSectionCount; ++i, ++sectionHeader )
            {
                if((sectionHeader->VirtualAddress) > ptr)
                {
                    sectionHeader--;
                    break;
                }
            }
 
            if(i>nSectionCount)
            {
                sectionHeader = IMAGE_FIRST_SECTION(peHeader);
                UINT nSectionCount = peHeader->FileHeader.NumberOfSections;
                for(i=0; i<nSectionCount-1; ++i,++sectionHeader);
            }
 
            //once the correct section is found below formula gives the actual disk offset 
            DWORD retAddr = ptr - (sectionHeader->VirtualAddress) +
                    (sectionHeader->PointerToRawData);
            printf("\n Disk Offset : %x \n",retAddr+(PBYTE)lpFileBase);
            // retAddr+(PBYTE)lpFileBase contains the actual disk offset of address of entry point
 
        }
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        //getchar();
        return 0;
    }
    else
    {
        printf("\n DOS Signature (MZ) Not Matched \n");
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return 1;
    }
Le but pour l'instant c'est un exercice pour se localiser à l'intérieur d'un exécutable ou d'une dll à l'aide d'une string ascii.
Merci à l'avance à tous ceux qui m'aideront à résoudre ce problème.