<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Yas Kernel Debugger]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[记录记得的点滴]]></description>
<link>http://hi.baidu.com/sysnap</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[YasVps1.0]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/6c6232512e345812367abed7.html]]></link>
        <description><![CDATA[
		
		<p><strong>  整整花了一个星期，打算不做了， 没时间，要考试，所以把最简单的版本发出来。</strong><strong>一些SHELL问题没很好的处理，懒的写DLL PATCH进程的SHXXX处理，该版本没有针对 写文件和覆盖文件的处理</strong></p>
<p><strong>你可以打开cmd, 然后 start 命令来启动进程，这样创建的进程就会受到YASVPS的限制</strong></p>
<p><strong><font color="#ff0000">附上一个头文件。。定义了相关的数据结构</font></strong></p>
<p><strong>#pragma once</strong></p>
<p><strong>// ucReseaon :<br>
//<br>
// Basic<br>
//<br>
#define YASVPS_CREATE_FILE&nbsp;&nbsp;&nbsp;&nbsp;  0x00</strong></p>
<p><strong>#define YASVPS_MOVE_FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x01<br>
#define YASVPS_REPLACE_FILE&nbsp;&nbsp;&nbsp;  0x02<br>
#define YASVPS_RENAME_FILE&nbsp;&nbsp;&nbsp;&nbsp;  0x03<br>
#define YASVPS_WRITE_FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x04</strong></p>
<p><strong>//<br>
//Option<br>
//<br>
#define YASVPS_SETFILE_BASICINFO 0x05<br>
#define YASVPS_SETFILE_ENDINFO&nbsp;&nbsp;  0x06<br>
#define YASVPS_SETFILE_POSINFO&nbsp;&nbsp;  0x07<br>
#define YASVPS_SETFILE_SECINFO&nbsp;&nbsp;  0x08</strong></p>
<p><strong>//<br>
//删除以存在文件时追踪, <br>
//对已存在文件的删除是不可恢复的，所以这个链表跟进程的生命周期一样，而且只能添加节点不能删除。<br>
//<br>
typedef struct __YASVPS_DELETETRACE<br>
{<br>
 struct __YASVPS_DELETETRACE* lpNext;<br>
 ULONG uPid;<br>
 ULONG uNew;<br>
 CHAR lpszDelFilePath[YASVPS_MAX_PATH];<br>
 <br>
}YASVPS_DELETETRACE, *PYASVPS_DELETETRACE;</strong></p>
<p><strong>//<br>
//创建新文件时追踪,添加节点前，先判断文件是否 &ldquo;删除文件追踪&rdquo; 存在，若存在，则删除对应节点<br>
//删除文件时，需要查找这个表的信息，如果发现删除的是自己创建的文件，则允许删除。并删除相关跟踪节点<br>
//同样的任何修改文件也需要先找这张表<br>
//外界不应该操作在YASVPS中运行进程创建的文件。<br>
//</strong></p>
<p><strong>/*<br>
dir 规则：<br>
如果在枚举目录文件时， &ldquo;删除以存在文件&rdquo; 中有文件在对应的目录中。<br>
如果在YASVPS_CREATEFILETRACE 没有相应节点，则过滤掉删除的文件，不显示<br>
否则显示之<br>
*/</strong></p>
<p><strong>/*<br>
覆盖文件：<br>
覆盖新创建文件： 直接允许<br>
覆盖已存在文件： 相当于 删除原来存在的文件，再创建一个新的文件。<br>
*/</strong></p>
<p><strong>/*<br>
移动已存在文件： eg: c:\123.exe ---&gt;&gt; c:\windows\123.exe  ---&gt;&gt; c:\123.exe<br>
相当于删除文件再创建文件。<br>
*/</strong></p>
<p><strong>//<br>
//修改以存在文件时追踪。删除下面匹配的文件时，相应节点也要删除。<br>
//</strong></p>
<p><br>
<strong>typedef struct __YASVPS_CREATETRACE<br>
{</strong></p>
<p><strong> //<br>
 //任何修改文件也需要先找这张表,再根据 ucReseaon 做相应的操作<br>
 //</strong></p>
<p><strong> struct __YASVPS_CREATETRACE* lpNext;<br>
 <br>
 ULONG uPid; //进程PID<br>
 HANDLE hFile;<br>
 PFILE_OBJECT lpFileObj; //保留</strong></p>
<p><strong> /*<br>
&nbsp;&nbsp;&nbsp;  ucReseaon :<br>
&nbsp;&nbsp;&nbsp;  #define YASVPS_CREATE_FILE&nbsp;&nbsp;&nbsp;&nbsp;  0x00<br>
&nbsp;&nbsp;&nbsp;  #define YASVPS_MOVE_FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x01<br>
&nbsp;&nbsp;&nbsp;  #define YASVPS_REPLACE_FILE&nbsp;&nbsp;&nbsp;  0x02<br>
&nbsp;&nbsp;&nbsp;  #define YASVPS_RENAME_FILE&nbsp;&nbsp;&nbsp;&nbsp;  0x03<br>
&nbsp;&nbsp;&nbsp;  #define YASVPS_WRITE_FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x04<br>
 */</strong></p>
<p><strong> UCHAR ucReseaon;<br>
 <br>
 /*<br>
 ucReseaon = YASVPS_CREATE_FILE <br>
 eg:&nbsp;&nbsp;&nbsp;  lpszCreatePath : C:\123.exe<br>
 重定向 lpszTracePath : C:\YasVPS\C:\123.exe<br>
 之后 修改名字为 hello.exe 则 lpszCreatePath : C:\hello.exe<br>
 对YASVPS_CREATE_FILE 文件的操作，都直接PASS， 删除文件时，需要删除lpszLinkPath,<br>
 并删除对应YASVPS_CREATETRACE节点</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;  &ldquo;外界不应该操作在YASVPS中运行进程创建的文件！！！！！&rdquo;<br>
 */</strong></p>
<p><strong> //<br>
 //重命名/移动文件/覆盖文件/创建后后新的路径<br>
 //<br>
 CHAR lpszNewPath[YASVPS_MAX_PATH]; <br>
 //<br>
 //指向的原始路径, 当该文件被写时，这个地方为TMP文件,写的文件不能超过10M(*)<br>
 //<br>
 CHAR lpszLinkPath[YASVPS_MAX_PATH]; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
 //<br>
 //下面的暂时保留，不支持，主要是从效率和节省内存考虑<br>
 //<br>
 /* FILE_BASIC_INFORMATION stFileBasicInfo;<br>
 FILE_END_OF_FILE_INFORMATION szFileEndInfo;<br>
 */<br>
}YASVPS_CREATETRACE, *PYASVPS_CREATETRACE;</strong></p>
<p> </p>
<p><span><strong><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/2daad52caf0cbaf58b139903.jpg"></strong></span><a target="_blank" href="http://dd.uueasy.com/download.php?predomain=sysnap&amp;host=sysnap.uueasy.com&amp;pid=tpc&amp;tid=16&amp;aid=33&amp;down_hash=Mm10aiFleSckb3IFIGMIMD5hMXVgTitwZlUCfnBXKmN6MjBTIHh0YSNyRAUwCwxb"><strong>可执行文件下载</strong></a></p> <a href="http://hi.baidu.com/sysnap/blog/item/6c6232512e345812367abed7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/6c6232512e345812367abed7.html#comment">查看评论</a>]]></description>
        <pubDate>2009年12月01日 星期二  16:44</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/6c6232512e345812367abed7.html</guid>
</item>

<item>
        <title><![CDATA[另一种确定文件存在方法]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/58ed26c2d63e02110ef477c1.html]]></link>
        <description><![CDATA[
		
		<p><strong>YasVps创建的文件，用explorer删除文件老失败。。跟踪发现，删除文件，复制文件，移动文件等。都用SHFileOperation<br>
让我奇怪的是它确定文件是否存在竟然不是 OpenFile, bp SHFileOperation,跟一下。</strong></p>
<p><strong>SHFileOperation(&amp;lpsh);<br>
SHELL32!MoveCopyDriver<br>
SHELL32!DTBuild<br>
SHELL32!DTPathToDTNode<br>
FindFirstFileExW</strong></p>
<p><strong>它确定文件存在不是OPENFILE，而是用 FindFirstFileExW<br>
RtlDosPathNameToNtPathName_U ， 取得目录和 文件名。<br>
NtOpenFile 目录，并把句柄传入 ZwQueryDirectoryFile， IN PUNICODE_STRING  FileName  OPTIONAL 为文件名，这个平时很少注意，这样它是根据 ZwQueryDirectoryFile来确定文件是否存在的，<br>
在FSD中。文件名为 QUERY_DIRECTORY：：FileName，不为NULL了。<br>
typedef struct tag_QUERY_DIRECTORY<br>
{<br>
  ULONG Length;<br>
  PUNICODE_STRING FileName; <br>
  FILE_INFORMATION_CLASS FileInformationClass;<br>
  ULONG FileIndex;<br>
} QUERY_DIRECTORY, *PQUERY_DIRECTORY;</strong></p>
<p><strong>提取到的FILE_OBJECT得路径也只能是目录了。</strong></p>
<p><strong>关于是什么用。。可能你做某些东西时会碰到这样的问题。。贴出来SHARE下。。</strong></p> <a href="http://hi.baidu.com/sysnap/blog/item/58ed26c2d63e02110ef477c1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/58ed26c2d63e02110ef477c1.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月26日 星期四  16:07</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/58ed26c2d63e02110ef477c1.html</guid>
</item>

<item>
        <title><![CDATA[YasTr.dll]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/8e765bf9ebf6dc53242df205.html]]></link>
        <description><![CDATA[
		
		<p><strong>  程序崩溃了，用yastr.dll定位问题问题。看看是堆被破坏了，还是栈被破坏了，还是其他异常问题。所以yastr.dll接管了目标应用程序的异常处理。</strong></p>
<p><strong>  使用，<font color="#ff0000">用一个loader把yastr.dll注入到目标进程就可以。。。dbgview看输出信息。。</font><br>
  可以获取到的信息<br>
  线程的CONTEXT, 调用栈， SEH处理，栈的开始和结束。<br>
  进程堆得信息。<br>
  <br>
  yastr.dll会替换掉异常处理函数，所以程序出错时会获得通知。 </strong></p>
<p><strong>  下图是下面xXXX代码的输出</strong></p>
<p><strong>   HANDLE hHeap;<br>
&nbsp;&nbsp;  hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0x10000, 0xfffff);<br>
 <br>
&nbsp;&nbsp;  char* buf = (char*)HeapAlloc(hHeap, 0,2);<br>
&nbsp;&nbsp;  printf(&quot;mybuf addr = %p\n&quot;,buf);</strong></p>
<p><strong>   CopyMemory( buf, mybuf, 100); <font color="#ff0000"> // 堆问题</font></strong></p>
<p><strong>&nbsp;&nbsp;  CHAR sz0[6]；</strong></p>
<p><strong>&nbsp;&nbsp;  strcpy( sz0, &quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<font color="#ff0000">&quot;);//栈问题</font></strong></p>
<p><strong><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/169397cede70cf16b700c829.jpg"><br>
</span></strong></p>
<p><strong><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/4ab353c8ee22d3387e3e6f29.jpg"></span></span></strong></p>
<p><strong><span><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/2daad52caf0cbaf58b139903.jpg"></span><a target="_blank" href="http://dd.uueasy.com/download.php?predomain=sysnap&amp;host=sysnap.uueasy.com&amp;pid=tpc&amp;tid=16&amp;aid=32&amp;down_hash=Mm10aiFleSckb3IFIGMIMD5hMXVgTitwZlUCfnBXKmN6MjBTIHh0YSNyRAUwCwxb">下载</a><br>
</span></span></strong></p> <a href="http://hi.baidu.com/sysnap/blog/item/8e765bf9ebf6dc53242df205.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/8e765bf9ebf6dc53242df205.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月19日 星期四  22:19</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/8e765bf9ebf6dc53242df205.html</guid>
</item>

<item>
        <title><![CDATA[基于硬件断点检测溢出]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/6d82c11652e4ed4021a4e92f.html]]></link>
        <description><![CDATA[
		
		<p><font size="3">  YYY。。溢出懂点点。有问题还指正。。</font></p>
<p><font size="3">&nbsp;&nbsp;  我们要知道，EIP指向的是可执行节，否则我们可以认为这是一次恶意攻击。SHELLCODE一般是会调用一些系统调用的</font></p>
<p><font size="3">，我们可以从这里入手来检测。<br>
  栈回溯： 通过HOOK常见的API，判断其返回地址来判断。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  缺点： 一些API没HOOK（没HOOK W版本，或者漏了NTDLL.DLL)，伪造EBP。<br>
  这里我们提出一种办法来检测。<br>
  首先，API是在某个模块里，一般搜索API会使用到 某个模块的基地址<br>
  1 通过PEB获取。<br>
  2 SEH获得：默认的异常处理函数时在KERNEL32.DLL里面的，SEH链最后一个异常处理函数的地址，以64K对齐向上查</font></p>
<p><font size="3">找MZ标记获取基地址<br>
  3 TEB： TEB(FS:[0X18]) + 0X1C是kernel32的地址空间，接着搜MZ标记。<br>
  <br>
  我们重点是针对第一种办法，后面俩中我们去掉MZ标记就可以了。<br>
  去掉MZ标记<br>
BOOL NO_MZ_PE(ULONG pid) <br>
{ <br>
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE; <br>
  MODULEENTRY32 me32; <br>
  HANDLE hProcess;<br>
  ULONG  Modulebase, dwOldProtect = 0;;<br>
  USHORT ReadFromProcess=0,WriteToMemory=0;<br>
  <br>
  hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pid);<br>
  if(hProcess==NULL)<br>
  {<br>
&nbsp;&nbsp;  printf(&quot;failed to open process!!\n&quot;);<br>
&nbsp;&nbsp;  return FALSE;<br>
  }<br>
  <br>
  hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid ); <br>
  if( hModuleSnap == INVALID_HANDLE_VALUE ) <br>
  { <br>
&nbsp;&nbsp;  printf(&quot;CreateToolhelp32Snapshot failed!!\n&quot;);<br>
&nbsp;&nbsp;  return( FALSE ); <br>
  } <br>
  <br>
  me32.dwSize = sizeof( MODULEENTRY32 ); <br>
  if( !Module32First( hModuleSnap, &amp;me32 ) ) <br>
  { <br>
&nbsp;&nbsp;  CloseHandle( hModuleSnap );<br>
&nbsp;&nbsp;  return( FALSE ); <br>
  } <br>
  do <br>
  { <br>
&nbsp;&nbsp;  if(!strcmpi(me32.szModule,&quot;kernel32.dll&quot;))<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  Modulebase=(DWORD)me32.modBaseAddr;<br>
&nbsp;&nbsp;&nbsp;  printf(&quot;module :%s found at :%x\n&quot;,&quot;kernel32.dll&quot;,Modulebase);<br>
&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;  } <br>
  } while( Module32Next( hModuleSnap, &amp;me32 ) ); <br>
 <br>
  VirtualProtectEx(hProcess,(PVOID)Modulebase, 2, PAGE_READWRITE, &amp;dwOldProtect);<br>
  <br>
  if(!WriteProcessMemory(hProcess,(PVOID)Modulebase, (void *)&amp;WriteToMemory, 2, NULL))<br>
&nbsp;&nbsp; printf(&quot;Write MZ Failed!!\n&quot;);<br>
  <br>
  ReadProcessMemory(hProcess,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (LPCVOID)((char*)(Modulebase+0x3c)), //Offset To NT Header<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;ReadFromProcess,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sizeof(USHORT),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL);<br>
  <br>
  VirtualProtectEx(hProcess,(PVOID)(Modulebase+ReadFromProcess), 2, PAGE_READWRITE, &amp;dwOldProtect);<br>
  if(!WriteProcessMemory(hProcess,(PVOID)(Modulebase+ReadFromProcess), (void *)&amp;WriteToMemory, 2, NULL))<br>
&nbsp;&nbsp;  printf(&quot;Write MZ Failed!!\n&quot;);<br>
  <br>
  CloseHandle(hProcess);<br>
  CloseHandle( hModuleSnap ); <br>
  return( TRUE ); <br>
}</font></p>
<p><br>
<font size="3">  通过PEB获取基地址比较简单，很多SHELLCODE都用。<br>
  返回地址异常的判断<br>
  1 根据 NT_TIB中的栈信息： 不可靠，可被修改<br>
  2 根据EBP+X来得到返回地址判断所在模块，不可靠，因为SHELLCODE可能复制到.DATA段<br>
  <br>
  我们简单的这么认为： EIP不是在已知的模块内，或者在可读可写（非.TEXT之类的），栈内就是可能的溢出</font></p>
<p><font size="3"> <strong> 为了定位API，SHELLCODE会访问PEB来获取模块基地址<br>
  一般会有如下的代码<br>
  mov eax, fs:0x30<br>
  mov eax,[eax+0xc]<br>
  mov esi,[eax+0x1c]<br>
  lodsd<br>
  mov eax,[eax+0x08] /// kernel32地址<br>
</strong>  <br>
  <strong><font color="#ff0000">只要我们对 eax+0x08 下一个读类型的硬件断点就可以了。这样 mov eax,[eax+0x08] 就会符合条件断下来</font></strong>，<strong><font color="#ff0000">我们通</font></strong></font></p>
<p><font size="3"><strong><font color="#ff0000">过挂接INT 1，分析EIP就可以了。</font></strong><br>
  DR0-DR3是设置断点的地址 ，我们可以吧剩余的断在常见API上。<br>
  可能在多线程的环境下，我们需要 DR7的 GD，全局检测启用，位13,防止线程切换时，DRX被切换。<br>
  R/W位（21,20)，11表示读写<br>
  LEN  一般是双字对齐吧，11就可以<br>
  DR7中，将保留位15,14,12,11填0，10填1<br>
  <br>
</font></p> <a href="http://hi.baidu.com/sysnap/blog/item/6d82c11652e4ed4021a4e92f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/6d82c11652e4ed4021a4e92f.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月10日 星期二  18:53</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/6d82c11652e4ed4021a4e92f.html</guid>
</item>

<item>
        <title><![CDATA[最近，想多了]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/9dde5b333cbb4e49ad4b5fd7.html]]></link>
        <description><![CDATA[
		
		<p><font size="3">  最近想做IE保护程序（防网马和溢出）， 沙盘，键盘记录防护，屏幕防护。。这些都是在可控制范围内，每一个项目至少需要15左右的时间，却发现没时间，大四的课还是挺多的，每天都得上课，完了之后根本没时间写代码，而且自己又喜欢学习新的东西，于是很多东西都基本没做，烦。。今天翻了下电脑，发现很多的资料，我都不知道里面是什么，是什么时候下载的，会不会看到，真晕。。自从大二开始学习编程到现在。基本每天都有在坚持。。直到现在，发现太多的东西还是没能掌握，每次去图书馆，看到那么多书，总是很兴奋，很矛盾。。兴奋的是书能带给我新的知识。。矛盾的是我却一直无法控制对计算机的兴趣。每次借书时，课内的基本都被我荒废了。。。。前些天借了几本黑客的书，翻了几眼就看不下去了，虽然里面的东西我还没实践过，但都是工具型，过期的。。顿时一点兴趣也没有。。。还是把基本功弄好吧。。。。。</font></p>
<p><font size="3">&nbsp;&nbsp;  这些天的因为某些事情，心思不放在电脑上，上网，习惯性的花上点时间，看下空间，逛下论坛。。然后就开始无聊了。。。有时候人要去维持些东西是很辛苦的，比如有人称赞你，你就得继续努力对得起别人的膜拜？？？？其实退出这个很小的圈子，谁还认识你。一个人一旦把某些东西当做自己的全部，那心态多少变得有点偏激，别人如果对你在意的东西进行东西否定，也许是很哀伤，也许是奋力反击。</font></p>
<p><font size="3">&nbsp;&nbsp;  我是很自卑的，自卑的俩中症状： 不敢表达 和 疯狂表达  。。这些东西下面隐藏的是不安的心灵。路人的心态是很不错的。</font></p>
<p><font size="3">&nbsp;&nbsp;  有时候我觉得称赞一个人是好事，但有时候却成了麻烦的事，我总觉了一下，如果你觉得你跟一个人是同一等级的，就不要去称赞他。比如你可以称赞你的师弟，师兄，就是不要去称赞你的同学。。中国人的等级观念太强了。。。一旦处在同一级别，人们往往是只要求平等，不要求公平。。。所以在一个集体里，如果你不是领导，就不要太高调了。。。。其实这点我觉得很纳闷，人之间讲究公平不好吗，干嘛死要面子？</font></p>
<p><font size="3">&nbsp;&nbsp;  你可以认为别人是真的对你好，但不要认为只对你一个人好，从同学的恋爱经历中，我总觉出这条，事实上这些的实际事基本都会发生，我也被纳闷了一下。不说也罢，一开始的心态是最重要的，你可以预想最坏的结果，但觉不能老想着美好的东西，因为很多东西，最后你会发现，很难是你能控制的。</font></p>
<p><font size="3">  每个人不是承受不了失败，而是没准备好失败。。。只有在主动上寻求被拒绝的机会，才能从心里上成熟</font></p>
<p><font size="3">  最近的确是太多的事情了，有时候觉得活着真累，压力有点大，学业上的，找工作上的，自己本身的。。但睡觉后，觉得又充满了希望。。。<strong>我发现每天饭堂都是鸡肉多，我也基本只能吃鸡。。鸡吃多了，也许下辈子要做鸡了。人们说做人难，你们说做鸡就容易吗？？</strong></font></p> <a href="http://hi.baidu.com/sysnap/blog/item/9dde5b333cbb4e49ad4b5fd7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/9dde5b333cbb4e49ad4b5fd7.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月09日 星期一  15:19</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/9dde5b333cbb4e49ad4b5fd7.html</guid>
</item>

<item>
        <title><![CDATA[定位可执行文件中不安全函数]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/c6a13e3e0d85a8f0838b1351.html]]></link>
        <description><![CDATA[
		
		<p><strong>  今天写了一半的程序，写不下去了，目前缓冲区溢出还是比较热门的，说到底是程序写代码没安全意识造成。在处理字符串上或者数组，整数上，造成了栈溢出，堆溢出或者整数溢出。当然有时候还有逻辑上的问题。下面的代码主要是想搜索PE文件中的不安全函数，来帮助发现程序中是否有不安全的函数存在。 这实现了对STRNCPY的例子。还不是很完善，没时间写了。</strong></p>
<p>#include &quot;windows.h&quot;<br>
#include &lt;stdio.h&gt;</p>
<p>//<br>
//一般是可执行节，我们不能仅根据 .TEXT / .CODE来确定。<br>
//<br>
typedef struct __section_info<br>
{<br>
 unsigned int uistart; //// map <br>
 unsigned int uiend; // map<br>
}section_info;</p>
<p>#define MAX_SECTION 4</p>
<p>typedef struct __mapfile_info<br>
{<br>
 unsigned int uisection_num;<br>
 section_info arr_sectioninfo[MAX_SECTION];</p>
<p> HANDLE hFile;<br>
 HANDLE hMapping;<br>
 PVOID lpMapbase;<br>
}mapfile_info,*pmapfile_info;</p>
<p>BOOLEAN&nbsp;&nbsp;  MAPFILE_INIT(LPCSTR szFileName, pmapfile_info lpMapFileInfo)<br>
{<br>
 <br>
 if( lpMapFileInfo == NULL)<br>
 {<br>
  return FALSE;<br>
 }</p>
<p> ZeroMemory( lpMapFileInfo, sizeof( mapfile_info ));</p>
<p> if (( lpMapFileInfo-&gt;hFile = CreateFile(szFileName, GENERIC_READ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_SHARE_READ,0,OPEN_EXISTING, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_FLAG_SEQUENTIAL_SCAN,0 )) == INVALID_HANDLE_VALUE)<br>
 {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf(&quot;Can't open file ! err 0x%08x \n&quot;,GetLastError() );<br>
  <br>
  return FALSE;<br>
 }</p>
<p> if (!( lpMapFileInfo-&gt;hMapping = CreateFileMapping( lpMapFileInfo-&gt;hFile ,0,PAGE_READONLY|SEC_COMMIT, 0,0,0)))<br>
 {<br>
  printf(&quot;Mapping failed.\n&quot;);<br>
  <br>
  CloseHandle( lpMapFileInfo-&gt;hFile );<br>
  <br>
  return FALSE;<br>
 }</p>
<p>&nbsp;&nbsp;&nbsp;  if (!( lpMapFileInfo-&gt;lpMapbase = MapViewOfFile( lpMapFileInfo-&gt;hMapping ,FILE_MAP_READ,0,0,0)))</p>
<p>&nbsp;&nbsp;&nbsp;  {<br>
  printf(&quot;View failed.\n&quot;);<br>
  <br>
  CloseHandle( lpMapFileInfo-&gt;hMapping );<br>
  <br>
  CloseHandle( lpMapFileInfo-&gt;hFile );<br>
  <br>
  return FALSE;<br>
 }</p>
<p><br>
 IMAGE_DOS_HEADER *dosHeader;<br>
&nbsp;&nbsp;&nbsp;  <br>
 IMAGE_NT_HEADERS *ntHeader;<br>
&nbsp;&nbsp;&nbsp;  <br>
 IMAGE_SECTION_HEADER *SectionHeader;</p>
<p>&nbsp;&nbsp;&nbsp;  int NumOfSections,test=0;</p>
<p><br>
 dosHeader=(IMAGE_DOS_HEADER*)lpMapFileInfo-&gt;lpMapbase;<br>
&nbsp;&nbsp;&nbsp;  <br>
 ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpMapFileInfo-&gt;lpMapbase+dosHeader-&gt;e_lfanew);<br>
&nbsp;&nbsp;&nbsp;  <br>
 NumOfSections=ntHeader-&gt;FileHeader.NumberOfSections;<br>
 <br>
 SectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpMapFileInfo-&gt;lpMapbase+dosHeader-&gt;e_lfanew+sizeof(IMAGE_NT_HEADERS));<br>
 <br>
 lpMapFileInfo-&gt;uisection_num = 0;</p>
<p> for (int i=0;i&lt;NumOfSections;i++)<br>
 {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpMapFileInfo-&gt;lpMapbase+<br>
&nbsp;&nbsp;  dosHeader-&gt;e_lfanew+sizeof(IMAGE_NT_HEADERS))+i;</p>
<p>  if( (SectionHeader-&gt;Characteristics&amp;0x20000020)!=0 ) /// executable section<br>
  {<br>
&nbsp;&nbsp;  if( lpMapFileInfo-&gt;uisection_num &lt; MAX_SECTION )<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  //<br>
&nbsp;&nbsp;&nbsp;  //RVA相对虚地址,VirtualAddress 本节的RVA(相对虚拟地址)。<br>
&nbsp;&nbsp;&nbsp;  //<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  lpMapFileInfo-&gt;arr_sectioninfo[lpMapFileInfo-&gt;uisection_num].uistart = <br>
&nbsp;&nbsp;&nbsp;&nbsp;  SectionHeader-&gt;VirtualAddress;</p>
<p>&nbsp;&nbsp;&nbsp;  //<br>
&nbsp;&nbsp;&nbsp;  // SizeOfRawData &gt;=VirtualSize&nbsp;&nbsp;  ,VirtualSize&nbsp;&nbsp;  是节在内存中的长度<br>
&nbsp;&nbsp;&nbsp;  // SizeOfRawData&nbsp;&nbsp;  则是VirtualSize经文件对齐后的尺寸。<br>
&nbsp;&nbsp;&nbsp;  // 你的.text的代码段长是0x110但是文件对齐尺寸是0x400,那.text的SizeOfRawData&nbsp;&nbsp;  就是0x400,<br>
&nbsp;&nbsp;&nbsp;  // 而virtualSize就是0x110 <br>
&nbsp;&nbsp;&nbsp;  //</p>
<p>&nbsp;&nbsp;&nbsp;  lpMapFileInfo-&gt;arr_sectioninfo[lpMapFileInfo-&gt;uisection_num].uiend = <br>
&nbsp;&nbsp;&nbsp;&nbsp;  SectionHeader-&gt;SizeOfRawData;<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  lpMapFileInfo-&gt;uisection_num++;<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  printf(&quot;-%s  0x%x\n&quot;,SectionHeader-&gt;Name,SectionHeader-&gt;VirtualAddress);<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  <br>
  }<br>
 }</p>
<p> return TRUE;</p>
<p>}</p>
<p><br>
void MAPFILE_CLEANUP( pmapfile_info lpMapFileInfo )<br>
{<br>
 UnmapViewOfFile( lpMapFileInfo-&gt;lpMapbase );<br>
 <br>
 CloseHandle( lpMapFileInfo-&gt;hMapping );<br>
 <br>
 CloseHandle( lpMapFileInfo-&gt;hFile ); <br>
}</p>
<p>unsigned int Find_strncpy(unsigned int start , unsigned int end) ///// VC 6 sp6<br>
{<br>
 unsigned char  *ucptr =  (unsigned char  *)start ;<br>
 unsigned int uic =  end - start;</p>
<p> if( end &lt; start)<br>
 {<br>
  return 0;<br>
 }</p>
<p> while( uic != 0)<br>
 {<br>
  if( ((unsigned char*)ucptr)[0] == 0x8b &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)ucptr)[1] == 0x4c &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)ucptr)[2] == 0x24 &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)ucptr)[3] == 0x0c &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)( (int)ucptr+0xd ))[0] == 0x8b &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)( (int)ucptr+0xd ))[1] == 0x74 &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)( (int)ucptr+0xd ))[2] == 0x24 &amp;&amp;<br>
