灌溉梦想,记录脚步

rhel5下的yum安装配置方法

  如果用过ubuntu或者debian,一定会知道有apt-get这个命令的,出格的好用。在redhat下默认没有apt,取而代之的是yum这个东东。rhel5(as5)里默认也装有yum,但是那个yum是要有授权才能使用,上哪去找这个授权尚未知晓,所以这里是用rhel的孪生兄弟centos的yum来替换掉原生的yum,虽然看起来不那么正规,但实际上是完全没有问题的,假如真有问题,可以向信息产业部举报。
  先删掉自带的yum:
  rpm -aq|grep yum|xargs rpm -e –nodeps
  下载三个文件并安装:
  wget http://mirrors.163.com/centos/5/os/i386/CentOS/yum-3.2.19-18.el5.centos.noarch.rpm
  wget http://mirrors.163.com/centos/5/os/i386/CentOS/yum-metadata-parser-1.1.2-2.el5.i386.rpm
  wget http://mirrors.163.com/centos/5/os/i386/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
  wget http://mirrors.163.com/centos/5/os/i386/CentOS/yum-fastestmirror-1.1.16-13.el5.centos.noarch.rpm
  rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm yum-metadata-parser-1.1.2-2.el5.i386.rpm yum-3.2.19-18.el5.centos.noarch.rpm yum-fastestmirror-1.1.16-13.el5.centos.noarch.rpm
  下载配置:
  wget http://sudone.com/download/CentOS-Base.repo -O /etc/yum.repos.d/CentOS-Base.repo
  更新:
  yum update
  可能下载会比较慢,有一个办法可以解决,那就是等…或者可以去寻找快一点的源,不过那消耗的时间会更多。。执行到后面的时候会问yes/no,那是问你要不要更新整个系统,我至今没有选择过yes。
  装一个ImageMagick测测看看?:
  yum install ImageMagick
  试一下搜索:
  yum search kernel
  基本大功告成
  附x86_64:
  wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-3.2.19-18.el5.centos.noarch.rpm
  wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-2.el5.x86_64.rpm
  wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
  wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-13.el5.centos.noarch.rpm

cacti监控mysql配置

  插件一(可用):
  一,脚本下载以及设置
  wget http://mysql-cacti-templates.googlecode.com/files/mysql-cacti-templates-1.1.2.tar.gz
  tar -xzvf mysql-cacti-templates-1.1.2.tar.gz
  cd mysql-cacti-templates-1.1.2
  cp ss_get_mysql_stats.php /xok.la/cacti/scripts
  可以看到里面有多个监控项目,报告监控apache和nginx.我这只测试mysql,mysql相关的就2个文件:
  模板文件:cacti_host_template_x_db_server_ht_0.8.6i.xml
  插件:ss_get_mysql_stats.php
  修改ss_get_mysql_stats.php 文件 第30行
  $mysql_user = ‘cacti’;
  $mysql_pass = ‘cacti’;
  $cache_dir = “/xok.la/cacti/cache/”;
  设置准备监控的数据库的账户相关信息
  mkdir /xok.la/cacti/cache/
  chown -R vhost.vhost /xok.la/cacti/cache/
  chmod 777 -R /xok.la/cacti/cache/
  默认在获取的数据/tmp/下,会有cacti不能读取的情况。所以放在cacti目录来。
  二,创建监控Mysql需要的账户以及权限
  配置MySQL服务器,让cacti所在机器能够访问MySQL服务器的状态信息,必须拥有”process”权限。如果要监控InnoDB状态,还必须有”SUPER”权限。
  mysql> grant process,super on *.* to ‘cacti’@’%’ identified by ‘cacti’;
  mysql> grant all privileges on cacti.* to cacti@”%” identified by “cacti”;
  三,模板导入
  在cacti管理界面(Import Templates)导入cacti_host_template_x_db_server_ht_0.8.6i.xml。
  四,添加设备
  创建Graph。在Console选项卡下的左侧菜单栏中选择Devices,为要监控的主机新建一个Devices或选择已有Devices。在Associated Graph Templates中添加想要监控MySQL状态的Graph Templates(如X MySQL Connections GT模板)。并点击最上面的Create Graphs for this Host链接,在Graph Templates的选择框中选择X MySQL Connections GT,然后点击Create按钮,出现以下WEB页。
  监控的对象有:
  X InnoDB Buffer Pool Activity GT
  X InnoDB Buffer Pool GT
  X InnoDB I/O GT
  X InnoDB I/O Pending GT
  X InnoDB Insert Buffer GT
  X InnoDB Log GT
  X InnoDB Row Operations GT
  X InnoDB Semaphores GT
  X InnoDB Transactions GT
  X MyISAM Indexes GT
  X MySQL Binary/Relay Logs GT
  X MySQL Command Counters GT
  X MySQL Connections GT
  X MySQL Files and Tables GT
  X MySQL Handlers GT
  X MySQL Network Traffic GT
  X MySQL Processlist GT
  X MySQL Query Cache GT
  X MySQL Query Cache Memory GT
  X MySQL Replication GT
  X MySQL Select Types GT
  X MySQL Sorts GT
  X MySQL Table Locks GT
  X MySQL Temporary Objects GT
  X MySQL Threads GT
  X MySQL Transaction Handler GT
  插件二(可用):
  一,脚本下载
  wget http://www.faemalia.net/mysqlUtils/teMySQLcacti-20060810.tar.gz
  tar -xzvf teMySQLcacti-20060810.tar.gz
  cd teMySQLcacti
  cp mysql_stats.php /xok.la/cacti/scripts/
  cp dumpMemcachedStats.php /xok.la/cacti/scripts/
  二,模板导入
  在cacti管理界面(Import Templates)导入cacti_host_template_temysql_host-step300-heartbeat600.xml 与cacti_host_template_memcached_host-step300-heartbeat600.xml模板文件。
  三,创建监控Mysql需要的账户以及权限
  配置MySQL服务器,让cacti所在机器能够访问MySQL服务器的状态信息,必须拥有”process”权限。如果要监控InnoDB状态,还必须有”SUPER”权限。
  mysql> grant process,super on *.* to ‘cacti’@’%’ identified by ‘cacti’;
  mysql> grant all privileges on cacti.* to cacti@”%” identified by “cacti”;
  四,添加设备
  创建Graph。在Console选项卡下的左侧菜单栏中选择Devices,为要监控的主机新建一个Devices或选择已有Devices。在Associated Graph Templates中添加想要监控MySQL状态的Graph Templates(如teMySQL – Index Usage模板,此套模板是以teMySQL开头的一系列模板)。并点击最上面的Create Graphs for this Host链接,在Graph Templates的选择框中选择teMySQL – Locking and Slow,然后点击Create按钮,出现以下WEB页。
  监控的对象有:
  teMySQL – CPU Usage
  teMySQL – Index Usage
  teMySQL – InnoDB Buffers Pages/Mem
  teMySQL – InnoDB File I/O
  teMySQL – InnoDB InsBuffer
  teMySQL – InnoDB Locks
  teMySQL – InnoDB Row
  teMySQL – Load Average
  teMySQL – Locking and Slow
  teMySQL – Network Usage
  teMySQL – Old Command Stats
  teMySQL – Old Handler Stats
  teMySQL – Query Cache
  teMySQL – Replication
  teMySQL – Select Handler
  teMySQL – Select Queries
  teMySQL – Sorts
  teMySQL – Temporary Objects
  teMySQL – Threads/Abends
  teMySQL – Volatile Handler
  teMySQL – Volatile Queries

