博文

破解入门(2005-09-26 10:27:00)

摘要: 第一课 壳 ************

一.壳的概念
作者编好软件后,编译成exe可执行文件
1.有一些版权信息需要保护起来,不想让别人
随便改动,如作者的姓名等
2.需要把程序搞的小一点,从而方便使用
于是,需要用到一些软件,他们能将exe可执行文件压缩,
实现上述两个功能,这些软件称为加壳软件或压缩软件.
它不同于一般的winzip,winrar等压缩软件.
它是压缩exe可执行文件的,压缩后的文件可以直接运行.

二.加壳软件
最常见的加壳软件ASPACK ,UPX,PEcompact
不常用的加壳软件WWPACK32;PE-PACK ;PETITE ;NEOLITE
第二课 脱壳
************
拿到一个软件,我们首先根据第一课的内容
侦测它的壳,然后我们要把它的壳脱去,还原它的
本来面目.若它没有加壳,就省事不用脱壳了.
一.脱壳软件
unaspack,caspr,upx,unpecompact,procdump
二.使用方法
(一)aspack壳 脱壳可用unaspack或caspr
1.unaspack  我的主页可下载中文版
使用方法类似lanuage
傻瓜式软件,运行后选取待脱壳的软件即可.  缺点:只能脱aspack早些时候版本的壳,不能脱高版本的壳
2.caspr
第一种:待脱壳的软件(如aa.exe)和caspr.exe位于同一目录下,执行
windows起始菜单的运行,键入 caspr aa.exe
脱壳后的文件为aa.ex_,删掉原来的aa.exe,将aa.ex_改名为aa.exe即可
使用方法类似fi  优点:可以脱aspack任何版本的壳,脱壳能力极强 缺点:Dos界面 第二种:将aa.exe的图标拖到caspr.exe的图标上 ***若已侦测出是aspack壳,用unaspack脱壳出错,说明是aspack高版本的壳,用caspr脱即可
(二)upx壳 脱壳可用upx
待脱壳的软件(如aa.exe)和upx.exe位于同一目录下,执行
windows起始菜单的运行,键入
u......

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

汇编语言上机指导及例示[转](2005-09-24 12:32:00)

摘要: Content:
从如何建立源文件到进行调试作下简要的介绍,并配例题说明。由于本人水平有限,在下文在如有错误及可以进一步修改的地方请大家指出 汇编语言上机过程:
一、上机前的软件准备:
MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等)
文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)
汇编程序 (如:MASM.EXE , ASM.EXE 等)
连接程序 (如:LINK.EXE 等)
调试程序 (如:DEBUG.EXE 等) 二、汇编程序建立过程:  
a.建立汇编源程序─通过───→b.编译为目标文件─ ↓┬─→d.连接为可执行文件
  ↑                        
  │  c.不通过,重新修改(语句错误)               ↓ 
  ├──────────────────────┘        ↓
  ↑   f.不正确,用调试工具调试,重新修改(逻辑错误)     ↓ 
  └────────────────────────────←e运行
                                 ↓正确
                              g.完成
三、现在对(二)的每一个标有字母的过程(PROCEDURE)进行详细说明 PROCEDURE a:建立汇编源程序(即:建立 文件名.asm)
这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的方法很多,下面将介绍具体方法。
1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入:EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:filename.asm ;(其中filename为你起的文件名,由1-8个字符组成),asm 是为汇编程序识别而必须加上去的,不可更改。存盘后在DOS下可用DOS命令DIR来查看,如果看到了所存的文件存......

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

汇编语言超浓缩教程[转]经典(2005-09-24 12:26:00)

摘要:Content:
    “ 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!”   对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解)   因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)   CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。......

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

与C的邂逅——初学C语言的收获与感受[转](2005-09-24 11:28:00)