&nbsp;&nbsp;  ((unsigned char*)( (int)ucptr+0xd ))[3] == 0x14 )<br>
&nbsp;&nbsp;</p>
<p>  {<br>
&nbsp;&nbsp;  printf(&quot;--find xx  0x%x\n&quot;,ucptr);<br>
&nbsp;&nbsp;  return (unsigned int)ucptr ;<br>
  }<br>
  ucptr++;<br>
  uic--;<br>
 }</p>
<p> return 0;<br>
}</p>
<p>BOOLEAN IsCallMatch( unsigned int uiAddress, unsigned int uiNorAddress)<br>
/*<br>
测试 uiAddress 地址 的指令是不是 call uiNorAddress<br>
*/<br>
{<br>
 __try<br>
 {<br>
  *(unsigned char*)uiAddress;</p>
<p> }__except(1)<br>
 {<br>
  return FALSE;<br>
 }</p>
<p> if(  *(unsigned char*)uiAddress != 0xe8  ) ///// now just sp e8<br>
 {<br>
  return FALSE;<br>
 }</p>
<p> unsigned int uiasc = 0;<br>
 unsigned int uiTmpptr = *(unsigned int*)( (unsigned char*)uiAddress+1);</p>
<p> <br>
 if( uiTmpptr &amp; 0x10000000 )<br>
 {<br>
  uiasc = uiTmpptr + uiAddress -0xFFFFFFFB;<br>
 }else<br>
 {<br>
  uiasc = uiTmpptr+ uiAddress +5;<br>
 }</p>
<p> return uiasc == uiNorAddress ? TRUE : FALSE ;</p>
<p><br>
}</p>
<p>unsigned int FucAddress(unsigned int uiAddress, unsigned int uimaylen)<br>
{<br>
 unsigned char  *ucptr = (unsigned char  *)uiAddress;</p>
<p> if( uimaylen != 0)<br>
 {<br>
  while( uimaylen != 0 )<br>
  {<br>
&nbsp;&nbsp;  if( IsBadReadPtr( ucptr+5, 5) == 0 &amp;&amp; <br>
&nbsp;&nbsp;&nbsp;  ( ucptr[0] == 0xcc &amp;&amp; ucptr[1] == 0xcc &amp;&amp; ucptr[2] == 0xcc &amp;&amp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ucptr[3] == 0xcc &amp;&amp; ucptr[4] == 0xcc ))<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  return (unsigned int)( ucptr+5 );<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  ucptr--;<br>
&nbsp;&nbsp;  uimaylen--;<br>
  }<br>
 }</p>
<p> return 0;</p>
<p>}</p>
<p><br>
void ________test()<br>
{<br>
 char cbuf[16];</p>
<p> ZeroMemory( cbuf, 16 );</p>
<p> //ENABLE_L __asm int 3<br>
 char* testpath = &quot;F:\\SysFilter\\.sys\\i386\\YasBoxFilter.sys&quot;;<br>
 //&quot;C:\\溢出测试<a href="file://debug//">\\Debug\\</a>溢出测试.exe&quot;;<br>
 </p>
<p><br>
 if( strncpy( cbuf, &quot;hello&quot; , 6) == NULL )<br>
 {</p>
<p> }</p>
<p>/*<br>
 //// E8 C8 85 FF FF<br>
 ///E8 D2 7B FF FF  0x39BEE9 0x393ac0<br>
 unsigned int xxx = Find_strncpy( (unsigned int)0x400000 ,(unsigned int)0x404005);</p>
<p> printf(&quot;--%d\n&quot;,IsCallMatch( 0x40bbd3 ,xxx) );</p>
<p> printf(&quot;--%x\n&quot;,FucAddress);</p>
<p> printf(&quot;--%x\n&quot;,FucAddress(0x40bbd3,0x1000));<br>
*/<br>
 unsigned int xxx = 0;</p>
<p> mapfile_info mapfilexfo;<br>
 <br>
 MAPFILE_INIT( testpath , &amp;mapfilexfo);</p>
<p><br>
 for( unsigned int i=0; i&lt;mapfilexfo.uisection_num; i++)<br>
 {<br>
  xxx = Find_strncpy( (unsigned int)mapfilexfo.lpMapbase+(unsigned int)mapfilexfo.arr_sectioninfo[i].uistart ,<br>
&nbsp;&nbsp;  (unsigned int)mapfilexfo.lpMapbase+ (unsigned int)mapfilexfo.arr_sectioninfo[i].uiend);<br>
  if( xxx != 0x0)<br>
  {<br>
&nbsp;&nbsp;  break;<br>
  }<br>
 }</p>
<p> //xxx-=(unsigned int)mapfilexfo.lpMapbase;</p>
<p> printf(&quot;--0x%x\n&quot;,mapfilexfo.lpMapbase);</p>
<p> unsigned int uissize = (unsigned int)mapfilexfo.arr_sectioninfo[i].uiend - <br>
  (unsigned int)mapfilexfo.arr_sectioninfo[i].uistart;</p>
<p> printf(&quot;s --0x%x\n&quot;,(unsigned int)mapfilexfo.lpMapbase+(unsigned int)mapfilexfo.arr_sectioninfo[i].uistart);</p>
<p> for( unsigned int j = (unsigned int)mapfilexfo.lpMapbase+(unsigned int)mapfilexfo.arr_sectioninfo[i].uistart ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  uissize--&gt;0 ; j++ )<br>
 {<br>
&nbsp;&nbsp;&nbsp;  if( IsCallMatch( j ,xxx) != 0 )<br>
  printf(&quot;RVA--%x\n&quot;, j - (unsigned int)mapfilexfo.lpMapbase);<br>
 }</p>
<p> //printf(&quot;e --0x%x\n&quot;,)</p>
<p> <br>
}</p>
<p>/*<br>
---------------------------------------------------<br>
*/<br>
DWORD RVAToOffset(LPVOID lpBase,DWORD VirtualAddress)<br>
{<br>
&nbsp;&nbsp;&nbsp;  IMAGE_DOS_HEADER *dosHeader;<br>
&nbsp;&nbsp;&nbsp;  IMAGE_NT_HEADERS *ntHeader;<br>
&nbsp;&nbsp;&nbsp;  IMAGE_SECTION_HEADER *SectionHeader;<br>
&nbsp;&nbsp;&nbsp;  int NumOfSections;<br>
&nbsp;&nbsp;&nbsp;  dosHeader=(IMAGE_DOS_HEADER*)lpBase;<br>
&nbsp;&nbsp;&nbsp;  ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader-&gt;e_lfanew);<br>
&nbsp;&nbsp;&nbsp;  NumOfSections=ntHeader-&gt;FileHeader.NumberOfSections;<br>
&nbsp;&nbsp;&nbsp;  for (int i=0;i&lt;NumOfSections;i++)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpBase+dosHeader-&gt;e_lfanew+sizeof(IMAGE_NT_HEADERS))+i;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(VirtualAddress&gt;=SectionHeader-&gt;VirtualAddress&amp;&amp;VirtualAddress&lt;=SectionHeader-&gt;VirtualAddress+SectionHeader-&gt;SizeOfRawData)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DWORD AposRAV=VirtualAddress-SectionHeader-&gt;VirtualAddress;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DWORD Offset=SectionHeader-&gt;PointerToRawData+AposRAV;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return Offset;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }<br>
 return 0;<br>
&nbsp;&nbsp;&nbsp;  <br>
}</p>
<p>unsigned int  getiat_funcaddress(unsigned int lpmap_base, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  const char* szfucname, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  const char* szModuleName)<br>
{</p>
<p>&nbsp;&nbsp;&nbsp;  PIMAGE_DOS_HEADER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dosHeader;<br>
&nbsp;&nbsp;&nbsp;  PIMAGE_NT_HEADERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntHeader;<br>
&nbsp;&nbsp;&nbsp;  PIMAGE_IMPORT_BY_NAME&nbsp;&nbsp;  ImportName;<br>
 PIMAGE_THUNK_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pThunk;<br>
 PIMAGE_IMPORT_DESCRIPTOR ImportDec;<br>
 char* pDllName = NULL;<br>
 unsigned int i = 0;</p>
<p> dosHeader=(IMAGE_DOS_HEADER*)lpmap_base;<br>
&nbsp;&nbsp;&nbsp;  <br>
 ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpmap_base+dosHeader-&gt;e_lfanew);<br>
 <br>
 ImportDec=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpmap_base+<br>
  RVAToOffset((LPVOID)lpmap_base,ntHeader-&gt;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));<br>
&nbsp;&nbsp;&nbsp;  <br>
 while(ImportDec-&gt;FirstThunk)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  <br>
  pDllName=(char*)((BYTE*)lpmap_base+RVAToOffset((LPVOID)lpmap_base,ImportDec-&gt;Name));</p>