mysql双机热备份的实现步骤

  MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。本文描述了常见的同步设置方法。
同步有两种形式:
"主-从",和"主-主"。
一:"主-从"方式
IXDBA.NET社区论坛
1、准备服务器
由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。
本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是4.1.24,操作系统是Redhat Linux AS4.0
假设
同步Master的主机ip为:192.168.60.219,Slave主机ip为:192.168.60.132,2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:/usr/local/mysql/data(即为mysql数据库的默认数据目录)。
2、设置同步服务器
(1)、设置同步Master
每个同步服务器都必须设定一个唯一的编号,否则同步就不能正常运行了。接下来配置数据库同步配置文件,mysql数据库的配置文件默认名为my.cnf,数据库启动的时候从默认的data目录下读取my.cnf的信息,如果data下没有这个文件,可以建立一个,my.cnf的模板默认一般在mysql/support-files目录下,在此目录下有各种情况下的cnf文件,如my-huge.cnf,my-large.cnf,my-medium.cnf,my-small.cnf等等,根据情况,选择my-medium.cnf即可,然后拷贝到data下,改名为my.cnf.开始修改 my.cnf,增加以下几行:
log-bin
server-id = 1 (标识为master库)
sql-bin-update-same
binlog-ignore-db=mysql
set-variable=binlog-ignore-db=mysql #指定需要日志的数据库
然后在Master上增加一个账号专门用于同步,如下:
mysql>GRANT REPLICATION SLAVE ON *.* TO backup@192.168.60.132 IDENTIFIED BY ‘1234’;
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 Select 权限:
mysql>GRANT FILE,Select,REPLICATION SLAVE ON *.* TO backup@192.168.60.132 IDENTIFIED BY ‘1234’;
上面my.cnf文件中第四行表示不记录数据库mysql的更新日志,这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。
最后设置完成my.cnf,设置完成后,首先检查mysql/data目录下是否有mysql的启动关闭日值,类似的为*.info,localhost*,ib*之类的日值信息。如果有删除,然后在master服务器上启动mysql。可以通过查看data下的localhost.localdomain.err文件,测试master于Slave的连通情况。,同时用show slave status看同步配置情况。
接下来备份Master上的数据,首先执行如下SQL语句:
mysql>FLUSH TABLES WITH READ LOCK;
不要退出这个终端,否则这个锁就不生效了;接着导出数据,可以直接打包压缩数据文件,也可以使用mysqldump工具来做,推荐前者的方法,这样更为快捷简便。
root$cd /usr/local/mysql
root$tar zcf data.tar.gz ./data (在这里也可能是 "var" 等其它实际存放数据文件的目录,根据实情而定)
然后将这些数据拷贝到Slave服务器上,解开,设置好正确的权限及属主等之后, 启动Slave数据库,然后用"UNLOCK TABLES" 语句来释放锁。然后关闭数据库。
(2)、设置Slave
同主数据库一样,找到my.cnf的模板,修给成my.cnf,增加如下几行:
server-id = 2 (Slave服务器标识)
master-host = 192.168.60.219 #主服务器名
master-user = backup #同步账户名,默认是test
master-password =1234 #同步帐户密码,默认是空
master-port = 3306 #主服务器的 TCP/IP 端口号,默认是3306
set-variable=replicate-ignore-db=mysql #略过同步的数据库名,如果有多个,请设置多次
set-variable=replicate-do-db=cicro #想要同步的数据库名,如果有多个,请设置多次。
master-connect-retry=10 预设重试间隔60秒
设置完成后,首先检查mysql/data目录下是否有mysql的启动关闭日值,类似的为*.info,localhost*,ib*之类的日值信息。如果有删除,然后在Slave服务器上启动mysql,然后在Slave上检验一下是否能正确连接到Master上,并且具备相应的权限。
可以通过查看data下的localhost.localdomain.err文件,测试Slave与master的连通情况。
root$mysql -h192.168.60.219 -ubackup -p 1234
mysql>SHOW GRANTS;
+————————————————————————————————————————————–+
| Grants for backup@192.168.60.132 |
+————————————————————————————————————————————–+
| GRANT Select, FILE, REPLICATION SLAVE ON *.* TO ‘backup’@’192.168.60.132’ IDENTIFIED BY PASSWORD ‘*9FF2C222F44C7BBA5CC7E3BE8573AA4E1776278C’ |
+————————————————————————————————————————————–+
现在,重新启动Slave。启动成功后,登录Slave,查看一下同步状态:
mysql -hlocalhost -uroot
mysql>SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.60.132
Master_User: backup
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: localhost-bin.000002
Read_Master_Log_Pos: 1556
Relay_Log_File: localhost-relay-bin.000004
Relay_Log_Pos: 51
Relay_Master_Log_File: localhost-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: cicro,cicro
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1556
Relay_Log_Space: 51
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
可以看到,Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",这表明 Slave 的 I/O 和 SQL 线程都在正常运行。
至此,主-从同步设定成功。
二:"主-主"方式:
如果在master中加入slave设置,在Slave加入master设置,则就成了"主-主"同步方式。
1:配置master服务器
接着上面的配置,在master的my.cnf中加入一下配置信息:
master-host=192.168.60.132
master-user=backup
master-password=1234
replicate-do-db=cicro
master-connect-retry=10 预设重试间隔60秒
2:配置slave服务器:
首先在slave上增加一个账号专门用于同步,如下:
mysql> GRANT FILE,Select,REPLICATION SLAVE ON *.* TO backup@192.168.60.219 IDENTIFIED BY ‘1234’;
在slave的配置文件my.cnf中添加以下信息:
binlog-do-db=cicro
注意:当有错误产生时检查slave的data目录下*.err日志文件。此时同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start。
同样,首先删除两台服务器data下的日志信息,然后依次启动slave,master。实现双机互备。
测试:
向slave批量插入大数据量表AA(1872000)条,master数据库每秒钟可以更新2500条数据。

