переход к таблице экспорта

Тема в разделе "WASM.BEGINNERS", создана пользователем MaxOn, 21 мар 2009.

  1. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    У меня такая проблема: в eax база файла(кернел32.длл) чтобы перейти к нт заголовку мы добавляем к eax 3C далее чтобы перейти к DataDirectory в опциональном заголовке к eax надо добавить 118 (или 76 в hex). Вот теперь в eax адрес datadirectory, в уроках iczelinon'a написано чтобы перейти к таблице эскпорта мы должны размер IMAGE_DATA_DIRECTORY(8 байт) умножить на ноль и за тем результат добавить к адресу DataDirectory. В результате мы получем адрес структуры IMAGE_DATA_DIRECTORY с rva на таблицу экспорта. Так как 8*0 = 0 (как ни странно!11) то к eax ни че добавлять не надо правильно? Ну и затем я пробую поместить в edi VirtualAddress из IMAGE_DATA_DIRECTORY и эксепшн.
    вот кодес
    Код (Text):
    1. format PE GUI 5.0
    2. include '%fasminc%\win32ax.inc'
    3. include '%fasminc%\macro\masm.inc'
    4.  
    5. section '.code' code writeable readable executable
    6. Msg db 'MessageBoxA',0
    7.  
    8. macro GetKernelBase{
    9.     xor eax,eax
    10.     mov eax,[fs:eax+30h]
    11.     mov eax,[eax+0ch]
    12.     mov esi,[eax+1ch]
    13.     lodsd
    14.     mov eax,[eax+08h]
    15. }
    16.  
    17. include '%fasminc%\PE.INC'
    18.  
    19. entry $
    20. GetKernelBase;получаем базу кернел32.длл
    21. mov edi,eax
    22. add eax,[eax+3ch];Переходим к NTHeader
    23. add eax,[eax+118];пеhеходим к DataDirectory
    24. assume eax:IMAGE_DATA_DIRECTORY
    25. mov edi,[eax.VirtualAddress];тут exception
    26.  
    27. ret
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а что получается на асме? eax + сколько? кстати да, ты б под олькой посмотрел, че там и как, какие адреса в регистрах и т.д.
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    можт лучше
    Код (Text):
    1. lea eax,[eax+118]
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это разные вещи.
    Код (Text):
    1. add eax,[eax+118]
    Прибавить к eax содержимое памяти по адресу eax+118

    Код (Text):
    1. lea eax,[eax+118]
    Прибавить к eax 118.
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    да ты что?
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Во-первых, не 76h, а 78h = 120. Во-вторых, если хочется получить адрес структуры IMAGE_DATA_DIRECTORY, то нужно добавлять 78h, а не содержимое памяти [eax+78h] (это содержимое - первый элемент IMAGE_DATA_DIRECTORY).
     
  7. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    MSoft
    плюс нисколько патамуш VirtualAddress первый член структуры IMAGE_DATA_DIRECTORY и в ольке я смотрел к нт переходит все а дальше говорю эксепшн
     
  8. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    diamond
    add eax,78h так?
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    MaxOn
    Да, вместо add eax,[eax+118].
     
  10. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    вот поправил код
    Код (Text):
    1. format PE GUI 5.0
    2. include '%fasminc%\win32ax.inc'
    3. include '%fasminc%\macro\masm.inc'
    4.  
    5. section '.code' code writeable readable executable
    6. Msg db 'MessageBoxA',0
    7.  
    8. macro GetKernelBase{
    9.     xor eax,eax
    10.     mov eax,[fs:eax+30h]
    11.     mov eax,[eax+0ch]
    12.     mov esi,[eax+1ch]
    13.     lodsd
    14.     mov eax,[eax+08h]
    15. }
    16.  
    17. include '%fasminc%\PE.INC'
    18.  
    19. entry $
    20. GetKernelBase;получаем базу кернел32.длл
    21. add eax,[eax+3ch];Переходим к NTHeader
    22. add eax,76h;пеhеходим к DataDirectory
    23. assume eax:IMAGE_DATA_DIRECTORY
    24. mov eax,[eax.VirtualAddress]
    25. assume eax:IMAGE_EXPORT_DIRECTORY
    26. mov eax,[eax.NumberOfFunctions];exception
    27. ret
    подскажите пожалуйста что не так?
     
  11. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Написано 76h вместо правильного 78h.
     
  12. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    да точно... но все равно эксепшн остался на том же месте
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Потому что VirtualAddress из IMAGE_DATA_DIRECTORY - это RVA, он является не абсолютным адресом, а смещением относительно начала образа. add eax,edi нужно для доступа к IMAGE_EXPORT_DIRECTORY.
     
  14. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    diamond
    большое спасибо за подробное разъяснение, теперь во всем разобрался. Очень благодарен!!!
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Хоть бы что :)
    Ты б и писал что он к структуре неправильно обращается.
    Это ж не лучше, то что у него вообще неправильно было.
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    MaxOn, мой те совет - установи отладчик, выучи магические f7,f8 (или f10,f11)..
    cppasm, ;)
     
  17. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    еще один вопрос
    Код (Text):
    1. format PE GUI 5.0
    2. include '%fasminc%\win32ax.inc'
    3. include '%fasminc%\macro\masm.inc'
    4.  
    5. section '.code' code writeable readable executable
    6. Msg db 'MessageBoxA',0
    7. KernelBase dd ?
    8. KernelExport dd ?
    9.  
    10. macro GetKernelBase{
    11.     xor eax,eax
    12.     mov eax,[fs:eax+30h]
    13.     mov eax,[eax+0ch]
    14.     mov esi,[eax+1ch]
    15.     lodsd
    16.     mov eax,[eax+08h]
    17.     mov [KernelBase],eax
    18. }
    19. macro GetKernelExport{
    20.         mov edi,eax
    21.         add edi,[eax+3ch];Переходим к NTHeader
    22.         add edi,78h;пеhеходим к DataDirectory
    23.         mov esi,[edi]
    24.         add eax,esi
    25.        
    26. }
    27.  
    28. include '%fasminc%\PE.INC'
    29.  
    30. entry $
    31. GetKernelBase;получаем базу кернел32.длл
    32. GetKernelExport;получаем указатель на таблицу экспорта
    33. assume eax:IMAGE_EXPORT_DIRECTORY
    34. mov ebx,[eax.AddressOfNames]
    35. mov esi,ebx
    36. _find:
    37. push ebx
    38. add ebx,[KernelBase]
    39.  
    40. mov edi,Msg
    41. cmp ebx,edi
    42. jz _ret
    43. pop ebx
    44. add ebx,4
    45.  
    46. jmp _find
    47.  
    48.  
    49. _ret:
    50. ret
    51. _ok:
    52. jmp _ret
    Не мог понять из за чего тут эксепшн. Например если запустить на выполнение под отладчиком, то некоторое время программа работает, потом останавливается(возникает эксепшн) листинг пустой, ebx содержит искомый MessageBoxA а на вершине стека адрес возврата и все. В чем проблема?
     
  18. MaxOn

    MaxOn Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    45
    еще один вопрос
    Код (Text):
    1. format PE GUI 5.0
    2. include '%fasminc%\win32ax.inc'
    3. include '%fasminc%\macro\masm.inc'
    4.  
    5. section '.code' code writeable readable executable
    6. Msg db 'MessageBoxA',0
    7. KernelBase dd ?
    8. KernelExport dd ?
    9.  
    10. macro GetKernelBase{
    11.     xor eax,eax
    12.     mov eax,[fs:eax+30h]
    13.     mov eax,[eax+0ch]
    14.     mov esi,[eax+1ch]
    15.     lodsd
    16.     mov eax,[eax+08h]
    17.     mov [KernelBase],eax
    18. }
    19. macro GetKernelExport{
    20.         mov edi,eax
    21.         add edi,[eax+3ch];Переходим к NTHeader
    22.         add edi,78h;пеhеходим к DataDirectory
    23.         mov esi,[edi]
    24.         add eax,esi
    25.        
    26. }
    27.  
    28. include '%fasminc%\PE.INC'
    29.  
    30. entry $
    31. GetKernelBase;получаем базу кернел32.длл
    32. GetKernelExport;получаем указатель на таблицу экспорта
    33. assume eax:IMAGE_EXPORT_DIRECTORY
    34. mov ebx,[eax.AddressOfNames]
    35. mov esi,ebx
    36. _find:
    37. push ebx
    38. add ebx,[KernelBase]
    39.  
    40. mov edi,Msg
    41. cmp ebx,edi
    42. jz _ret
    43. pop ebx
    44. add ebx,4
    45.  
    46. jmp _find
    47.  
    48.  
    49. _ret:
    50. ret
    51. _ok:
    52. jmp _ret
    Не мог понять из за чего тут эксепшн. Например если запустить на выполнение под отладчиком, то некоторое время программа работает, потом останавливается(возникает эксепшн) листинг пустой, ebx содержит искомый MessageBoxA а на вершине стека адрес возврата и все. В чем проблема?
    PS сорри за повторный пост , это инет тупит.
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    я чет не пойму, ты MessageBoxA в кернеле ищешь??? и ты сравниваешь адреса или пытаешься сравнить строки через cmp reg,reg???
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MSoft
    Но нашёл ведь оО..