<p>  if (strcmpi(pDllName,szModuleName)==0)<br>
  {<br>
&nbsp;&nbsp;  if(ImportDec-&gt;OriginalFirstThunk)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  pThunk=(PIMAGE_THUNK_DATA)((BYTE*)lpmap_base+<br>
&nbsp;&nbsp;&nbsp;&nbsp;  RVAToOffset((LPVOID)lpmap_base,ImportDec-&gt;OriginalFirstThunk));</p>
<p>&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  pThunk=(PIMAGE_THUNK_DATA)((BYTE*)lpmap_base+<br>
&nbsp;&nbsp;&nbsp;&nbsp;  RVAToOffset((LPVOID)lpmap_base,ImportDec-&gt;FirstThunk));</p>
<p>&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  while(pThunk-&gt;u1.Function)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  if(pThunk-&gt;u1.Ordinal&amp; IMAGE_ORDINAL_FLAG32)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;  //printf(&quot;EX_number：%x\n&quot;,pThunk-&gt;u1.Ordinal&amp;0xFFFF);<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;  {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  ImportName=(IMAGE_IMPORT_BY_NAME*)((BYTE*)lpmap_base+<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RVAToOffset((LPVOID)lpmap_base,(DWORD)pThunk-&gt;u1.AddressOfData));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  if( strcmpi( (const char *)ImportName-&gt;Name,szfucname )==0 )<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return (unsigned int)(ImportDec-&gt;FirstThunk + i*4);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;  //printf(&quot;--%s  0x%x \n&quot;,ImportName-&gt;Name, ImportDec-&gt;FirstThunk + i*4);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  i++;<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  pThunk++;<br>
&nbsp;&nbsp;  }<br>
  }<br>
 <br>
  ImportDec++;<br>
 <br>
 }<br>