多MASTER自增字段冲突的问题

  You may know about the MySQL Cluster, which is a complex architecture to achieve high availability and performance. One of the advantages of MySQL Cluster is that each node is a peer to the others, whereas in a normal replicating system you have a master and many slaves, and applications must be careful to write only to the master.
  The main disadvantages of MySQL Cluster are (as of MySQL 5.0):
  The database is in memory only, thus requiring more resources than a normal MySQL database. (MySQL 5.1 introduces table spaces, with the capability of storing nonindexed data on disk.)
  Some normal features are not available, such as full-text searches, referential integrity, and transaction isolation levels higher than READ COMMITTED.
  There are some cases where the MySQL Cluster is the perfect solution, but for the vast majority, replication is still the best choice.
  Replication, too, has its problems, though:
  There is a fastidious distinction between master and slaves. Your applications must be replication-aware, so that they will write on the master and read from the slaves. It would be so nice to have a replication array where you could use all the nodes in the same way, and every node could be at the same time master and slave.
  There is the fail-over problem. When the master fails, it’s true that you have the slaves ready to replace it, but the process of detecting the failure and acting upon it requires the administrator’s intervention.
  Fixing these two misfeatures is exactly the purpose of this article. Using features introduced in MySQL 5.0 and 5.1, it is possible to build a replication system where all nodes act as master and slave at the same time, with a built-in fail-over mechanism.
  Setting Up a Multimaster Replication System
  For those of you not well acquainted with the replication basics, I can refer to an earlier article explaining MySQL replication, and the demanding reader can integrate with the dry but extensive official MySQL replication manual.
  Back to business. Consider the situation where you set up a replication system with more than one master. This has been a common scenario over the past several years. Chapters 7 and 8 of Jeremy Zawodny’s High Performance MySQL describe such a solution. At the time of the book’s publication, though, the necessary technology was not yet available.
  One hard-to-solve problem in a multimaster replication is the conflict that can happen with self-generated keys. The AUTO_INCREMENT feature is quite convenient, but in a replication environment it will be disruptive. If node A and node B both insert an auto-incrementing key on the same table, conflicts arise immediately.
  Rescue comes with recent versions. MySQL 5 introduces a couple of server variables for replicated auto-increment that address this specific problem and allow for the creation of an array of peer-to-peer nodes with MySQL replication.
  Quoting from the manual:
  auto_increment_increment controls the increment between successive AUTO_INCREMENT values.
  auto_increment_offset determines the starting point for AUTO_INCREMENT column values.
  By choosing non-conflicting values for these variables on different masters, servers in a multiple-master configuration will not use conflicting AUTO_INCREMENT values when inserting new rows into the same table. To set up N master servers, set the variables like this:
  Set auto_increment_increment to N on each master.
  Set each of the N masters to have a different auto_increment_offset, using the values 1, 2, … , N.
  Using those two variables as described in the manual, you can ensure that all nodes in your replication array will use different sequences of auto-incrementing numbers. For example, using auto_increment_increment = 10 and auto_increment_offset=3, the numbers generated when inserting three records will be 3, 13, 23. Using 10, 7, you’ll get 7, 17, 27, and so on.
  For my four-node array, I set auto_increment_increment to 10 for each node, and auto_increment_offset to 1 in the first node, 2 in the second, and so on.
  This is theoretically clear, but it still isn’t clear how I managed to transform these servers into peer-to-peer nodes.
  The answer is a circular replication, where each node is master of the following node and slave of the preceding one.
  Circular replication with two nodes
  In its simplest form, circular replication has two nodes, where each one is at the same time master and slave of the other (Figure 1).

  Figure 1. Circular replication between two nodes
  For this test, I used two servers in my company (water and air; there will soon be two more, named fire and earth). Their basic configuration is:
  # node A – (water) setup
  [mysqld]
  server-id = 10
  # auto_increment_increment = 10
  # auto_increment_offset = 1
  master-host = air.stardata.it
  master-user = nodeAuser
  master-password = nodeApass
  # node B – (air) setup
  [mysqld]
  server-id = 20
  # auto_increment_increment = 10
  # auto_increment_offset = 2
  master-host = water.stardata.it
  master-user = nodeBuser
  master-password = nodeBpass
  Notice the two magic variables in the configuration files. If you omit such variables (or comment them, as in this example), then something nasty may happen, and the unfortunate circumstances are easy to demonstrate. Remember that MySQL replication is asynchronous. It means that the replication process in the slave can happen at a different time than the one taking place in the master. This feature makes replication more resilient and ensures that even if you suffer a connection breakdown between master and slave, replication will continue when the slave connection resumes. However, this feature has a nasty side effect when you deal with auto-incremented values. Assume that you have a table like this:
  Create TABLE x (
  id int(11) NOT NULL AUTO_INCREMENT,
  c char(10) DEFAULT NULL,
  PRIMARY KEY (id)
  ) ENGINE=MyISAM DEFAULT CHARSET=latin1
  Assume also that the connection between node A and node B breaks for a moment. Suppose you issue an Insert statement in both servers, while the replication is not working and the auto_increment variables are not set:
  [node A] insert into x values (null, ‘aaa’), (null, ‘bbb’), (null, ‘ccc’);
  [node B] insert into x values (null, ‘xxx’), (null, ‘yyy’), (null, ‘zzz’);
  When replication resumes, you get a blocking error in both nodes:
  Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query. Default database:
  ’test’. Query: ‘insert into x values (null, ‘aaa’)’
  The reason is easy to discover:
  [node A] select * from x;
  +—-+——+
  | id | c |
  +—-+——+
  | 1 | aaa |
  | 2 | bbb |
  | 3 | ccc |
  +—-+——+
  [node B] select * from x;
  +—-+——+
  | id | c |
  +—-+——+
  | 1 | xxx |
  | 2 | yyy |
  | 3 | zzz |
  +—-+——+
  Both nodes have produced the same primary keys. Thus, when replication resumed, the DBMS justly complained that there was a mistake. Now activate those two variables to see what happens.
  [node A] set auto_increment_increment = 10;
  [node A] set auto_increment_offset = 1;
  [node B] set auto_increment_increment = 10;
  [node B] set auto_increment_offset = 2;
  Clean the errors, delete all the records in the test table, and redo the insertion (after stopping the replication, to simulate a communication breakdown):
  [node A] SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
  [node B] SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
  [node A] truncate x;
  [node A] stop slave ;
  [node B] stop slave ;
  [node A] insert into x values (null, ‘aaa’), (null, ‘bbb’), (null, ‘ccc’);
  [node B] insert into x values (null, ‘xxx’), (null, ‘yyy’), (null, ‘zzz’);
  Now the situation is different.
  [node A] select * from x;
  +—–+——+
  | id | c |
  +—–+——+
  | 1 | aaa |
  | 11 | bbb |
  | 21 | ccc |
  +—–+——+
  [node B] select * from x;
  +—–+——+
  | id | c |
  +—–+——+
  | 2 | xxx |
  | 12 | yyy |
  | 22 | zzz |
  +—–+——+
  Thus, when replication resumes, there is no conflicting error. This proves it. Choosing appropriate values for the auto_increment_increment and auto_increment_offset server variables prevents conflicts between auto-generated keys in this circular replication setup. QED.

