| 
				
				Помогите с ассемблером.
				 | 
 | 
| Волк-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  |  
|   | 
 |    |