&nbsp;&nbsp;&nbsp;  <br>
 return 0;</p>
<p><br>
}<br>
/*<br>
text:000111F5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:__imp__strncpy</p>
<p>FF 15 20  C0 01 00</p>
<p>text:00014D40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:__imp__strncpy<br>
FF 15 20  C0 01 00</p>
<p>.idata:0001C020 ; char *__cdecl _strncpy(char *, const char *, size_t)<br>
.idata:0001C020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  extrn __imp__strncpy:dword</p>
<p><br>
*/</p>
<p>BOOLEAN IsCallMatch_IAT( unsigned int uiAddress, unsigned int uiNorAddress)<br>
{<br>
 __try<br>
 {<br>
  *(unsigned char*)uiAddress;</p>
<p> }__except(1)<br>
 {<br>
  return FALSE;<br>
 }</p>
<p> if(  *(unsigned char*)uiAddress != 0xff  || *(unsigned char*)( (unsigned char*)uiAddress + 1) != 0x15)<br>
 {<br>
  return FALSE;<br>
 }</p>
<p> return ( *(unsigned int*)( (unsigned char*)uiAddress + 2) == uiNorAddress ) ? TRUE : FALSE;</p>
<p>}</p>
<p>void _____testIMPORT()<br>
{<br>
 char* testpath = &quot;F:\\SysFilter\\.sys\\i386\\YasBoxFilter.sys&quot;;</p>
<p> mapfile_info mapfilexfo;<br>
 <br>
 MAPFILE_INIT( testpath , &amp;mapfilexfo);<br>
 <br>
 unsigned int ui_strncpy_addr = <br>
 getiat_funcaddress( (unsigned long)mapfilexfo.lpMapbase, <br>
  (const char*)&quot;strncpy&quot;,(const char*)&quot;ntoskrnl.exe&quot; );</p>
<p> printf(&quot;--0x%x\n&quot;,ui_strncpy_addr);<br>
}<br>
void main()<br>
{<br>
// ________test();<br>
 _____testIMPORT();</p>
<p> printf(&quot;xxxxxxxxx&quot;);</p>
<p>}</p>
<p> </p>
<p> </p> <a href="http://hi.baidu.com/sysnap/blog/item/c6a13e3e0d85a8f0838b1351.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/c6a13e3e0d85a8f0838b1351.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月08日 星期日  12:37</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/c6a13e3e0d85a8f0838b1351.html</guid>
</item>