BIOS下的TELNET后门代码

  该项目仅为实验性项目,主要目的是想隐藏一个Telnet后门在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连接到指定的计算机接受控制。
  项目涉及的相关知识及技术目录
  1、实验环境,使用bochs调试工具。
  2、刷新BIOS技术问题。
  3、代码植入BIOS问题。
  4、源代码相关技术问题:
  A、如何编写BIOS模块(如:PCI、ISA)。
  B、实模式关于HOOK磁盘中断的问题。
  C、磁盘中断中选择再次HOOK的问题。
  D、NT保护模式下设置物理地址映射。
  E、NT保护模式下线性地址寻址问题。
  BIOS模块调试实验环境采用Bochs
  Bochs虚拟机可以调试BIOS及操作系统,Bochs使用主要是配置它的配置文件,我们以实例配置文件简单讲解,Bochs实验调试等网上有很多相关文章,这里简单讲解。
  我的配置实例:文件名xp.bxrc,修改后的及需要设置的内容如下:
  ######使用的系统BIOS模块######
  romimage:file=$BXSHARE/BIOS-bochs-latest
  ######使用的CPU相关参数######
  cpu:count=1,ips=10000000,reset_on_triple_fault=1
  ######设置内存大小######
  megs:128
  ######添加我们的BIOS模块######
  optromimage1:file=test.bin,address=0xd0000
  ######使用的VGAROM模块######
  vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
  ######设置虚拟机硬盘与光盘######
  ata0-master:type=disk,path=”c.img”,mode=flat,cylinders=4161,heads=16,spt=63
  #ata0-slave:type=cdrom,path=”xp.iso”,status=inserted
  ######设置引导设备######
  boot:c
  #boot:cdrom,diskBochs调试加载配置文件方法:可以设置一个bat文件,如下内容:
  setBXSHARE=d:\bochs
  %BXSHARE%\bochsdbg.exe-q-fxp.bxrc
  如何刷新各种BIOS问题
  各种BIOS刷新相关工具早已在网上流传,工具的使用这里不作介绍,IcLord的作者已经给出很多编程方法实现。这里简单说下。
  UniFlash开源项目我也详细分析过,如果有必要我会给出UniFlash源代码的详解,该项目指出可以刷写所有BIOS芯片,但是该项目刷新BIOS存在很多问题,绝大多数情况是无法刷新的我实验过很多次,也尝试修改他的代码过很多次,没找到原因。
  AwordBIOS已经有通用的刷写API调用,不管在NT下还是在实模式下,IcLord也作了讲解。如果有时间我会给出实模式及NT下的刷写源代码及分析。
  代码植入BIOS问题
  关于网上提及的,IcLord讲到的我就不再做重复的分析。这里主要讲下我们的模块可以植入哪些地方以方便隐藏。以前的教程讲过的方法存的问题分析。
  一、ISA模块形式植入:这种方式只适合于较早的计算机,因为目前的计算机系统BIOS是不会加载ISA模块的。故只能做实验调试用的方法。
  二、PCI模块形式植入:该方法虽然系统BIOS都要加载PCIROM,但是系统BIOS只加载实际存在的PCI卡的ROM模块。而且通常BIOS设置中可以
  关闭相应的ROM启动。
  三、HOOKBootBlock或者说要启动的模块:该方法当然我认为是最有效的,但是又存在很多技术上的难题。检验和问题,不同BIOS的结构问题,过早的HOOK还存在再次获取CPU运行机会问题等等。
  本人实验过以上提及的所有方法,我认为HOOKPCI、VGA及相关启动模块是比较可寻的办法。为什么?一般这类的ROM模块是必须启动的,而且调试发现一般它的ROM本身代码用不完自身设置的大小,我们可以借助剩余大小隐藏我们的代码。例如:集成显卡会把显卡ROM集成到系统BIOS模块中,我们可以对该模块进行HOOK,修改ROM头部的跳转指令,跳到我们的代码开始处执行,我们的代码执行完后跳转到它的代码开始处执行。
  如何编写BIOS模块
  BIOS是分模块组合在一起的。这里对PCI及ISA模块作下简单分析,VGA模块跟PCI模块几乎一样。模块主要是头部有个规范,该规范适合所有BIOS系统。具体可以参看《PCI系统结构》及其他书籍。
  源代码实例可以参看国外ROMOS开源项目,该开源项目的思想很值得学习。该项目讲解了如何在BIOS中嵌入一个小型DOS,如:FreeDos。采用了把整个DOS系统盘镜像植入BIOS中,跟早期的PXE引导DOS机制类似,然后HOOK磁盘中断,模拟DOS系统盘镜像出一个盘,源代码编译后只有900多字节。这种思想在早期还是很值得学习的。
  实模式关于HOOK磁盘中断问题
  很早前就有业界内人士发贴问,为什么在我的ROM模块中HOOK磁盘中断会失败呢?关于这个问题现在目前网上已经有人作出过回答,国外的开源项目在2003年我都看到过。
  由于我们的ROM模块过早的运行,可能运行在磁盘服务前面了,这时如果HOOKInt13h会因为BIOS加载磁盘服务时重写Int13hIVT值,故我们设法HOOK其他服务,这个服务要求较早被BIOS安装且不会再次修改且加载操作系统前调用,最佳的这个服务选择就是int18h、int19h服务。可以参看
  BIOS源代码,也可以参看PXESDK说明文档略有讲过。
  我们的磁盘服务代码建议放在实模式高端内存,通过BIOS数据区域可修改,内存40:13,即物理地址413h处的值。降低常规内存值,高端的内存就留给我们用。我们的保护模式下运行的代码建议也放在这段内存,且要求放在以页基址开始的内存中,以便后面代码的页映射我们的保护模式代码物理页。页基址:内存物理页地地址开始的低12位为零,参看《80386保护模式教程》。
  若我们的代码直接在内存的ROM映射区内,可能导致在NT下访问不到我们的代码,因为NT内核加载程序ntldr可能不会映射该段内存,甚至可能BIOS在使用后都会关闭ROM区域这段内存,而且ROM区域这段内存在初始化后被系统BIOS设置成只读不能写。当然我们可以采取用int15h服务对ROM区域这段内存映射。
  当然也可以在NT启动过程中,在我们的磁盘服务中对想映射的内存都映射。由于代码大小的限制,故有些没必要的代码。尽量不使用了。
  磁盘中断服务中再次HOOK问题
  为了使我们的程序再次获得CPU运行机会,我们不得不得再次设法。调试发现NTLDR进入保护模式后在加载NT内核文件时,会切换CPU到实模式调用Int13H服务进行磁盘读。
  我们挂接磁盘服务就是为了截取NTLDR的读操作,这里我们可以HOOK或者修改NTLDR另一部分OsLoader的代码,跳转到我们的代码执行。当然也可以直接HOOKntosknrl导出的服务,参看我在2008.4.1发布的”程序从DOS/BIOS驻留内存到WINNT下监视内存数据”。
  注意,HOOKOsLoader的代码时选择HOOK指令问题,由于NTLDR切换到实模式读取数据,读完后会在保护模式下搬移数据到规划位置,进行内核的安装。故HOOK时选择HOOK指令就选择FFh/15h:使用CALLNEAR[OFS32]指令进行,该指令寻址采用绝对地址,类似指令也可以。
  当然我们的代码再次运行就会运行在OsLoader代码被我们HOOK处,调用我我们的代码执行,这时我们的代码运行环境:DS=ES=10h保护模式段,内存模式:FLAT。在这里我们可以通过扫描_BlLoaderData数据结构,获取NTOSKRNL镜像基址。
  可以通过PE搜索NTOSKRNL导出的API,可以参看网上相关教程。现在再次HOOKNTOSKRNL导出函数KeAddSystemServiceTable,HOOK该函数
  可以截获win32k.sys添加它自己的服务,以便我们再再次HOOkwin32.sys导出函数NtUserRegisterClassExWOW。HOOK该函数可以截取所有应用层程序注册窗口类,以便我们再再再次HOOK窗口类过程。这时我们的代码就运行在NT的应用层模式下。
  NT保护模式下设置物理地址映射
  先看一个WinDbg实例关于在我们的磁盘服务中获取CR3值修改页映射的分析,以前我的分析内容:
  NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。参看NT内存安排..
  a、win2kadvser:WINDBG看到NTKernelbase=0x80400000也就是NTOSKRNL.exe加载位置
  kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  cr3=00030000;->页目录表所在物理页(物理地址30000h)
  kd>d8003000080030800;看页目录发现现在低端2GB(0~80000000h)还未分配
  800300000000000000000000-0000000000000000…………….
  800300100000000000000000-0000000000000000…………….
  800300200000000000000000-0000000000000000…………….
  kd>d80030800;看高端开始分配情况页表(80000000h开始的分配情况)
  800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  8003081063117c0063217c00-63317c0063417c00c.|.c!|.c1|.cA|.
  8003082063517c0063617c00-63717c0063817c00cQ|.ca|.cq|.c.|.
  ;实例1:看80400000h(NTKernelbase),这个线性地址到物理地址映射情况.
  ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.
  ;在页目表位置:201h*4=804h在内存地址=[cr3]+804h..具体看保护模式教程
  kd>d80030000+804;看在页目录表位置的值
  800308046341030063510300-6331030063117c00cA..cQ..c1..c.|.
  ;二级页表所在物理页地址:63410300转换下34163h,物理页地址:34000h,163h是页属性.
  kd>d80034000;看在页表的值
  800340006301400063114000-6321400063314000c.@.c.@.c!@.c1@.
  ;物理地址基址:63014000转换下400163h,#物理地址基址#:400000h,163h是页属性
  ;最后发现物理地址基址(页地址)在400000h..观察物理地址400000h是NTOSKRNL.exe映像.
  kd>d80400000;观察物理地址400000h
  804000004d5a900003000000-04000000ffff0000MZ…………..
  80400010b800000000000000-4000000000000000……..@…….
  ;实例2:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4…
  kd>d80030000+200*4
  800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  ;二级页表对应物理地址:63210300转换下物理页基址=32000h,163是页属性
  ;8009e000h所在二级页表位置:32000h+9eh*4(8009e000h线性地址12~22的位)…
  kd>d80032000+9e*4
  8003227823e1090003f10900-03010a0003110a00#……………
  ;物理地址基址(页基址):23e10900转换下09e000h,123是页属性..
  ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  kd>d80030000+c00;计算略.页目录表位置,观察发现指向自己的…
  80030c00670003006300f017-000000006331a902g…c…….c1..
  b、winXP:WINDBG看到Kernelbase=0x804d8000PsLoadedModuleList=0x8055b420
  kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  cr3=00039000;->页目录表所在物理页(页目录物理地址30000h)
  kd>d8003900080039800;看页目录发现现在低端2GB(0~80000000h)还未分配
  800390000000000000000000-0000000000000000…………….
  kd>d80039800;看高端开始分配情况页表(80000000h开始的分配情况)
  80039800e9b900f606a10810-751bf606a3081075……..u……u
  ;实例1:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4…
  kd>d80039000+200*4
  8003980063b10300e3014000-63e10300e3010001c…..@.c…….
  ;二级页表对应物理地址:63b10300转换下物理页基址=3b000h,163是页属性
  ;8009e000h所在二级页表位置:3b000h+9eh*4(8009e000h线性地址12~22的位)…
  kd>d8003b000+9e*4
  8003b27803e1090003f10900-03010a0003110a00…………….
  ;物理地址基址(页基址):03e10900转换下09e000h,103是页属性..
  ———>;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000hBIOS/DOS向量区没映射.#*
  kd>d80000000;可看到现在没映射的情况,无法通过线性地址访问.
  80000000????????????????-????????????????????????????????
  80000010????????????????-????????????????????????????????
  ;80000000h的最高10位确定在页目录表位置=200h*4=800h.在页目录物理地址:[cr3]+800h
  kd>d80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h
  8003980063b10300e3014000-63e10300e3010001c…..@.c…….
  ;80000000h的12~22位次高10位确定在二级页表位置:物理地址3b000h+0*4
  kd>d8003b000;观察发现确实没映射.全0.注意:一个页项占4字节…
  8003b0000000000000000000-0000000000000000…………….
  ;修改成让它对应物理地址:000就可以,只修改允许访问就可以.也就是byteptr[8003b000]=63
  kd>e8003b00063
  kd>d8003b000;修改成功
  8003b0006300000000000000-0000000000000000c……………
  ;观察修改后的情况.;注意:要想设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..
  kd>g;让系统自动刷新TLB等寄存器….
  kd>d80000000
  8000000053ff00f053ff00f0-c3e200f053ff00f0S…S…….S…
  ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  kd>d80039000+c00;计算略.页目录表位置,观察发现指向自己的…
  80039c00679003006300f00f-000000006331e201g…c…….c1..
  c、分析以上总结:发现最开始获取的cr3值一直在用。
  故我们修改页项的效果会在windows运行后也生效通过以上的实例分析可以看出NT系统的页映射情况。
  进入保护模式之后这个CR3的值也就是页目录表位置被映射到了虚拟地址0c0000000h。
  上面调试的实例页目录表地址就可以直接使用这个虚地址。例如:在我们的代码中把我们的代码拷贝到SharedUserData空间未使用处去,就使用了页映射代码,直接修改第一个页指向的物理页,就是我们代码所在的物理页。
  NT保护模式下线性地址寻址问题
  关于我们的代码进入保护模式以后,所有指令的寻址问题,这里作一下分析。当我们代码第一个在保护模式下执行的指令,是前面提到的磁盘服务中对OsLoader的代码进入HOOK,也提到了采用什么样的HOOK指令以便寻址。
  接哪之后,我们的代码就开始运行在保护模式未分页情况下,我们采取的方法是把我们的代码拷贝到SharedUserData空间未使用处,涉及到拷贝的指令也必须运行在保护模式分页下,因为SharedUserData空间是一个虚地址。
  在这里我们采用了把我们的拷贝代码指令搬移到NTOSKRNL镜像的MZ与PE之间的区域,设置HOOKNTOSKRNL导出函数KeAddSystemServiceTable首先跳转到拷贝指令执行,HOOKNTOSKRNL导出函数KeAddSystemServiceTable采用相对跳转指令它们在同一个空间。
  当我们的拷贝指令把我们的代码拷贝到SharedUserData空间未使用处之后,我们的代码就有一个固定的虚地址,所有后续指令都可以采用这个虚地址进行寻址。