摘要:I. 关于代码的格式: 1. 预先输入配对符号和易忘符号,如成对的大括号、双引号、小括号以及分号等 2. 大括号“{” 和“}”各自独占一行并与上一行首字母对齐; 3. 左大括号“{”的下一行进行整段缩进,直到遇到右大括号“}”,如果有多对大括号“{”“}”,重复以上规则; 4. 在每个左小括号“(”前加一个空格,每个逗号“,”后加一个空格,在实现不同功能的代码块之间加一个空行; 5. 控制每一行代码的长度,使其不超过屏幕显示的范围,当某一行即将到达屏幕边界时,按下回车键并缩进至与上一行行首对齐; 示例: #include<stdio.h>

main ()
{

/*大括号独占一行*/

 int icount=0; /*开始整段缩进*/

/*适当的空行用来使代码结构清晰*/

 clrscr (); /*清屏函数*/
 for (; icount<=10; icount++)
 {
  printf (“Value of icount is %d.\n”, icount);
 }

/*小括号前和逗号后的空格使代码不拥挤,更清晰*/

   return 0;
} II. 关于数据类型和变量: 1. 定义变量时应了解各种数据类型的可表示范围,考查其是否符合对输出结果数据精度的要求; 2. 尽量用少而有意义的一组字母、数字和下划线为变量命名,这样既可以减轻输入强度,又可以使代码便于理解,以利出错维护和功能扩展; 3. 为区分不同类型的变量,命名时应该在已经确定的变量名前加一个表示该变量类型的小写字母,如“int icount;”,这样当你在后面的代码中看到它时,就知道它是一个用作计数器的整型变量; 4. 用作部分和(累加器),部分积(累乘器)的变量最好在定义时就分别初始化为0和1, 如“int isum=0;”; III. 关于表达式的表示: 1. 不要忘记乘号“*”; 2. 当一个表达式里的符号(尤其是关系运算符)多得使你无法确定结果时,使用小括号限定运算顺序; 3. 使用相等测试......

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

编写一个简单的窗口(2005-09-23 19:25:00)

摘要:有关窗口的基本知识     窗口是屏幕上的矩形区域。一个窗口可以从键盘或者鼠标接受用户的输入,并在其内部显示图形输出。一个应用程序窗口通常包含程序的标题条、菜单、边框,滚动条。其中,对话框也是一种窗口。不同的是,对话框表面通常包含几个其它窗口,称之为“子窗口”。这些子窗口的形式有压入按钮、单选按钮、复选框、文本输入区域、列表框和滚动条等。 用户将这些窗口看成屏幕上的对象,可以通过按下一个按钮或者滚动一个滚动条与这些对象直接交互。
    窗口以“消息”的形式接收窗口的输入,窗口也用消息与其它窗口通讯。比如在程序窗口的大小改变时,字处理器会重新格式化其中的文本。窗口大小改变的细节是由操作系统处理的,但程序能够响应这个系统功能。当用户改变窗口的大小时,Windows给程序发送一条消息指出新窗口的大小。然后,程序就可以调整窗口中的内容,以响应大小的变化。程序创建的每一个窗口都有相关的窗口过程。也就是给这个窗口指定一个子程序(窗口过程),Windows通过调用它来给窗口发送消息。窗口过程再根据此消息进行处理,然后将控制返回给Windows。
    窗口在“窗口类”的基础上创建的。Windows定义了确省的窗口过程,如果你对所有的消息都让Windows自己处理,那么你就能得到一个标准的窗口,同样,你也可以选择处理自己感兴趣的消息,这样,相当于产生了不同的子类,也就形成了不同的应用程序。同样,子窗口也是基于同一个窗口类,并且使用同一个窗口过程。例如,所有Windows 程序中的所有按钮都基于同一窗口类。这个窗口类有一个处理所有按钮消息的窗口过程,但是,如果你按自己的设想设计一个按钮,如想把按钮的表面换成位图,你就可以自己处理按钮窗口的 WM_PAINT 消息,当 Windows 需要画按钮表面的时候,你就可以随自己的意思去画。
    Windows程序开始执行后,Windows为该程序创建一个“消息队列”。这个消息队列用来存放该程序可能创建的各种不同窗口的消息。程序中有一段代码,叫做“消息循环”, 它用来从队列中取出消息,并且将它们发送给相应的窗口过程。在没有消息发生的时候,你的程序实际上就在消息......

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

一个简单的对话框 --- 兼谈资源文件的使用(2005-09-23 19:25:00)

摘要:Windows 的资源文件     不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来就造成了很多资源共享的问题,大家可能还记的Dos下的很多游戏,它们的图形都是按自己的格式存放的,你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中,我们仍然可以这样做,但Win32编程给了我们一个方案 ---- 就是格式统一的资源文件,把字符串、图形、对话框包括上面的按钮,文本等定义到一个资源文件中,就可以方便的在不同的文件中使用它,最重要的是,如果我们用自己的文件格式,使用时就要涉及到这些文件的读写操作,比较复杂,但使用资源文件时,Windows提供了一系列的API来装入资源。非常方便。现在,让我们来看一个很简单的资源文件的源文件,它的扩展名是 .rc,当它用资源编译器编译以后产生 .res 文件就可以在 link的时候连入.exe 文件中: #include <Resource.h> #define DLG_MAIN 1 DLG_MAIN DIALOGEX 0, 0, 236, 185 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "对话框模板" FONT 9, "宋体" BEGIN DEFPUSHBUTTON "退出",IDOK,177,163,50,14 CONTROL "",-1,"Static",SS_ETCHEDHORZ,7,155,222,1 END 现在我简单解释一下 .rc文件的语法: #include <resource.h> -- resource.h文件包括资源文件的一些常量定义,如下面的 WS_POPUP,WS_VISIBLE 等窗口的风格等等 #define DLG_MAIN 1 -- 类似于 .asm 文件的 equ 语句,和汇编源程序一样,这些定义是为了程序的可读性。 DLG_MAIN DIALOGEX 0,0,236,185 Windows的.rc文件可以定义 BIT......

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

Win32汇编程序的结构和语法(2005-09-23 19:24:00)

摘要:Win32ASM程序的结构和语法   让我们先来看看一个最简单的Win32汇编程序: .386 .model flat, stdcall option casemap :none ; case sensitive include windows.inc include kernel32.inc includelib kernel32.lib .data szCaption db 'Win32汇编例子',0 szText db 'Win32汇编,Simple and powerful!',0 .code start: invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK invoke ExitProcess,NULL end start 这就是一个能执行的最简单的Win32汇编程序,下面我简单地介绍一下各部分的作用: .386 这条语句和Dos下汇编是一样的,是告诉编译器我们要用到80386的指令集,因为32位汇编程序要用到32位的寄存器如eax,ebx等,所以这一句是必须的,当然,你也可以用.486,.586等,当用到特权指令时,还可以用 .386p,.486p等等。 .model flat,stdcall .model告诉编译器程序的模式,编过Dos汇编的人可能知道在Dos程序的模式有tiny,small,...huge 等,它指定了程序内存寻址模式,在huge等模式下,内存寻址和子程序调用将用Far的格式,但在Win32汇编中,你只能使用一个模式即 flat 模式,因为对Win32程序来说,内存是连续的一个4GB的段,无所谓小或大的模式。而stdcall 告诉编译器参数的传递方式,在调用子程序时,参数是通过堆栈传递的,参数的传递方式有三种,stdcall,c 和 pascal,stdcall 指定了参数是从右到左压入堆栈的,比如说对一个Windows API 如 MessageBox,在手册中是如此定义的:int MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, /......

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

Win32汇编的环境和基础(2005-09-23 19:23:00)

摘要:1.32位环境简介   在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。
  在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M的内存,寻址时通过段寄存器来制定段的初始地址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。
  而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在最高级--0级中,所有应用程序都工作在3级中(Ring3), 在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说,系统才是全开放的。
  在内存方面,Windows使用了处理器的分页机制,使得对应用程序来说,所有的内存都是“平坦”的,你不必用一个段寄存器去指定段的地址,因为在保护模式下,段寄存器的含义是不同的(可以参见80386手册方面的书籍),你可以直接指定一个32位的地址来寻址4GB的内存。
  在程序结构方面,Windows程序也有很大的不同,它是“基于消息”的,你可以想象这样一个常见的Windows窗口,上面有几个按钮,如果你用Dos编程的思路去考虑,你会发现实现它很困难:鼠标移动到窗口边缘时拖动会......

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

8086/8088汇编语言指令集(2005-09-22 14:02:00)

摘要:8086/8088汇编语言指令集
数据传送指令集 

MOV
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data

XCHG
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m

PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数 POP 操作数
格式: PUSH r PUSH M PUSH data POP r POP m 

PUSHF,POPF,PUSHA,POPA
功能: 堆栈指令群
格式: PUSHF POPF PUSHA POPA

LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m LDS r,m LES r,m

XLAT(XLATB)
功能: 查表指令
语法: XLAT XLAT m


算数运算指令

ADD,ADC
功能: 加法指令
语法: ADD OP1,OP2 ADC OP1,OP2
格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
影响标志: C,P,A,Z,S,O

SUB,SBB
功能:减法指令
语法: SUB OP1,OP2 SBB OP1,OP2
格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data
影响标志: C,P,A,Z,S,O

INC,DEC
功能: 把OP的值加一或减一
语法: INC OP DEC OP
格式: INC r/m DEC r/m
影响标志: P,A,Z,S,O

NEG
功能: 将OP的符号反相(取二进制补码)
语法: NEG OP
格式: NEG r/m
影响标志:......

阅读全文(13168) | 评论:5

Win32汇编语言程序设计教程[转](2005-09-22 13:58:00)

摘要:Win32汇编语言程序设计教程



导言
先来对这个教程做个小小的介绍。Win32Asm不是一个非常流行的编程语言,而且只有为数不多(但很好)的教程。大多数教程都集中在编程的win32部分(例如,WinAPI,标准Windows编程技术的使用等),而不是汇编语言本身,例如伪代码(opcodes),寄存器(registers)的使用等。虽然你能在其他教程中找到这些内容,但那些教程通常是解释Dos编程的。它当然可以帮你学习汇编语言,但在Windows中编程,你不再需要了解Dos中断(interrupt)和端口(port)In/Out函数。在Windows中,WindowsAPI提供了你可在你的程序中使用的标准函数,后面还会对此有更多内容。这份教程的目的是在解释用汇编编Win32程序的同时学习汇编语言本身。

1.0-介绍汇编语言
汇编语言是创造出来代替原始的只能由处理器理解的二进制代码的。很久以前,尚没有任何高级语言,程序都是用汇编写的。汇编代码直接描述处理器可以执行的代码,例如:
add eax,edx
add这条指令把两个值加到一起。eax和edx被称为寄存器,它们可以在处理器内部保存值。这条代码被转换为66 03 c2(16进制)。处理器阅读这行代码,并执行它所代表的指令。像C这样的高级语言把它们自己的语言翻译为汇编语言,而汇编器又把它转换为二进制代码:
C 代码
a = a + b; >> C编译器 >> 汇编语言
add eax, edx >>汇编器>> 原始输出(十六进制)
66 03 C2

(注意该处的汇编语言的代码被简化了,实际输出决定于C代码的上下文)
1.1-为什么?(Why?)
既然用汇编写程序很困难,那么为什么你用A汇编而不是C或者别的什么??-汇编产生的程序更小而且更快。在像如有人工智能一般的非常高级编程语言中,编译器要产生输出代码比起汇编来更困难。虽然编译器变得越来越好,编译器仍然必须指出最快(或最小)的方式产生汇编代码。而且,你自己来写(汇编)代码(包括可选的代码优化)能生成更小更快的代码。但是,当然,这比使用高级语言难多了。还有另......

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