<item>
        <title><![CDATA[有时候]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/17ec5343aaaf5f1972f05d0c.html]]></link>
        <description><![CDATA[
		
		<strong>有时候，人要维持一些东西是很辛苦的。一个陷阱，一个也许走不出的圈。天凉了，也得为未来思考了。。找工作，把课考好。。我等普通大众也该回到生活正常的轨道继续正常的生活，曾经的幻想，忘了吧。。</strong> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/17ec5343aaaf5f1972f05d0c.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月03日 星期二  22:27</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/17ec5343aaaf5f1972f05d0c.html</guid>
</item>

<item>
        <title><![CDATA[突破MD文件保护02---一条命令]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/2ca7368f3e101ee4f01f36ad.html]]></link>
        <description><![CDATA[
		
		<strong><font size="4">MD2.4.4看来对这个没防啊..其他HIPS没测试.....CMD输入&nbsp;&nbsp; SUBST B:&nbsp;&nbsp; C:\<br>
&nbsp;&nbsp; 接着就可以删除文件和创建文件了......汗...........................<img border="0" src="http://bbs.kafan.cn/images/smilies/default/20.gif" smilieid="29"></font></strong> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/2ca7368f3e101ee4f01f36ad.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月02日 星期一  10:39</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/2ca7368f3e101ee4f01f36ad.html</guid>
</item>

<item>
        <title><![CDATA[我也来绕过MD文件保护01]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/9e4d150ae739ad1595ca6b98.html]]></link>
        <description><![CDATA[
		
		<p><strong>先来个简单的。 另外。。。<font color="#ff0000">MARK下 FILE_OPEN_BY_FILE_ID</font></strong></p>
<p><strong><span style="font-size: 10.5pt; mso-spacerun: yes">HANDLE hC;</span></strong></p>
<div style="layout-grid:  15.6pt none" class="Section0">
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">OBJECT_ATTRIBUTES ObjectAttributes;</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">INIT_UNICODE(uniSectionName, L&quot;\\??\\C:&quot;);</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">INIT_UNICODE(LinkTarget,L&quot;\\??\\X:&quot;);</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; mso-spacerun: yes">#define OBJ_CASE_INSENSITIVE 0x00000040L</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; mso-spacerun: yes">#define OBJ_KERNEL_HANDLE&nbsp;&nbsp;  0x00000200L;</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">InitializeObjectAttributes(&amp;ObjectAttributes,&amp;LinkTarget,</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x00000040L | OBJ_KERNEL_HANDLE,0,NULL); </span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">int x = NtCreateSymbolicLinkObject(&amp;hC, 0x000F0000L | 0x1 ,&amp;ObjectAttributes,&amp;uniSectionName);</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">CreateFile(&quot;X:\\Program Files\\Malware Defender\\hxxxxxxxx.exe&quot;,FILE_ADD_FILE,</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">FILE_SHARE_READ,NULL,CREATE_ALWAYS ,FILE_ATTRIBUTE_NORMAL,0);</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">CreateFile(&quot;X:\\Program Files\\Malware Defender\\Uninstall.exe&quot;,</span></strong></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><strong><span style="font-size: 10.5pt; mso-spacerun: yes">DELETE ,&nbsp;&nbsp;&nbsp;&nbsp;  0,&nbsp;&nbsp;&nbsp;  0,&nbsp;&nbsp;&nbsp;  OPEN_EXISTING ,&nbsp;&nbsp;&nbsp;  FILE_FLAG_DELETE_ON_CLOSE,0);</span></strong></p>
</div> <a href="http://hi.baidu.com/sysnap/blog/item/9e4d150ae739ad1595ca6b98.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/9e4d150ae739ad1595ca6b98.html#comment">查看评论</a>]]></description>
        <pubDate>2009年11月01日 星期日  16:56</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/9e4d150ae739ad1595ca6b98.html</guid>
</item>

<item>
        <title><![CDATA[Yasbox1.31更新用户程序，修改下弹框显示]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/6348de60f603ddd58cb10d54.html]]></link>
        <description><![CDATA[
		
		<p><strong>&nbsp;&nbsp;  之前有人说YASBOX的弹框很那个，今晚修改下用户程序， <font color="#0000ff">驱动还是老版本的，最近应该没时间更新，用户态程序也有一大堆问题待更新。比如日志管理，人性使用等，有时间再改</font>。。。先看下修改弹框的效果图吧。。如果不想这个弹框，可以用老版本的yasbox.exe覆盖</strong></p>
<p>&nbsp;&nbsp;&nbsp;<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/8d1f521652bd8736962b4325.jpg"><br>
</span></p>
<p><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/sysnap/pic/item/2daad52caf0cbaf58b139903.jpg"></span><a target="_blank" href="http://dd.uueasy.com/download.php?predomain=sysnap&amp;host=sysnap.uueasy.com&amp;pid=tpc&amp;tid=16&amp;aid=27&amp;down_hash=clIjdnRWaCZnZH5hYEZRdCZfaVskcXRUcBZZZXlHc3MmdCBrcU8JdXQAYzlnAEsN">下载</a></span></p> <a href="http://hi.baidu.com/sysnap/blog/item/6348de60f603ddd58cb10d54.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/6348de60f603ddd58cb10d54.html#comment">查看评论</a>]]></description>
        <pubDate>2009年10月31日 星期六  00:32</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/6348de60f603ddd58cb10d54.html</guid>
</item>


</channel>
</rss>