NIS详解

  网络信息服务(NIS)是集中控制几个系统管理数据库的网络用品。NIS简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。桌面系统的用户无需建立他们自己的/etc/passwd,他们只简单的使用维护在NIS服务器的文件即可。
  提到NIS不得不先说明一下WINDOWS2000的域控制器,在局域网内有一台WIN2000域控制器,下面有一些机器加入到这个域中,在下的机器登录时,有一个选项是选择登入到本机还时登入到域内(应该是这么说的,有点记不清楚了,大概就是这个了),登入本地的密码有本机控制,但是如果登入域内,密码支有域控制器负责管理。
  LINUX也是操作系统,跟WIN2000没有本质的区别,所以仔细读上段话,就能理解NIS是原理是什么样了,这时出现了一个重要的文件/etc/nsswitch.conf
  NIS是一个客户机/服务器系统,ypbind是定义NIS服务器的客户端进程。一旦确定了服务器位置,客户机绑定到了服务器上,所以客户端的住处查询都发往服务器。ypserv是回答客户端查询的服务器进程。
  安装ypbind客户端
  rpm -ivh ypbind*
  这没有什么好说的。
  配置NIS客户端
  进程ypbind这客记机的NIS域定位服务器,NIS域包括所有NIS服务器和客户机。它与DNS不同,尽管有些管理员将NIS域名等同于DNS的域名。NIS域名只对那NIS服务器和客户机起作用。
  有两种方式配置NIS域名:
  nisdomainname 定义显示NIS域名
  yp.conf文件配置NIS域名。
  #nisdomainname gogo
  #nisdomainname
  gogo
  默认地,ypbind使用nisdomainname命令返回NIS域名,向NIS服务器发出请求时在网络内广播该地址。
  yp.conf文件
  /etc/yp.conf定义了yp.conf配置。如果找不到yp.conf文件,ypconf进程使用nisdomainname 命令返回的NIS域名,广播定位NIS服务器。ypbind将绑定到第一个相应请求的服务器上。
  ypserver hostname
  domain nisdomain broadcast | server hostname
  ========
  hostname,nisdomain字符为变量。
  使用ypserver配置选项为客户机指定服务器。yp.conf文件包括ypserver选项时,客户机使用命令nisdomainname返回的NIS域名,向ypserver命令的hostname字段指定的服务器发出请求。/etc/hosts文件中必须包含该主机的IP地址,还记得我说过什么了吗,DNS是取代的HOSTS的,在DNS中设定也是可以的。ypserver选项强制客户机连接到特定的服务器上。
  在yp.conf文件中使用domain选项定义了NIS域名,指出客户机是广播定位还是直接向服务器发送请求。
  example:
  #/etc/yp.conf
  #
  domain first server jh
  =========
  first作为域名,jh是这个域的服务器 jh在hosts中必须有相对应的IP地址
  或者jh IN A 192.168.1.1还记得这条指令是干什么的吗?
  ------------------------
  创建NIS服务器
  安装ypserv
  rpm -ivh ypserv*
  -----------
  NIS服务器提供的数据库,称为NIS映射表.
  创建独立服务器
  如果用户只有一个NIS域服务器,建立独立服务器,如果用户NIS域中有多个服务器,就需要选择其中一个作为该域的主服务器。其他作为从服务器。
  用户可以使用make命令初始化独立服务器,建立NIS映射表,文件/var/yp/Makefile包含了创建数据库的命令。
  example:
  #nsidomainname first
  #cd /var/yp
  #make
  gamke[1]:Entering directory ‘/var/yp/terns’
  Updateing passd.byname……
  Updateing passwd.byuid…….
  …………
  ……..
  …..
  …
  ---------
  创新主从服务器
  使用ypinit命令初始化主服务器,常见NIS映射表。默认地.ypinit同make命令给出的操作一样。要创建相对于从服务器的主服务器,用户需要编辑/var/yp/Makefile文件。在Makefile文件中找到NOPUSH设置为NOPUSH=false.
  修改后,运行ypinit -m
  exmpale:
  #nisdomwiname first
  #cd /var/yp
  #/usr/lib/yp/ypinit m
  ………..
  next host to add:1111.first.myhome.com
  next host to add:2222.first.myhome.com
  …………..
  …………
  …………..
  is this correct? [y/n]y
  ……….
  ………
  updateing passwd.byname………
  ………….
  ……….
  ………..
  从服务器配置比主服务器简单。主服务器保存了所有的映射表。从服务器只需知道哪个是主服务器即可。ypinit -s 配置从服务器。
  example:
  #/usr/lib/yp/ypinit -s salve
  salve的IP地址也必须保存在hosts中。
  ----------
  安全性
  用户可以在/var/yp/securenets文件中定义服务器的安全性能。
  example:
  255.255.255.0 192.168.1.0
  授权192.168.1.0子网的用户可以访问服务器。
  —————–
  ypserv.conf文件
  用户必须使用securenets文件,未必用ypserv.conf定义安全性。
  语法如下:
  host:map:security:[mangle[]]
  字段如下
  host 授权或禁止访问的计算机,它由地址/掩码对确定.例如 192.168.1.0/255.255.255.0 . *表示所有主机
  map 该字段表示访问的NIS映射表项名称。例如:passwd.byuid。*表示映射表   中所有的字段都可用。
  security 授权访问类型
  none 允许访问,不加强安全性。
  port 允许特权端口访问。只接收源端口小于1024的连接。
  deny 禁止访问。
  des 访问时需要数字加密标准(DES)认证。
  [mangle[]] 指定应该在发出响应之前用”X”覆盖掉的字段(不明白)
  example:
  # Host : MAP : Security : mangle
  192.168.1.0/255.255.255.0 : * :none :no
  * :* :deny :no
  启动服务器
  /etc/init.d/ypserv restart
  启动NIS客户端
  /etc/init.d/ypbind restart
  测试NIS
  NIS客户端应该绑定到服务器。ypwhich命令可以检测客户端是否正确的连接到服务器。
  如果客户机正确的绑定到服务器,用ypcat检测服务器提供的信息。
  NIS与DNS是两会事,大家一定要搞清楚。虽然都有可能涉及到域名。但确实是两会事,他们之间会有一些连系。但绝不可以混在一起。切记,切记。
  ====================================
  nsswitch.conf文件
  nsswitch.conf文件不仅能处理主机表和DNS之间的优先次序,还能处理其它的问题。它为几个不同的系统管理数据库定义来源(多看几篇这句话,”几个不同的系统管理数据库”,可以是DNS,NIS,大家想一想)
  由nsswitch.conf控制的数据库
  alias EMAIL别名
  ehters 用于RARP的以太网地址。
  hosts   主机名和IP地址
  password 用户帐号信息。
  还有许多,没有列出来。
  使用不带NIS的nsswitch.conf example:
  password: files
  shadow: files
  ………..
  hosts: dns files
  #这句很重要,dns在先,files在后,这里的files指的是/etc/hosts文件,如果有客户端查询的时候,先找dns,再找files。顺序很重要。
  aliases: files
  ………
  ………
  ………
  使用带NIS的nsswitch.conf example:
  hosts: files nis dns
  protocols: nis files
  ………
  ……..
  ……..
  控制选择过程
  nsswitch.conf文件提供了几个可用于查询测试的状态关键字:
  success(成功) 查询返回所期望的结果。该状态的缺省的动作是返回结果给提交查询的应用程序(想一下,在我的DNS第二讲,说到解析器,就可以是提交查询的应用程序,不过他是DNS查询是了),然后退出查询过程。
  nofound(没有找到) 虽然查询工作正常,但所期望值没有找到。缺省的动作是查询下一行的源。
  unavail(不可用) 提交查询的源不可用。例,名称服务器没有运行。
  tryagain(重度) 源暂时不可用。缺省的动作是继续向下一个源提交查询。
  有两个关键字可以识别缺省的动作:return和continue。return告诉解析器返回值给应用程序并结束查询。continue告诉解析器继续向下一个源提交查询。
  状态和动作关键字可以结合起来,加到nsswitch.conf文件的源单中,以控制查询过程何时移到下一个源。
  状态检查的语法是:
  [ ( ! ? status=action ) + ]
  问号(?)代表任何状态值;叹号(!)对状态值取反。!SUCCESS是不成功的意思。方括号”[]”用于包括整个条件语句。圆括号”()”是可选的,只用来包含每个测试条件,可以有多个条件,每个条件用圆括号包含,之间用加号连接。
  例如:
  [ ( NOFOUND=RETURN ) + ( TRYAGAIN+TRETURN) ]
  其实就是C语言中的”与””或””非”的关系。
  下面是nsswitch.conf中的主机一行:
  hosts: dns [ !UNAVAIL=return ] files
  说明了UNAVAIL之外的所有状态,解析器应该将返回值给应用程序,然后退出。
  只有当DNS名称服务器没有运行的时候,解析器才能向主机表查询。如果有条件语句改变,缺省的动作卞会起作用,UNAVAI的缺省动作是continue。
  nsswich.conf文件已经取代了hosts.conf,因为它可以提供更多的资源控制方式。LINUX系统中通常这两个文件都有,但实际上起作用的是nsswitch.conf文件。
  hosts.conf文件介绍在我的DNS第三讲中有介绍

