
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>h4x5!6n&#039;s 撒欢儿之地</title>
	<atom:link href="http://www.hacksign.cn/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.hacksign.cn/blog</link>
	<description>撒欢之地</description>
	<lastBuildDate>Sat, 29 May 2010 14:48:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>二维指针与函数参数</title>
		<link>http://www.hacksign.cn/blog/?p=227</link>
		<comments>http://www.hacksign.cn/blog/?p=227#comments</comments>
		<pubDate>Fri, 16 Apr 2010 02:49:48 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=227</guid>
		<description><![CDATA[原文：http://www.b2cbeta.com/program-life/%E4%BA%8C%E7%BB%B4%E6%8C%87%E9%92%88%E4%B8%8E%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0
很久没有写c/c++代码了，不过以前积累的一些点还是慢慢积累下来。备用嘛
一般函数中，指针作为参数不会有太多的问题，通常传指针时会传入指针指向可用地址的最大长度。函数内操作时用到拷贝函数时，需要限定这个最大值（字符串指针通常会这么做）。不然会越界。指针作为函数参数传递时，编译器为指针参数制造了一个副本，在函数体内对这个指针副本指向的进行修改，对应的指针参数的内容也做了一个修改，这就是为什么可以用指针作为输出参数的原因。
举一个例子：

int test_point&#40;char *a, int len&#41;
&#160;
&#123;
&#160;
    char b&#91;10&#93;  = “iamb”;
&#160;
     memcpy&#40;a, b, len&#41;;
&#160;
&#125;
&#160;
int main&#40;&#41;
&#160;
&#123;
&#160;
    char *a = “iama”;
&#160;
    test_point&#40;a, 10&#41;;
&#160;
&#125;

在调用test_point函数时，编译器创建了指针_a，指向a所对应的内容“iama”,这个时候通过memcpy可以使_a指向的内容变成”iamb”。因为a和_a指向的内容一致，所以a的内容也变成了”iamb”。
如果我们想在函数内申请一块动态内存，外面可以访问，应该怎么做呢？
以下代码行不行呢？

&#160;
int test_point&#40;char *a, int len&#41;
&#160;
&#123;
&#160;
    a = &#40;char *&#41;malloc&#40;sizeof&#40;char&#41; * len&#41;; //动态申请域名，想供外部使用。
&#160;
    //do some stuff
&#160;
&#125;
&#160;
void test&#40;&#41;
&#160;
&#123;
&#160;
  [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=227</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C语言预处理运算符</title>
		<link>http://www.hacksign.cn/blog/?p=217</link>
		<comments>http://www.hacksign.cn/blog/?p=217#comments</comments>
		<pubDate>Tue, 30 Mar 2010 06:12:22 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=217</guid>
		<description><![CDATA[原文:http://blog.csdn.net/oncoding/archive/2010/01/04/5128721.aspx
预处理还需要运算符？有没有搞错？
^_^, 没有搞错，预处理是有运算符，而且还不止一个：

# （单井号）&#160;&#160;&#160; —— 字符串化运算符。 
## （双井号 ）—— 连接运算符 
#@&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; —— 字符化运算符。 

接下来我们会分别说明一下他们的用法.
1.字符串化运算符 —— #
用于创建字符串，#运算符后面应该跟一个形参（中间可以有空格或Tab），例如：

#define STR(s) #s
 puts(STR(Here is a Demo)); // 相当于puts(&#34;Here is a Demo&#34;);  
常用实例：
我们在调试代码的时候有时需要打印一些字符串的值，如下：


#include&#60;stdio.h&#62;   
#define Dump_Str(s) printf(&#34;%s = %s\n&#34;,#s,s);      
int main()   
{       
const char * pchName [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=217</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GDB命令参考</title>
		<link>http://www.hacksign.cn/blog/?p=216</link>
		<comments>http://www.hacksign.cn/blog/?p=216#comments</comments>
		<pubDate>Mon, 29 Mar 2010 12:05:05 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=216</guid>
		<description><![CDATA[








GDB 命令参考手册 
原文:http://blog.chinaunix.net/u/22564/showart_234581.html




命&#160; 令 


缩写 


用&#160; 法 


作&#160; 用 




help


h


h command


显示命令的帮助 




run


r


r [args]


运行要调试的程序 args为要运行程序的参数 




step


s


s [n]


步进,n为步进次数。如果调用了某个函数，会跳入函数内部。 




next


n


n [n]


下一步,n为下一步的次数 




continue


c


c


继续执行程序 




list


l


l / l+ / l-


列出源码 




break


b


b address


在地址address上设置断点 




b function


此命令用来在某个函数上设置断点。 




b linenum


在行号为linenum的行上设置断点。程序在运行到此行之前停止 




b +offset                        [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=216</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Visual C++中使用内联汇编</title>
		<link>http://www.hacksign.cn/blog/?p=211</link>
		<comments>http://www.hacksign.cn/blog/?p=211#comments</comments>
		<pubDate>Wed, 24 Mar 2010 04:18:48 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=211</guid>
		<description><![CDATA[原文:http://blog.csdn.net/zhlynn/archive/2009/06/04/4243024.aspx
一、内联汇编的优缺点 
因为在Visual C++中使用内联汇编不需要额外的编译器和联接器，且可以处理Visual C++中不能处理的一些事情，而且可以使用在C/C++中的变量，所以非常方便。内联汇编主要用于如下场合: 
1.使用汇编语言写函数；        2.对速度要求非常高的代码；         3.设备驱动程序中直接访问硬件；         4.&#34;Naked&#34; Call的初始化和结束代码。 

//(.&#34;Naked&#34;，理解了意思，但是不知道怎么翻译^_^，大概就是不需要C/C++的编译器(自作聪明)生成的函数初始化和收尾代码，请参看MSDN的&#34;Naked Functions&#34;的说明) 
内联汇编代码不易于移植，如果你的程序打算在不同类型的机器（比如x86和Alpha）上运行，应当尽量避免使用内联汇编。这时候你可以使用MASM，因为MASM支持更方便的的宏指令和数据指示符。 
二、内联汇编关键字 
在Visual C++使用内联汇编用到的是__asm关键字，这个关键字有两种使用方法: 
1.简单__asm块 




__asm 
&#123; 
MOV AL, 2 
MOV DX, 0XD007 
OUT AL, DX 
&#125;



2.在每条汇编指令之前加__asm关键字 


__asm MOV AL, 2 [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=211</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FS:0 FS:[0]之差异</title>
		<link>http://www.hacksign.cn/blog/?p=209</link>
		<comments>http://www.hacksign.cn/blog/?p=209#comments</comments>
		<pubDate>Sun, 28 Feb 2010 19:10:27 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[Assembly]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=209</guid>
		<description><![CDATA[原文:http://laokaddk.blog.51cto.com/368606/201397/
FS:0指向线程环境块TEB；
FS:[0]指向当前线程的结构化异常处理结构(SEH)；
FS:0指向TEB的理解应该是:
TEB结构存放于FS段从0开始的位置，整个TEB结构数据在FS段中；
FS:[0]指向当前线程的结构化异常处理结构的理解应该是:
在FS:0所指向的TEB结构中，第一个元素指向当前线程的结构化异常处理结构，而这个结构存在与DS段中；
部分TEB如下：
ntdll!_TEB
struct _TEB, 66 elements, 0xfb8 bytes
   +0&#215;000 NtTib            : struct _NT_TIB, 8 elements, 0&#215;1c bytes
      +0&#215;000 ExceptionList    : Ptr32 to struct _EXCEPTION_REGISTRATION_RECORD,2 elements, 0&#215;8 bytes
         +0&#215;000 [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=209</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RDTSC指令以及利用次指令anti debugger</title>
		<link>http://www.hacksign.cn/blog/?p=204</link>
		<comments>http://www.hacksign.cn/blog/?p=204#comments</comments>
		<pubDate>Sun, 28 Feb 2010 16:13:32 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[Assembly]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=204</guid>
		<description><![CDATA[原文：http://bbs.pediy.com/showthread.php?threadid=11562
RDTSC指令的使用以及相关问题
RDTSC指令的使用以及相关问题
Author：Lenus
From: www.popbase.net
E-mail：Lenus_M@163.com
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
1.前言
  最近碰到的RDTSC指令的问题，感觉挺烦人的，今天下午搞明白了一些东西就先放上来了。
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
2.正文
  1.使用RDTSC来anti-debug
  以下内如引用intel指令手册。
//引用开始
  RDTSC―Read Time-Stamp Counter
  Opcode        Instruction              Description
  0F 31         RDTSC Read time-stamp    counter into [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=204</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>二维数组的动态分配及参数传递</title>
		<link>http://www.hacksign.cn/blog/?p=191</link>
		<comments>http://www.hacksign.cn/blog/?p=191#comments</comments>
		<pubDate>Sat, 27 Feb 2010 07:02:53 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=191</guid>
		<description><![CDATA[原文:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html
1. C语言动态分配二维数组
(1)已知第二维
Code-1

char &#40;*a&#41;&#91;N&#93;;//指向数组的指针
&#160;
&#160;
a = &#40;char &#40;*&#41;&#91;N&#93;&#41;malloc&#40;sizeof&#40;char *&#41; * m&#41;;
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#41;&#41;;//4，指针
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#91;0&#93;&#41;&#41;;//N，一维数组
&#160;
&#160;
free&#40;a&#41;;

(2)已知第一维
Code-2

char* a&#91;M&#93;;//指针的数组
int i;
for&#40;i=0; i&#60;M; i++&#41;
a&#91;i&#93; = &#40;char *&#41;malloc&#40;sizeof&#40;char&#41; * n&#41;;
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#41;&#41;;//4*M，指针数组
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#91;0&#93;&#41;&#41;;//4，指针
&#160;
&#160;
for&#40;i=0; i&#60;M; i++&#41;
    free&#40;a&#91;i&#93;&#41;;

(3)已知第一维，一次分配内存(保证内存的连续性)
Code-3

char* a&#91;M&#93;;//指针的数组
int i;
&#160;
&#160;
a&#91;0&#93; = &#40;char *&#41;malloc&#40;sizeof&#40;char&#41; * M * n&#41;;
for&#40;i=1; i&#60;M; i++&#41;
a&#91;i&#93; = a&#91;i-1&#93; + n;
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#41;&#41;;//4*M，指针数组
printf&#40;&#34;%d\n&#34;, sizeof&#40;a&#91;0&#93;&#41;&#41;;//4，指针
&#160;
&#160;
free&#40;a&#91;0&#93;&#41;;

(4)两维都未知
Code-4

char **a;
int i;
&#160;
&#160;
a = &#40;char **&#41;malloc&#40;sizeof&#40;char *&#41; * m&#41;;//分配指针数组
for&#40;i=0; i&#60;m; i++&#41;
&#123;
a&#91;i&#93; [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=191</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>webQQ桌面化</title>
		<link>http://www.hacksign.cn/blog/?p=187</link>
		<comments>http://www.hacksign.cn/blog/?p=187#comments</comments>
		<pubDate>Sun, 21 Feb 2010 19:14:22 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[转载]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=187</guid>
		<description><![CDATA[http://linuxtoy.org/archives/webqq-desktop-integration.html
]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=187</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GeekOS分析(四)&#8212;&#8212;跳入内核</title>
		<link>http://www.hacksign.cn/blog/?p=179</link>
		<comments>http://www.hacksign.cn/blog/?p=179#comments</comments>
		<pubDate>Thu, 18 Feb 2010 17:19:51 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[Operating System]]></category>
		<category><![CDATA[原创]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=179</guid>
		<description><![CDATA[&#160;&#160;&#160; 在&#60;&#60;GeekOS分析(三)——Setup.asm分析&#62;&#62;中,最后提到一个宏定义,如下:

-DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms &#124;awk '{print $$1}'`

&#160;&#160;&#160; 既在kernel.syms中查找Main函数的地址,结合&#60;&#60;GeekOS分析(一)——Makefile分析&#62;&#62;可知,kernel.syms是由以下命令生成的:


$&#40;TARGET_NM&#41; geekos/kernel.exe &#38;gt; geekos/kernel.syms

&#160;&#160;&#160; 可见此文件是由kernel.exe生成的,再从Makefile中寻找kernel.exe的生成命令,得知该文件是由KERNEL_C_SRCS以及KERNEL_ASM_SRCS生成的OBJ文件编译得出的.
&#160;&#160;&#160; 搜索上面提到的文件列表,得知,Main函数位于src/geekos/main.c中.该文件分析详见下次讲解:)
]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=179</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeekOS分析(三)&#8212;&#8212;Setup.asm分析</title>
		<link>http://www.hacksign.cn/blog/?p=156</link>
		<comments>http://www.hacksign.cn/blog/?p=156#comments</comments>
		<pubDate>Tue, 16 Feb 2010 18:12:32 +0000</pubDate>
		<dc:creator>Hacksign</dc:creator>
				<category><![CDATA[Operating System]]></category>
		<category><![CDATA[原创]]></category>

		<guid isPermaLink="false">http://www.hacksign.cn/blog/?p=156</guid>
		<description><![CDATA[在&#60;&#60;GeekOS分析(二)&#62;&#62;中,提到,fd_boot.bin最终跳到了0×9020:0×0000处执行,而地址处存放的是setup.bin.下面是该程序的分析. 首先程序或得扩展内存(extended memory)的大小,进而得到了总内存大小.在关闭了软驱驱动器马达之后,执行了下面两条指令: 

lidt	&#91;IDT_Pointer&#93;
lgdt	&#91;GDT_Pointer&#93;

我们来看一下IDT和GDT是怎么定义的:

GDT_Pointer:
	dw NUM_GDT_ENTRIES*GDT_ENTRY_SZ	; limit
	dd &#40;SETUPSEG &#60;&#60; 4&#41; + GDT		; base address
&#160;
IDT_Pointer:
	dw 0
	dd 00

有关的常量定义:

; GDT initialization stuff
NUM_GDT_ENTRIES equ 3		; number of entries in GDT
GDT_ENTRY_SZ equ 8		; size of a single GDT entry
&#160;
GDT:
	; 第一个全局描述符是不使用的
	dw 0
	dw 0
	dw 0
	dw 0
&#160;
	; 全局描述符1: 内核代码段
	dw 0xFFFF	; bytes 0 and 1 of segment size
	dw 0x0000	; bytes 0 and 1 of segment [...]]]></description>
		<wfw:commentRss>http://www.hacksign.cn/blog/?feed=rss2&amp;p=156</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
