• XSS.stack #1 – первый литературный журнал от юзеров форума

Как выгрузить резидентную функцию?

Lamer

(L2) cache
Пользователь
Регистрация
18.07.2005
Сообщения
470
Реакции
1
Да... господа... на злобу дня...
Код:
#include <dos.h>
#include <string.h>
#define INTR 0x09
void interrupt ( *oldhandler)(...);
void interrupt handler(...)
{
    // тело функции
}
int main()
{
union REGS in, out;
oldhandler = getvect(INTR);
setvect(INTR, handler);
in.h.ah = 0x31;
in.h.al = 0;
in.x.dx = 1024;
int86(0x21, &in, &out);
return 0;
}
Как вы догадались данная функци становиться резидентной... т.е. висит в памяти... не важно, что она для DOS :)...вы не вот что лучше скажите: а как ее выгрузить ??? :)... Вобщем как зетелеть облась памяти... :)
Буду очень благодарен ;-)
 
Скажу. Очень увлекался кодингом под ДОС, поэтому тема до боли знакома. Итак, для ее выгрузки нужно:
- восстановить перехваченные обработчики прерываний, особенно 8
- освободить занятые блоки памяти (среди функций прерывания 21h есть и такая)
Добавлено в [time]1131995189[/time]
Ой-ой, про все написал, а про главное - забыл! :)
У меня есть СОРЕЦ резидентной проги, которая по ключю /r командной строки умеет выгружать себя! Тебе его дать (сорец)?
 
Код:
#include <dos.h>
#define INTR 0x1C
#define ATTR 0x7900

#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif

extern unsigned _heaplen = 1024;
extern unsigned _stklen  = 512;

void interrupt ( *oldhandler)(__CPPARGS);

typedef unsigned int (far *s_arrayptr);

void interrupt handler(__CPPARGS)
{
   s_arrayptr screen[80];
   static int count;

   screen[0] = (s_arrayptr) MK_FP(0xB800,0);

   count++;
   count %= 10;

   screen[0][79] = count + '0' + ATTR;

   oldhandler();
}

void interrupt remove(__CPPARGS)
{
  setvect(INTR, oldhandler);

   _asm{
     push es
     push ax
     mov ax, cs
     mov es, ax
     mov ax, 0x4900
     int 0x21
     mov ax, ds
     mov es, ax
     mov ax, 0x4900
     int 0x21
     pop ax
     pop es
     int 0x20
   }
}

int main(int argc, char** argv)
{
 if(argv[1][1]=='r')
   _asm int 0xcc;

  oldhandler = getvect(INTR);

  setvect(INTR, handler);
  setvect(0xcc, remove);

  keep(0, (_SS + (_SP/16) - _psp));
  return 0;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх