新手教程-爆破入门
【新手教程一】小Z以UPX为例,讲解什么是壳,什么是压缩壳?
UPX (the Ultimate Packer for eXecutables) 壳大家都不陌生,基本上是我们学习破解时候学习的第一个壳。
我们来到吾爱破解,我们是来学习破解的,为什么让我们非要学习脱壳呢?
虽然暂时不懂为什么要脱壳,我们可以先看看为什么要加壳?毕竟先有加壳才有脱壳的嘛(是先有鸡呢?还是先有蛋呢?)
一. 我写的这个程序太多,想把它压缩变小。那我就加压缩壳。
<ignore_js_op>
二. 我这是是一个商业的程序,是用来赚钱的,怎么可以被别人破解呢,那我就是加密保护壳
<ignore_js_op>
三. 其他(病毒加壳,Anti-AntiVirus)
<ignore_js_op>
今天就以压缩壳为例,讲讲UPX压缩壳的工作原理,等我学到了加密保护壳再去写这方面的帖子好了。
UPX (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。 通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。 UPX 支持许多不同的可执行文件格式 包含 Windows 95/98/ME/NT/2000/XP/CE 程序和动态链接库、DOS 程序、 Linux 可执行文件和核心。-百度百科
加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。当加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。-百度百科
----看完这2个关于百度百科的介绍,你似乎明白了点什么,但是还是很模糊。
压缩壳到底是什么?
----UPX加壳程序的作用就是压缩程序代码,实现把可执行文件的体积缩小50%~70%,
那压缩的原理是什么呢?
压缩就好像把 可执行文件中的 123456 用字母%A代替,789ABC用字母%C代替,这样程序代码的体积不久变小了很多。(要是可以这样压缩,这不都只有三分之一了,好机智)。看过《硅谷》这部美剧的同学,现在应该懂了吧,压缩算法很赚钱。
UPX壳既然压缩了,那为什么还可以正常的运行呢?
upx的工作原理其实是这样的:首先将程序压缩。
所谓的压缩包括两方面:
一方面在程序的开头或者其他合适的地方 插入一段代码。
另一方面是将程序的其他地方做压缩(也就是上面讲到的压缩)。压缩也可以叫做加密,因为压缩后的程序比较难看懂,原来的代码有很大的不同。
当程序执行时:实时的对程序解压缩。解压缩功能是在第一步时插入的代码完成的功能。
联起来就是:upx可以完成代码的压缩和实时解压执行。且不会影响程序的执行效率。
实时解压的原理可以使用一下图形表示:
<ignore_js_op>
程序从1开始执行,而1的功能是将2,3,4解压缩为7,8,9。7,8,9就是2,3,4在压缩之前的形式。
<ignore_js_op>
最初代码的形式就应该是:
<ignore_js_op>
用upx压缩之后形式为:
<ignore_js_op>
执行时的形式变为:
<ignore_js_op>
看完这些,你现在懂了为什么我们用F8单步法的时候,一直要向下,遇到向上的调整要F4执行到下一条? 其实就是想运行完1.UPX插入的代码,同时让UPX插入的代码去解压得到正在的7,8,9未压缩的代码。 本次的讲解到这里就完了,像小生大大说的那样,你能在吾爱写上一篇学习心得可能就能挽救一个准备放弃的人,技术是共进的,就是说在以后的技术生涯想依靠一己之力,是很有限的。 我是一名破解新手,但是底层方面和编程能力方面还不错,希望今天写的帖子可以帮助到大家,特别是初学者。第一次分享技术贴,希望大家多多支持。@Hmily @小生我怕怕
附件资源:脱壳前后的代码比较(小生我怕怕教程第二课补充):链接:http://pan.baidu.com/s/1i3rjak9 密码:dz9p
【新手教程二】小Z带你了解一个程序是怎么运行起来的?
这次教程,讲解一个程序是怎么运行起来的?
看完本篇,你可以明白你打开OD到底看的的是什么?
一.我还是上次的那个UPX程序
二.我被打开的必经之路
三.开始我被放在了硬盘里面(不知道你们删除了我没有,自从作为了第一次作业)
四.被你点击之后,我被加载到了内存之中。(就要被各种处理了,好怕怕)
五.当我被加载到了内存中,(什么都被你们看到了 T_T)
我其实一般可以给你看我的三个位置,好害羞
这是我的第一个部分
这是我的第二个部分
这是我的第三个部分
六.CPU要开始动手了,啊
寄存器的简单说明:http://www.52pojie.cn/thread-388794-1-1.html
第二篇的课程到这里就结束了,对课程内容有什么好的建议,一定要回帖告诉我呀。
下一次课的内容,可能会将代码是怎么一步一步的运行的,以及OD上一系列的问题,堆栈平衡等等。
我的目标:是通过对问题的本质的理解,学习我们操作的原理。
如果你有什么了解的问题,也可以回帖告诉我,我会优先构思,加入到课程中。
也不知道这次的课程大家会不会喜欢。 @小生我怕怕 大大 @Hmily 大大 你们怎么看?
[汇编] 汇编寄存器笔记
EAX : 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
ECX : 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX : 则总是被用来放整数除法产生的余数。
EBX : 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
ESP : 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
EBP : 是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码
1
2
3
|
push ebp ;保存当前ebp mov ebp , esp ;EBP设为当前堆栈指针 sub esp , xxx ;预留xxx字节给函数临时变量. |
ESI/EDI:分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
EIP: 寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
ES:附加段寄存器
CS:代码段寄存器
SS:堆栈段寄存器
DS:数据段寄存器
FS:标志段寄存器
GS:全局寄存器
EFLAGS
C:进位标志 最高有效位产生的进位值,例如 执行加法指令时,MSB有进,置CF=1;否则CF=0
P:奇偶标志 当操作数中有偶数个1时,置PF=1,否则PF=0
A:辅助进位标志 运算过程中第三位有进位,置AF=1,否则AF=0
Z: 零标志 结果=0,ZF=1,结果≠0,ZF=0
S:符号标志 设置成运算操作结果的符号状态。当结果为负时,SF=1,否则SF=0
T:跟踪标志 TF=1,机器进入单步工作方式,每条机器指令执行后,显示结果及寄存器状态,若TF=0,则机器处在连续工作方式。此标志为调试机器或调试程序发现故障而设置
D:放向标志 用于字符串操作指令程序设计 置0,则串操作控制处理方向,从带有最低地址的第一个元素逐个处理,否则,从高向低
I:中断允许标志 IF=1,CPU允许中断,IF=0,则CPU关闭中断
【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 ?
这次教程,讲解ESP,我在做课件的时间,惊奇的发现!我好像发掘出了一直变形的ESP定律的用法。
一.什么是ESP
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
二. 例说ESP与OD的对比
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
三. 正式开讲ESP定律
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
四. ESP定律的运行栗子
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
五. 堆栈平衡讲解
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
六.ESP定律的变形用法
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
ESP定律变形用法的视频讲解:链接:http://pan.baidu.com/s/1bnobajH 密码:6xtp
感谢大家对前2篇教学贴的支持,你们的支持是我最大的动力。
文中有什么不对的地方,喜欢大家可以指出来。
这篇写完,后面的更新会慢一些了,一定要保证质量。
我有想出视频教学的想法,不知道有没有人支持~
【新手教程四】小Z带你学习什么是两次内存镜像法和什么是内存断点 ?
前几天看到,有朋友在问两次内存镜像法的原理,为什么有时候是三次内存访问断点。
搜索了各个破解论坛,通过自己的理解写了这篇新手教程。
<ignore_js_op>
一.内存断点是什么?
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
二.两次内存镜像法是什么一个原理?
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
如果图文不好,回帖提出。如果要求的人多,会补上部分的视频讲解。
感谢大家对前3篇教学贴的支持,你们的支持是我最大的动力。
文中有什么不对的地方,喜欢大家可以指出来。有什么建议,请回帖提出。后面的更新会比较慢,因为后面的知识需要充电很久,自己才能理解。大大们,帮我看看有哪些不对的地方: