Среда, 13.11.2024, 09:26 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Marra_Kesh, xXxSh@dowxXx  
Помогите с ассемблером.
Волк-1024Дата: Понедельник, 19.12.2011, 22:42 | Сообщение # 1
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Здравствуйте.

В общем я в асме еще новичок, но кое-какие познания у меня есть...

Решил попытаться написать прогу без таблицы импорта.
Все шло хорошо.
Получил базу Kernel'а 32
Получил таблицу экспорта.
Получил из неё адрес GetProcAddres

А на финальном этапе запара...

Вот кусок кода:

Code

         lea eax, _GH                           ; кладем в eax имя "GetModuleHandleA"
         push eax
         push __K32                    ; помещаю в стек  адрес базы  kernel
         call ecx                    ; вызываю функцию GetProcAddress
           
         mov _GetProcAddress, ecx              ; сохраняю адрес в переменную.
         mov _GetModuleHandle, eax            ; тоже самое

         push OFFSET _K32                           ; помещаю имя "kernel32.dll"
         call _GetModuleHandle               
         push OFFSET _LL                        ; запоминаю имя "LoadLibraryA"
         push eax                    ; запоминаю полученный хэндл модуля   
         call _GetProcAddress                  ; а тут фигня...
         mov _LoadLibrary, eax
         mov eax, 0h


При трассировке в OllyDbg на вызове GetProcAddress происходит крэш на строчке внутри kernel'а
Code
ADD BYTE PTR DS:[EBX],AL
Ошибка "Access violation when writing to [00000000]
Хотя если вызвать функцию нормально с теми же параметрами, то всё хорошо...

Помогите пожалуйста кто может...

P.S. могу приложить exe с ошибкой.


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Вторник, 20.12.2011, 00:03
 
GReIIIHuKДата: Вторник, 20.12.2011, 15:58 | Сообщение # 2
Участник
Зарегистрирован: 15.05.2011
Группа: Пользователи
Сообщений: 98
Статус: Offline
Не люблю ассамблер, поэтому и не учил его даже.(хотя многие говорят что лучше выучить)

Skype:"greiiihuk."


Да, я преступник. Мое преступление — любопытство.
Быть может умру я, умрут многие, но идея останется жить навсегда.
Я работаю не только за спасибо.(+) ©
 
Волк-1024Дата: Вторник, 20.12.2011, 18:01 | Сообщение # 3
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Да. Действительно на асме можно сделать то, что на других языках не возможно или почти. Например, я физически не представляю, как на Delphi из exe выдрать таблицу импорта функций (в теории я это представляю).

А по теме есть что-то?


Pascal, C\C++, Assembler, Python
 
Волк-1024Дата: Вторник, 20.12.2011, 18:31 | Сообщение # 4
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Вот я дурак!!!! ))) Я даже не посмотрел на значение регистра ecx. После вызова GetProcAddres'а он изменился на адрес дос заголовка. В результате чего я совершенно не то записал в переменную, которую потом и вызывал! ))) Теперь всё работает. Всем спасибо.

P.S. отладчик мой лучший друг )


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Вторник, 20.12.2011, 18:44
 
Волк-1024Дата: Воскресенье, 05.02.2012, 14:03 | Сообщение # 5
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Привет всем. Снова проблемы с ассемблером. Не стал создавать новую тему.

Есть свежеиспечённая функция:

Code

function GetStrSize(S: PAnsiChar): integer; assembler;
asm

             push  ecx     
             xor   ecx, ecx                    {Обнуляем ecx. Чтоб не было ошибок}        

      @_a:

             mov    bl, byte ptr [ecx+eax]                   {Загружаем следующий символ}
             or     bl, 0h                    {Проверяем. Есть ли еще буквы?}
             je     @_c                    {Если нет, то на выход}
             inc    cx                    {Если есть. Увеличиваем cx на один}                         
             jmp    @_a

      @_c:

             mov   eax, ecx                    {Записываем результат}
             pop   ecx      

       end;


Как из названия видно. Она для получения размера строки.
Так вот не получается вывести результат. Т.е не совсем получается....

Code
MessageBox(0, PChar(IntToStr(GetStrSize('Fuck'))), nil, 0);
Результат отлично выведется. Будет 4.

А если так:
Code
Edit1.Text:=(IntToStr(GetStrSize('Fuck')));
То ноль эмоций. Ничего не происходит. Почему? И как исправить?


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Воскресенье, 05.02.2012, 15:43
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz