(fasm) как создать список адресов меток

Тема в разделе "WASM.ASSEMBLER", создана пользователем gas, 9 июн 2011.

  1. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Есть структурная обработка исключений(при этом один описатель диспетчера фолта является пользовательской структурой в локальном стековом фрейме), векторная(описатель диспетчера системный, список ведёт ось) и финальная(используется для не обработанных исключений) и два типа обработки исключений используя порты(отладочный и исключений). В ядре механизмов больше.

    Можно сделать глобальный сех, при этом все экпортируемые адреса должны сходится в одной точке, подобно модели конвенции фастколов, вот тут подробно расписана проблема:
    Узнать процедуру в которой возник фолт это частный случай общей задачи. Нужно найти процедуру по указателю. Из за нелинейности процедур задача решается использованием графов(каждая процедура исполняется на определённом NL, слепок описывает все инструкции процедуры). Для поиска процедуры трассируется граф, находится описатель инструкции вызвавшей фолт, затем сама процедура.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Эм... А умение писать код на что? :)
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. entry start
    6.  
    7. proc start uses ebx edi
    8.     local curDir[MAX_PATH]:BYTE
    9.     lea ebx,[curDir]                    ;ebx - current directory pointer
    10.     invoke GetCurrentDirectory,MAX_PATH,ebx
    11.     lea edi,[ebx+eax]
    12.    
    13.     cmp byte[edi],'\'
    14.     jnz @F
    15.         add edi,-1
    16.     @@:
    17.    
    18.     mov dword[edi],'\all'
    19.     mov dword[edi+4],'.inc'
    20.     mov byte[edi+8],0
    21.     invoke CreateFile,ebx,NULL,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    22.     invoke CloseHandle,eax
    23.     mov byte[edi],0
    24.    
    25.     stdcall EnumFilesFrom,ebx,-1,EnumFilesCallback,0
    26.     cmp eax,-1
    27.     jz .error
    28.         invoke MessageBox,NULL,msgCompleteText,msgCompleteTitle,MB_OK
    29.     ret
    30. .error:
    31.     invoke MessageBox,NULL,msgFileErrText,msgFileErrTitle,MB_OK
    32. ret
    33. endp
    34.  
    35. ;returns postition of the found char or -1 if not found
    36. proc strrchr uses esi edi, string, char
    37.     mov esi,dword[string]
    38.     mov edi,dword[string]
    39.     .next_char:
    40.         lodsb
    41.         cmp al,byte[char]
    42.         jnz .not_found
    43.             mov edi,esi
    44.         .not_found:
    45.     test al,al
    46.     jnz .next_char
    47.    
    48.     lea eax,[edi-1]
    49.     sub eax,dword[string]
    50.     sbb eax,eax
    51.     not eax
    52.     and eax,edi
    53.     add eax,-1
    54. ret
    55. endp
    56.  
    57. ;returns number of copied characters, including null-character
    58. proc strcpy uses esi edi, dest, src, destlen
    59.     mov edi,dword[dest]
    60.     mov esi,dword[src]
    61.     mov ecx,dword[destlen]
    62.     test ecx,ecx
    63.     jz .exit
    64.    
    65.     .next_char:
    66.         lodsb
    67.         stosb
    68.         add ecx,-1
    69.         jz .exit
    70.     test al,al
    71.     jnz .next_char
    72.    
    73.     .exit:
    74.     xor eax,eax
    75.     mov byte[edi],al
    76.     mov eax,dword[destlen]
    77.     sub eax,ecx
    78. ret
    79. endp
    80.  
    81. ;returns -1, if enumeration must be stopped
    82. proc EnumFilesCallback uses esi edi ebx, filePath, fileAttributes, custom
    83.     locals
    84.         curFile             rb MAX_PATH
    85.         fileName            rb MAX_PATH
    86.         bytesWritten        dd ?
    87.     endl
    88.    
    89.     mov edi,dword[filePath]             ;edi - original path start position
    90.     stdcall strrchr,edi,'\'
    91.     cmp byte[eax+1],'.'
    92.     jnz @F
    93.     cmp byte[eax+2],0
    94.     jz .exit_continue
    95.     cmp byte[eax+2],'.'
    96.     jnz @F
    97.     cmp byte[eax+3],0
    98.     jz .exit_continue
    99.     @@:
    100.    
    101.     test dword[fileAttributes],FILE_ATTRIBUTE_DIRECTORY
    102.     jz .check_file
    103.     ;Create all.inc within subdirectory
    104.         lea esi,[curFile]               ;esi - path start position within curFile
    105.         stdcall strcpy,esi,edi,MAX_PATH
    106.         lea edi,[esi+eax-1]             ;edi - end of folder path
    107.        
    108.         stdcall strrchr,esi,'\'
    109.         add eax,1
    110.        
    111.         push eax                        ;pushed curdir end pos within curFile
    112.  
    113.         mov dword[edi],'\all'
    114.         mov dword[edi+4],'.inc'
    115.         mov byte[edi+8],0
    116.  
    117.         lea edx,[fileName]
    118.         stdcall strcpy,edx,eax,MAX_PATH
    119.         lea edi,[eax-1]                 ;edi - fileName length
    120.  
    121.         invoke CreateFile,esi,NULL,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    122.         invoke CloseHandle,eax
    123.     jmp .add_file
    124.     .check_file:
    125.         stdcall strrchr,edi,'.'
    126.         cmp eax,-1
    127.         jz .exit_continue
    128.         invoke CharLower,eax
    129.         cmp dword[eax+1],'inc'
    130.         jnz .exit_continue
    131.         cmp dword[eax-4],'\all'
    132.         jz .exit_continue
    133.        
    134.         lea esi,[curFile]               ;esi - path start position within curFile
    135.         stdcall strcpy,esi,edi,MAX_PATH
    136.        
    137.         stdcall strrchr,esi,'\'
    138.         add eax,1
    139.        
    140.         push eax                        ;pushed curdir end pos within curFile
    141.        
    142.         lea edx,[fileName]
    143.         stdcall strcpy,edx,eax,MAX_PATH
    144.         lea edi,[eax-1]                 ;edi - fileName length
    145.     .add_file:
    146.         pop edx                         ;popped curdir end pos within curFile
    147.         mov dword[edx],'all.'
    148.         mov dword[edx+4],'inc'
    149.        
    150.         invoke CreateFile,esi,GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    151.         mov ebx,eax
    152.             invoke SetFilePointer,ebx,0,NULL,FILE_END
    153.             lea edx,[bytesWritten]
    154.             invoke WriteFile,ebx,includeString,sizeof.includeString,edx,NULL
    155.             lea edx,[bytesWritten]
    156.             lea eax,[fileName]
    157.             invoke WriteFile,ebx,eax,edi,edx,NULL
    158.             lea edx,[bytesWritten]
    159.             invoke WriteFile,ebx,includeStringEnd,sizeof.includeStringEnd,edx,NULL
    160.         invoke CloseHandle,ebx     
    161. .exit_continue:
    162.     xor eax,eax
    163. ret
    164. endp
    165.  
    166. proc EnumFilesFrom uses ebx esi edi, path, maxlevel, callback, custom
    167.     locals
    168.         curFile         rb MAX_PATH
    169.         fileData        WIN32_FIND_DATA
    170.     endl
    171.    
    172.     lea edi,[curFile]                   ;edi - path start position
    173.     stdcall strcpy,edi,dword[path],MAX_PATH
    174.     lea esi,[edi+eax]                   ;esi - path end position
    175.     mov dword[edi+eax-1],'\*'
    176.  
    177.     lea edx,[fileData]
    178.     invoke FindFirstFile,edi,edx
    179.     cmp eax,INVALID_HANDLE_VALUE
    180.     jz .exit
    181.     mov ebx,eax                         ;ebx - file search handle
    182.     .process_file:
    183.         lea ecx,[edi+MAX_PATH]
    184.         sub ecx,esi
    185.         lea edx,[fileData.cFileName]
    186.         stdcall strcpy,esi,edx,ecx
    187.         invoke callback,edi,dword[fileData.dwFileAttributes],dword[custom]
    188.         cmp eax,-1
    189.         jz .exit
    190.        
    191.         test dword[fileData.dwFileAttributes],FILE_ATTRIBUTE_DIRECTORY
    192.         jz .next_file
    193.         cmp dword[maxlevel],0
    194.         jz .next_file
    195.         cmp byte[fileData.cFileName],'.'
    196.         jnz @F
    197.         cmp byte[fileData.cFileName+1],0
    198.         jz .next_file
    199.         cmp byte[fileData.cFileName+1],'.'
    200.         jnz @F
    201.         cmp byte[fileData.cFileName+2],0
    202.         jz .next_file
    203.         @@:
    204.             mov edx,dword[maxlevel]
    205.             add edx,-1
    206.             stdcall EnumFilesFrom,edi,edx,dword[callback],dword[custom]
    207.         .next_file:
    208.         lea edx,[fileData]
    209.         invoke FindNextFile,ebx,edx
    210.     test eax,eax
    211.     jnz .process_file
    212.     invoke FindClose,ebx
    213.     xor eax,eax
    214.     .exit:
    215. ret
    216. endp
    217.  
    218. data import
    219.     library kernel32,'kernel32.dll',\
    220.             user32,'user32.dll'
    221.    
    222.     import kernel32,\
    223.             FindFirstFile,'FindFirstFileA',\
    224.             FindNextFile,'FindNextFileA',\
    225.             FindClose,'FindClose',\
    226.             CreateFile,'CreateFileA',\
    227.             WriteFile,'WriteFile',\
    228.             CloseHandle,'CloseHandle',\
    229.             SetFilePointer,'SetFilePointer',\
    230.             GetCurrentDirectory,'GetCurrentDirectoryA'
    231.            
    232.     import user32,\
    233.             MessageBox,'MessageBoxA',\
    234.             CharLower,'CharLowerA'
    235.  
    236. end data
    237.  
    238.  
    239. msgFileErrTitle         db 'Error',0
    240. msgFileErrText          db 'Could not enumerate files',0
    241.  
    242. msgCompleteTitle        db 'Info',0
    243. msgCompleteText         db 'All include files have been created',0
    244.  
    245. includeString           db 'include ',"'"
    246. sizeof.includeString    = $-includeString
    247. includeStringEnd        db "'",13,10
    248. sizeof.includeStringEnd = $-includeStringEnd
    Рекурсивно создаст/перезапишет файлы all.inc во всех папках, начиная с текущей (т.е. откуда запустите, оттуда и пойдёт создавать). Файлы all.inc будут включать все *.inc текущей папки и all.inc всех папок уровнем ниже.
     
  3. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    klzlk, спасибо, познавательно... в смысле познал что ну её нафих - лезть в эти дебри... Я лучше щас в новой теме задам маленький вопросик по SEH и мне больше ничего не надо.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    klzlk объяснять не умеет. И в 95% случаев не вникает в вопрос, выборочно прочитав несколько строк из разных постов. На самом деле нет никаких там дебрей. Просто klzlk везде пихает свой движок и анализ графов. Ну кому ещё в голову придёт динамический анализ графов собственного кода? "Частный случай общей задачи", блин.
     
  5. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    l_inc
    Понял я вопрос полностью. Это задача нахождения процедуры(ветви), по адресу инструкции, принадлежащей процедуре, тоесть Flow = f(Ip), где Ip - указатель(в данном случае это EXCEPTION_RECORD.Exceptionddress). ТС описал все инструкции, на которых может возникнуть фолт в массиве, сопоставив группе инструкций процедуру, насколько я понял. Учитывая большое число таких инструкций, массив получится вероятно весьма большим, мб больше чем фиксапы. Для решения этой задачи код должен быть линейным, либо каждая инструкция описана графом(статически, что видимо и реализует тс или динамически, посредством описания своего кода налету).
    И движок я свой не пихал, а дал выдержку из матчасти(тяжёлый ман), где описано подробно как совместить все отдельные сех-прологи в один единственный, что позволяет очень сильно сократить размер кода. Если вы не можите предложить чтото большее, чем обернуть каждое макро(блок кода) сех фреймами(ваш пост выше), то не нужно обвинять меня в том, что предложил альтернативное решение, студентик =)
    Вообще можно вызывать код не используя сех(через безопасные колбеки, например шадова). Это не имеет отношения к данной теме, но ради интереса написал.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    [ладно... не имеет смысла спорить]
     
  7. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    l_inc
    Обьясните подробнее, не понятно. Что куда добавлять и для чего ?
    Очевидно что вынести общий сех не так просто, как кажется с первого взгляда. И откатать процедуру, выполнив возврат из неё проблемно - не известно сколько параметров у процедуры, которые нужно убрать из стека(stdcall).
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    klzlk
    Ерунду написал. Поэтому и удалил. Нечего там объяснять.