vsftp配置实例

  配置vsftp,使匿名用户只能下载,用户ftpup则可以上传和下载.
  以下操作均以root身份完成
  安装:
  rpm -ivh vsftpd-2.0.1-5.EL4.3.x86_64.rpm
  1.建立ftpup用户和ftpup组,将系统用户ftp加入ftpup组
  gropuadd ftpup
  useradd ftpup -g ftpup
  2.建立ftp服务目录:
  mkdir /var/incoming
  chmod 755 /var/incoming
  chown ftpup /var/incoming
  chgrp ftpup /var/incoming
  3.修改/etc/vsftpd/vsftpd.conf为如下内容:
  anonymous_enable=YES
  local_enable=YES
  write_enable=YES
  local_umask=022
  dirmessage_enable=YES
  xferlog_enable=YES
  connect_from_port_20=YES
  xferlog_std_format=YES
  chroot_list_enable=YES
  chroot_local_user=NO
  chroot_list_file=/etc/vsftpd.chroot_list
  pam_service_name=vsftpd
  userlist_enable=YES
  userlist_deny=NO
  listen=YES
  tcp_wrappers=YES
  anon_root=/var/incoming
  local_root=/var/incoming
  4.修改/etc/vsftpd.ftpusers为如下内容
  root
  bin
  daemon
  adm
  lp
  sync
  shutdown
  halt
  mail
  news
  uucp
  operator
  games
  nobody
  5.修改/etc/vsftpd.chroot_list为如下内容
  ftpup
  6.修改/etc/vsftpd.user_list为如下内容
  ftpup
  anonymous