博文

一个简单的病毒汇编程序(2008-06-06 21:11:00)

摘要:转载请注明出处:http://www.czvc.com/

       引:前些天学病毒这门技术着实吃了很多苦头,走了很多弯路,尽管按我的知识水平,病毒已经是水到渠成的学习内容了。但是我现在学了入门才发现这门技术实际上隐藏着很多玄机,包含着许多技术,不专门学习研究根本无法达到“牛”的境界上去。如今写了这篇文章,介绍的都是相当实用的东西,可以让你少走许多弯路(有时侯一个错误够你找几个小时的)。不过需要些基础知识才能看懂。假如你有天知识储备够了,不学学病毒将是你的遗憾。另,由于是写给协会会员参考的,也没写的多“专业”,多了些赘述。

       在你看之前,你应该知道这只是篇可以带你入门的文章,如果你已经会了就不用看了。看的时候最好准备个PE表在旁边。写病毒程序可以使用很多种语言来写比如C,汇编,甚至有人用Dephi这样可视化编程工具都能写出来。但是最适合写病毒程序的还是汇编语言。汇编语言底层,灵活,速度快,体积小的优势能将一个病毒程序发挥到极至,通常一个程序写出来才几千字节就包含了所有的功能。一般一个病毒都有如下几个功能:

一 代码重定位

二 自己找到所需API地址

三 搜索文件、目录

四 感染文件

五 破坏系统或文件(随便你了)

其中一,二项功能是必要的,五项功能是可选的。而一个病毒程序感染文件的功能是它的核心,是衡量它质量的重要标准。

(一)代码的重定位

一个变量或函数其实是一个内存地址,在编译好后,程序中的指令通过变量或函数的内存地址再去存取他们,这个地址是个绝对地址。如果你将代码插入到其他任何地方,再通过原来编译时产生的地址去找他们就找不到了,因为他们已经搬家了。但是,你在写程序时考虑到这个问题,你就可以在代码最开始,放上几行代码取得程序基地址,以后变量和函数作为偏移地址,显式的加上这个基地址就能顺利找到了,这就是重定位。就象这段代码。

Call getbaseaddress

Getbaseaddr......

阅读全文(3859) | 评论:0

JPEG2000编码方案和结构划分研究(2008-06-06 21:06:00)

摘要:JPEG2000编码方案和结构划分研究 高勇  尹琦  李存华 (淮海工学院  计算机科学系,江苏  连云港  222005)       摘  要  JPEG2000作为一种先进的静止图像压缩标准,它的许多特征具有模块性。本文介绍了JPEG2000的压缩原理,描述了压缩系统的实现框架,讨论了其核心编码算法。在JPEG2000的压缩过程中,需要对图像的结构逐级进行划分,还要对码流结构进行分层次组织,以实施图像的渐进性传输。结构的划分作为JPEG2000的理论基础,有必要进行深入和准确的研究。     关键词  JPEG2000;图像压缩;嵌入编码;算术编码;小波变换  
1  引言     JPEG2000 是新一代静止图像压缩标准,它采用了小波变换、优化截断嵌入块编码和高效的码流组织形式。适用于各种类型的静止图像,如二值图像、灰度图像和彩色图像;支持自然图像、合成图像、医学图像和文本。JPEG2000 具有如下主要特点:     ①良好的低比特率压缩性能,以适应网络、移动通信等有限带宽的应用;     ②能够根据图像质量、视觉感受和分辨率进行渐进传输;     ③既支持无损又支持有损压缩;     ④对码流的随机存取和感兴趣区域(ROI)的编码;     ⑤具有较强的抗误码能力;     ⑥具有开放结构,并向下兼容等。 2  JPEG2000基本编码方案 2.1  基本编码流程方案     JPEG2000的基本编码流程方案主要有以下6个部分组成(如图1):     (1)预处理:主要是将源图像划分为较小的矩形区域,称为拼接块,作为独立的图像用于压缩。目的是为了降低压缩过程所需的内存资源。降低量级可以使样本的动态范围基本关于零对称,使在进行离散小波......

阅读全文(3527) | 评论:0

VC平台下汇编和C的嵌套使用示例(2008-06-01 19:30:00)

摘要: 内联汇编调用C/C++函数必须自己清除堆栈,下面是一个调用C/C++函数例子: #include <stdio.h> char szformat[]= "%s %s\n" ;
char szHello[] = "Hello" ;
char szWorld[] = "world" ; void main()
{
    __asm
    {
        MOV EAX,OFFSET szWorld
        PUSH EAX
        MOV EAX,OFFSET szHello
        PUSH EAX
        MOV EAX,OFFSET szformat
        PUSH EAX
        CALL printf
       
        ; 内联汇编调用C函数必须自己清除堆栈
        ; 用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
        POP EBX
        POP EBX
    &......

阅读全文(3339) | 评论:0

遍历目录树(2008-05-31 18:12:00)

摘要:  //从任意节点开始遍历目录树,Copyright   (C)   Y.B.Chen
  //已经在   Borland   C++   3.1   for   DOS   和   Borland   C++   Builder   6.0   下编译通过 
  
  #include   <stdio.h> 
  #include   <conio.h> 
  #include   <dir.h> 
  #include   <dos.h> 
  #include   <string.h> 
  
 int   lines   =   0;   //保存已经显示出几行了,如果到了一屏需要暂停
 int   bQuit   =   0;   //是否按了Esc键,如果按了Esc键,此数为非零,程序退出 
  
  void   clines(void)   //计算已经输出的行数,如果满一屏就暂停 
  { 
      unsigned   int   k; 
  &......

阅读全文(3748) | 评论:0

卸载其他进程已加载模块(2008-05-31 17:29:00)

摘要: #i nclude "stdafx.h" 
#i nclude <windows.h> 
#i nclude <stdio.h> 
#i nclude <Tlhelp32.h> 

typedef struct RemoteInfo 

  DWORD dwLoadLibrary; 
  DWORD ModuleAddr;  
}RemotePara;   //传递给远程线程的参数 

DWORD WINAPI ThreadProc (RemotePara *lpPara) 
{  
  typedef BOOL (__stdcall *pFreeLibrary)(DWORD); 
  pFreeLibrary pFuckLibrary; 
  pFuckLibrary = (pFreeLibrary)lpPara->dwLoadLibrary; 
  pFuckLibrary(lpPara->ModuleAddr);   //模块基地址 
  return 0; 


int main(int argc, char* argv[]) 

    MODULEENTRY32 ModuleStor;  ......

阅读全文(596) | 评论:0

Visual C++ MFC 简明教程(2008-05-31 17:27:00)

摘要:第一部分:MFC导论

  Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包容了 Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立 Windows 应用程序。这种层次结构适用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代码是完全可移植的。
  该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。在本节中,你将会输入、编译和运行一个简单的MFC程序。下一节中将向你详细解释这些代码。第三部分讨论了MFC控制和如何定制它们。第四部分将介绍消息映射,你将会处理MFC的事件。
  什么是MFC?
  如果你要建立一个 Windows 应用程序,应该如何下手?
  好的开端是从设计用户界面开始。首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些 Windows 用户已经是很熟悉了。要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
  下一步,是要实现代码。为任何 Windows 平台建立应用程序时,程序员都有两种选择:C 或 C++。 使用 C,程序员是在 Windows 应用程序界面 ( API ) 的水平上编写代码。该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。对于Windows NT, API 被称为 “Win32 API”,以区别于其用于Windows 3.1的16位 API。
  Microsoft 也提供了 C++ 库,它位于任何 Windows API 之上,能够使程序员的工作更容易。它就是Microsoft基本类库 (MFC),该库的主要优点是效率高。它减少了大量在建立 Windows 程序时必须......

阅读全文(2573) | 评论:0

介绍下加壳、脱壳以及如何病毒免杀技术与原理(2008-05-26 18:19:00)

摘要:介绍下加壳、脱壳以及如何病毒免杀技术与原理 在自然界中,我想大家对壳这东西应该都不会陌生了,由上述故事,我们也可见一斑。自然界中植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。 从功能上抽象,软件的壳和自然界中的壳相差无几。无非是保护、隐蔽壳内的东西。而从技术的角度出发,壳是一段执行于原始程序前的代码。原始程序的代码在加壳的过程中可能被压缩、加密……。当加壳后的文件执行时,壳-这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。 软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP(入口点,防止被破解)。关于“壳”以及相关软件的发展历史请参阅吴先生的《一切从“壳”开始》。 (一)壳的概念        作者编好软件后,编译成exe可执行文件。
       1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。
       2.需要把程序搞的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩,
       3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。实现上述功能,这些软件称为加壳软件。 (二)加壳软件最常见的加壳软件        ASPACK ,UPX,PEcompact 不常用的加壳软件WWPACK32;PE-PACK ;PETITE NEOLITE (三)侦测壳和软件所用编写语言的软件 ......

阅读全文(6524) | 评论:1

traits 使用特性(2008-05-21 22:45:00)

摘要://  VC6.0 2008/5/20 #include "iostream"
using namespace std; class SimpleCompareTrait { };
class ComplexCompareTrait { }; template<class T> class ComplexCompare
{
public:
 typedef T ValueType;
 typedef ComplexCompareTrait CompareTrait;
}; template<class T> class SimpleCompare
{
public:
 typedef T ValueType;
 typedef SimpleCompareTrait CompareTrait;
}; template<class T, class Iterator, class Compare>
Iterator __LowerBound(Iterator first, Iterator last, T val,
       Compare comp, ComplexCompareTrait)
{
 size_t len = 0;
 size_t half;
 Iterator middle;
 
 len = last - first;
 while (len > 0)
 {
  half = len >> 1;
  middle = first;
  middle += half;
  if (comp(*middle, val) < 0)
  {
   first = middle;
   ++first;
   len = le......

阅读全文(2196) | 评论:0

线程创建示例(2008-05-17 21:23:00)

摘要:// 控制台程序 vc 6.0 运行通过 #include "afx.h" #include #include using namespace std; DWORD WINAPI Func(LPVOID p); typedef struct { int firstArgu; long secArgu; } MyType,*pMyType; void main() { MyType MyTypeArgu={0}; MyTypeArgu.firstArgu=1; MyTypeArgu.secArgu=100000000; CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL); Sleep(5000); cout......

阅读全文(2504) | 评论:0

Argument Dependent Lookup (ADL)解析(2008-05-17 19:32:00)

摘要: ADL,参数相关查找,也称作为Koenig查找(以Andrew Koenig的名字命名,有兴趣可以看Scott Meyer的文章The Most Important C++ People...Ever),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。 f(x, y, z); // unqualified
N::f(x, y, z); // qualified
上面的函数调用,第一个f就是无限定域的函数调用,第二个则限定了在名字空间N里面,也是说使用了完全限定名。 我们首先来看一个函数所在的域的分类: 1:类域(函数作为某个类的成员函数(静态或非静态)) 2:名字空间域 3:全局域 而Koenig查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间加入查找的范围。 Herb提供的解释(Exceptional C++, Item 31) Koenig Lookup(simplified): If you supply a function argument of class type (here x, of type A::X), then to look up the correct function name the compiler considers matching names in the namespace (here A) containing the argument's type. 请看下面的例程: #include <iostream>
using namespace std;

namespace Koenig
...{
    class KoenigArg
    ...{
    public:
          ostream& print(ostream& out) c......

阅读全文(4461) | 评论:0