Я думаю, что довольно простой эвристикой было бы проверить, что различные разделы в файле PE начинаются и заканчиваются в одном и том же месте:
Например, вот вершина файла карты.
Start Length Name Class
0001:00401000 000A4938H .text CODE
0002:004A6000 00000C9CH .itext ICODE
0003:004A7000 000022B8H .data DATA
0004:004AA000 000052ACH .bss BSS
0005:00000000 0000003CH .tls TLS
Я также посмотрел, что dumpbin /headers
сказал об этих разделах:
SECTION HEADER #1
.text name
A4938 virtual size
1000 virtual address (00401000 to 004A5937)
A4A00 size of raw data
400 file pointer to raw data (00000400 to 000A4DFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
SECTION HEADER #2
.itext name
C9C virtual size
A6000 virtual address (004A6000 to 004A6C9B)
E00 size of raw data
A4E00 file pointer to raw data (000A4E00 to 000A5BFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
...truncated
Посмотрите на раздел .text. Согласно дампбину, он начинается с 00401000
и заканчивается на 004A5937
, который имеет длину 000A4938
, точно так же, как в файле .map. Естественно, вы будете читать файл PE напрямую, а не запускать dumpbin, но это иллюстрирует суть.
Я бы ожидал, что при таком подходе исчезающе небольшое количество ложных срабатываний.