Вызов функций из Shell байт-кода

Тема в разделе "WASM.ASSEMBLER", создана пользователем alex-rudenkiy, 26 май 2017.

Метки:
  1. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Всем привет, скажите пожалуйста как вызвать какую нибудь функцию, ну пусть хотя-бы например beep из под Shell встроенного в левую программу? Все мои попытки приводят к Access Violation :dash1:.
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.153
    Покажите как вы это делаете, подробности про исключение.
     
  3. alex-rudenkiy

    alex-rudenkiy New Member

    Публикаций:
    0
    Регистрация:
    26 май 2017
    Сообщения:
    16
    Indy_, ну вот я сначала компилирую это (то что ниже) на асме, затем полученный байт-код выдёргиваю через OllyDbg и вставляю в другую прогу (ну сначала вставляю это барахло в самый конец проги, а затем заменяю какую нибудь строчку программы на jmp, типо чтобы перешло управление), причём всё вручную, но не суть, а потом как встречается какой нибудь call, то прога тупо накрывается.

    Код (ASM):
    1.     invoke  CreateFile,ADDR FileName,GENERIC_READ,0,0,\
    2.             OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0          
    3.     mov     hFile,eax
    4.  
    5.     invoke  GetFileSize,eax,0
    6.  
    7.     invoke  GlobalAlloc,GMEM_FIXED,eax
    8.     mov     hMem,eax
    9.  
    10.     invoke  ReadFile,hFile,hMem,64,ADDR BytesRead,0
    11.     mov eax, hMem
    12.     mov eax, [eax]
    13.     mov ebx, 5A4DH
    14.     cmp ax, bx
    15.     jne @ohshit
    16.     mov eax,3CH
    17.     shr eax,2
    18.     mov ebx,4
    19.     mul ebx
    20.     mov ebx,hMem
    21.     add eax,ebx
    22.     mov eax, [eax]
    23.     invoke SetFilePointer,hFile,eax,0,FILE_BEGIN
    24.     invoke ReadFile,hFile,hMem,64,ADDR BytesRead,0
    25.     mov eax, hMem
    26.     mov eax, [eax]
    27.     mov ebx, 4550H
    28.     cmp ax, bx
    29.     jne @ohshit
    30.  
    31.     mov eax,18H
    32.     shr eax,1
    33.     mov ebx,2
    34.     mul ebx
    35.     mov ebx,hMem
    36.     add eax,ebx
    37.     mov eax, [eax]
    38.  
    39.     mov eax,28H
    40.     shr eax,2
    41.     mov ebx,4
    42.     mul ebx
    43.     mov ebx,hMem
    44.     add eax,ebx
    45.     mov eax, [eax]
    46.     sub eax, 0C00H
    47.  
    48.     @ohshit:
    49.         invoke  CloseHandle,hFile
    50.  
    51.     invoke  GlobalFree,hMem
    [​IMG]
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    432
    Нужно динамически получать адреса функций. Делать это можно через PEB.Ldr к примеру, либо полагаться на то, что базы системных библиотек (kernel32, user32, gdi32 точный список неизвестен) одинаковы во всех процессах. В зависимости от нужды использовать тот или иной метод.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.153
    alex-rudenkiy,

    > как встречается какой нибудь call, то прога тупо накрывается.

    Во первых изучите релатив(относительную) адресацию. Адрес ветвления вычисляется на основе текущего. В 64 моде вообще любая адресация релатив. Во вторых после переноса кода не существует никакой среды типо импорта(IAT).

    Рано вам есчо код бинарный копировать, вы должны изучить архитектуру https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

    vol.1: basic architecture.