博文
MFC RTTI,DYNCREATE,SERIAL 技术相关宏分析(2007-11-16 19:12:00)
摘要:
MFC RTTI,DYNCREATE,SERIAL 技术相关宏分析
使用 MFC 的 RTTI 先直接或者间接从 CObject 类派生自己的类,如下 :
===============================================================================
class MyClass : public CWnd{
int a;
public:
DECLARE_DYNMAIC(MyClass);
};
INPLEMENT_DYNMIC(MyClass,CWnd);
MyClass t;
if(t.IsKindOf(RUNTIME_CLASS(CObject)))
MessageBox(NULL,"fdk","fdkf",MB_OK);
===============================================================================
一: DECLARE_DYNMAIC(MyClass) 的宏扩展:
#ifdef _AFXDLL // 动态链接版
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#define _DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static AFX_DATA CRuntimeClass class##class_name; \
......
[WinApi]MessageBox函数不工作的原因(2007-11-12 14:39:00)
摘要:[WinApi]MessageBox函数不工作的原因
学过API(windows C) 编程的人不防思考一下下面的MessageBox函数不能显示出对话框的原因 (我的实验平台:window 2000 profession + VC++6.0 )
#include <windows.h>
HINSTANCE ghInstance;
HWND ghMainWnd;
LPCTSTR lpszWndClassName=TEXT("myClass");
LPCTSTR lpszTitle=TEXT("myWindow");
// main window process
LRESULT CALLBACK MainWndProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam ){
PAINTSTRUCT ps;
HDC hdc;
switch(uMsg){
case WM_CREATE:
return 0;
case WM_PAINT:
return 0;
&nbs......
汇编多模块编译,连接(2007-11-06 12:55:00)
摘要:;-------------------------------------------------------
; MASM 汇编多模块编译,连接示例
;-------------------------------------------------------
; 模块 1 , 文件 data.asm
;-------------------------------------------------------
extrn msg:byte
extrn funNewLine:far
public newLine
data segment common
newLine db 10,13,'$'
data ends
code segment
assume ds:data,cs:code
main proc far
star: push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
lea dx,msg
mov ah,09h
int 21h
call far ptr funNewLine
ret
main endp
code ends
end star
; 模块 2, 文件 test.asm
;-------------------------------------------------------
extrn newLine:byte
public funNewLine
public msg
data segment public
msg db 'hello world$'
data&......
恶作剧程序(2007-11-06 12:14:00)
摘要:/*************************************************************\
恶作剧程序 :产生破坏 Windows 的文件关联的 .bat 文件,导致
所有程序不能通过鼠标双击加载。双击产生的 .bat
文件即可生效 .....
只因为无聊 ^_^ 同时还产生恢复程序所以不必担心 ^_^
Author: 江南孤峰 TIME:2007--7--5
\**************************************************************/
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
typedef struct DATA{
DATA(string ext, string ass,bool use=false):
strFileExt(ext),strAssoc(ass),use(false){}
string strFileExt;
string strAssoc;
bool use;
}DATA_TYPE;
int main(){
s......
灰鸽子使用方法(2007-11-04 12:15:00)
摘要:[[[[[ 本文系网络转载 ]]]]]
灰鸽子第二章:好马配好鞍,服务端正确配置。
灰鸽子是一款要交钱的软件,也就是说,你使用VIP版的话是要交给作者每年几十
块钱的使用费(不作任何评论)
因此网上也就有很多高手破解灰鸽子,让灰鸽子可以不用到灰鸽子的官方网站进
行验证,从而可以不用交钱就可以使用,
相关版本有:影子鹰破解专用版,爱儿破解版,以及华夏黑客联盟的灰鸽子
sunray破解版。
今天我们就用"灰鸽子sunray破解版"来向大家详细解析这款木马的服务端配置方
式,只可实验,不可做坏事,大家不喜欢请跳过这一章。
第一节:未雨绸缪,实验准备。
第一,关闭杀毒软件,这点不用我说了吧~~~因为是木马,下载了之后如
果杀毒软件监控开着的话肯定会被删除的。
第二,当然是下载灰鸽子的软件啦~~~上网找,有很多~~~
第三,申请一个免费的主页空间,为什么要呢?因为灰鸽子是可以反弹
式链接的,也就是说,服务端通过登陆你的主页的特定文件就可以主动连接到你
的电脑让你控制了。(这一点,等一下会详细解说)
第二节:实战开始。
把我们刚才下来的文件解压到某个文件夹,记住,不要改文件夹的名字,后面会
用到。
解压的文件里面有以下几个文件:
H_Client.exe 这个是客户端的主要文件,可以配置文件,生成服务端,可以远
程控制客户端。
http.exe 这个是本地http服务器,因为我们的灰鸽子是破解版的,通常正式版
的灰鸽子会到官方的服务器上去验证你的软件是否正版,所以这个软件就是用来
在本机子上建一个服务器,骗过软件的,从而达到破解的目的。
sunray.exe 这个里面其实也就只是一个host,它把http://www.huigezi.com这
个网站的域名本地解析到本机,而不是解析到官方网站。
vip_2005_0113.rar 这个是验证的软件,当我们的软件解析到本机的时候它就会
下载这一个到客户端,用来验证用的。
其它的文件还有config2005.asp,Operate.ini 还有四个文件夹,他们分别是
(dat images login sound)我也不知道什么用的。应该是配置用......
缓冲区溢出攻击演示程序(2007-11-02 21:27:00)
摘要:
缓冲区溢出攻击演示程序
缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见:
http://blog.programfan.com/article.asp?id=30692
下面是小型的攻击演示程序,程序源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void callCmd(){
printf("welcome admin !\n");
system("cmd");
}
void test(char p){
char buf[10];
printf("Enter passport:");
gets(buf);
if(!strcmp(buf,"admin"))
callCmd();
printf("Access deny !\n");
}
int main(){
char buf='A';
test(buf);
return 0;
}
上面的程序在正常执行时只有输入正确的"通行证" "admin" 才有权调用callCmd() 函数,但是由于使用了 gets() 函数,可以在输入时通过缓冲区溢出,将test()的返回地址直接改为callCmd() 函数的调用地址绕过验证,方法如下:
一 : 反汇编该程序生成的可执行文件,找到 callCmd() 的调用地址 : 00401030
二: 查看堆栈内容 { 调出堆栈,后面将会用到 }
三: 运行函数调用指令,同时查看堆栈以......
缓冲区溢出攻击(2007-11-02 20:08:00)
摘要:黑客中级技术--缓冲区溢出攻击 [ 转自网络]
缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的都是同一种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世界6000多台网络服务器瘫痪。
本文将分析缓冲区溢出的原理;研究各种类型的缓冲区溢出漏洞和攻击手段;最后,还将着重研究各种防御手段,用来消除这些漏洞所造成的影响。
一、 缓冲区溢出的原理
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
......
C++ bitset 类(2007-11-02 12:49:00)
摘要:有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件。在本书提供的例子中,假设都使用了std::bitset的using声明:
#i nclude <bitset>
using std::bitset;
3.5.1 bitset的定义和初始化
表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:
bitset<32> bitvec; //32位,全为0。
给出的长度值必须是常量表达式(2.7节)。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。
这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。
表3-6 初始化bitset对象的方法
bitset<n> b;
b有n位,每位都为0
bitset<n> b(u);
b是unsigned long型u的一个副本
bitset<n> b(s);
b是string对象s中含有的位串的副本
bitset<n> b(s, pos, n);
b是s中从位置pos开始的n个位的副本
1. 用unsigned值初始化bitset对象
当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为......
解决VS2005无法调试的问题(2007-10-28 08:59:00)
摘要:
解决VS2005无法调试的问题
当我们试图在VS2005中调试源代码的时候常常出现上面的问题而无法调试,下面是解决方法:
一: 单击 项目- 》项目属性 (我这里是 test)
二:如下,在选择“调试信息格式”时有几个方法,这里我们选择和VC6下相同的方法“用于编辑并继续的程序库”表示我们修改源代码后仍可以继续调试,其它的方法大家可以自己去尝试。
三:将 “优化” 选项禁用(因为 二 里选择的是“编辑并继续”无法优化)
四:如下,在“生成调试信息”中确认选择了“ 是/DEBUG”
五: 重新生成解决方案
六: 进行调试,OK 了
......
C++ STL 之父访谈录(2007-10-26 12:08:00)
摘要:STL之父访谈录
1995年3月,Dr.Dobb's Journal特约记者, 著名技术书籍作家Al Stevens采访了STL创始人AlexanderStepanov. 这份访谈纪录是迄今为止对于STL发展历史的最完备介绍, 侯捷先生在他的STL有关文章里推荐大家阅读这篇文章. 因此我将该文全文翻译如下:
Q: 您对于generic programming进行了长时间的研究, 请就此谈谈.
A: 我开始考虑有关GP的问题是在7O年代末期, 当时我注意到有些算法并不依赖于数据结构的特定实现,而只是依赖于该结构的几个基本的语义属性. 于是我开始研究大量不同的算法,结果发现大部分算法可以用这种方法从特定实现中抽象出来, 而且效率无损. 对我来说,效率是至关重要的, 要是一种算法抽象在实例化会导致性能的下降, 那可不够棒.
当时我认为这项研究的正确方向是创造一种编程语言. 我和我的两个朋友一起开始干起来. 一个是现在的纽约州立大学教授Deepak Kapur, 另一个是伦塞里尔技术学院教授David Musser. 当时我们三个在通用电器公司研究中心工作. 我们开始设计一种叫Tecton的语言. 该语言有一种我们称为"通用结构"的东西, 其实不过是一些形式类型和属性的集合体, 人们可以用它来描述算法. 例如一些数学方面的结构允许人们在其上定义一个代数操作, 精化之,扩充之, 做各种各样的事.
虽然有很多有趣的创意, 最终该项研究没有取得任何实用成果, 因为Tecton语言是函数型
语言. 我们信奉Backus的理念,相信自己能把编程从von Neumann风格中解放出来. 我们
不想使用副效应, 这一点限制了我们的能力, 因为存在大量需要使用诸如"状态", "副效
应"等观念的算法.
我在70年代末期在Tecton上面所认识到了一个有趣的问题: 被广泛接受的ADT观念有着根本性的缺陷. 人们通常认为ADT的特点是只暴露对象行为特征, 而将实现隐藏起来. 一项操作的复杂度被认为......