1.PHP: Hypertext Preprocessor
面向对象:
- 有一定语言学习基础,最好是面向对象语言
- 对后端有一定的兴趣
学习准备:
- 开发环境:XAMPP
- 编译器:sublime text3
基础知识:
- PHP介绍:PHP官网 PHP中文网
- 计算机语言类型:编译型和解释型的区别
目标:
- 了解PHP的特性,确立对PHP的兴趣
- 能编写一个简单的PHP脚本
学习资源:
- 书籍:细说PHP
- 教程:W3school
开始:
php中的hello world
<?php
echo "hello world";
?>
什么是PHP?
- 中文名:超文本预处理器,是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。
为什么PHP现在这么火?
- 开源 免费性 快捷性 上手极快
- 插件丰富,网上的解决方案有很多,而且还有庞大的开源社区可以提供帮助
- 跨平台性强 效率高
- 面向对象,性能很强 . 配合简单、稳定、容易部署,它能帮你低成本完成事情
安装:
- XAMPP:直接点下一步就行,路径不要有中文和符号。安装完成后,xampp文件夹下的htdocs即为localhost本地服务器。
- 注意:安装完成后,打开Apche和Mysql两个服务器,若提示Mysql打不开,很有可能是先前安装了Vmware虚拟机,占用了Mysql的端口,请自行百度然后解决。
开始你的学习:
- 熟悉基本的语法
- 现场练手
2.软件破解入门
面向对象:
- 了解汇编语言
- 对软件破解有一定的兴趣
学习准备:
- ollydbg:已上传到群文件,请提前下载
试卷
- 考生姓名:____
- 考生学号:____
一、诗歌补写
- 床前没月光,_。
- 春眠不觉晓,_。
二、数学运算(在括号内填入数字)
- 3 500 +400 * 3 / 2 + 1 = ( )
- 4 ( 1 + 2) / 3 * 400 +500 = ( )
基础知识:
什么是壳?
- 在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
什么是加壳?
-
其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。现在的CPU都很快,所以这个解压过程你看不出什么东东。软件一下子就打开了,只有你机器配置非常差,才会感觉到不加壳和加壳后的软件运行速度的差别。当你加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当你执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。所以,这些的工作只是在内存中运行的,是不可以了解具体是怎么样在内存中运行的。通常说的对外壳加密,都是指很多网上免费或者非免费的软件,被一些专门的加壳程序加壳,基本上是对程序的压缩或者不压缩。因为有的时候程序会过大,需要压缩。但是大部分的程序是因为防止反跟踪,防止程序被人跟踪调试,防止算法程序不想被别人静态分析。加密代码和数据,保护你的程序数据的完整性。不被修改或者窥视你程序的内幕。
什么是脱壳?
- 完全破除压缩后软件无法编辑的限制,去掉头部的解压缩指令,然后解压出加壳前的完整软件。
目标:
- 通过简单的介绍,了解软件破解的大致过程,了解破解的常用指令,并且在现场自己完成一个小程序的破解。
学习资源:
- 论坛:吾爱破解
开始:
首先,先来了解一下我们的工具OllyDBG:
- 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。
- 寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。
- 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
- 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。
- 堆栈窗口:显示当前线程的堆栈。
其次,我们还需要了解一点破解的常用命令
cmp a,b // 比较a与b
mov a,b // 把b值送给a值,使a=b
ret // 返回主程序
nop // 无作用,英文(no operation)简写,意思“do nothing”(机器码90)
call // 调用子程序,子程序以ret结尾
je或jz // 相等则跳(机器码是74或84)
jne或jnz // 不相等则跳(机器码是75或85)
jmp // 无条件跳(机器码是EB)
jb // 若小于则跳
ja // 若大于则跳
jg // 若大于则跳
jge // 若大于等于则跳
jl // 若小于则跳
pop xxx // xxx出栈
push xxx // xxx压栈
好了,这些已经够了,开始破解吧!
破解开始:
- 首先用OllyDbg打开我们的Acid burn.exe程序
- -
- 然后,我们随便输入一下数字,会出现
- 此时不要点击确定按钮,返回OD暂停(F12)。然后点击到堆栈窗口
- 这里有两个MessageBox的地址,第一个地址为753FD84A这个地址明显太大,不在模块的领空,不是的。第二个地址为0042A1AE,和下面的Acid_bur地址非常接近,十有八九就是它了。
- 右键显示调用, 在Call上面设置断点(F2)。
此时回到主窗口分析
发现,没有跳转语句,逻辑很简单,在之上几行处就有retn,在头部push ebp下断点,然后按F9运行程序。此时点击确定,然后重新点击Check it baby 按钮,由于设置了断点,程序停止运行。在右下角堆栈处找到最近一条Return语句:
0012F974 0042FB37 返回到 Acid_bur.0042FB37 来自 Acid_bur.0042A170
- 对着这条语句点击右键->反汇编跟随
0042FAD5 |. 68 C8FB4200 push 0042FBC8 ; UNICODE “-”
0042FADA |. FF75 F8 push [local.2]
0042FADD |. 8D45 F4 lea eax,[local.3]
0042FAE0 |. BA 05000000 mov edx,0x5
0042FAE5 |. E8 C23EFDFF call 004039AC
0042FAEA |. 8D55 F0 lea edx,[local.4]
0042FAED |. 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]
0042FAF3 |. E8 60AFFEFF call 0041AA58
0042FAF8 |. 8B55 F0 mov edx,[local.4]
0042FAFB |. 8B45 F4 mov eax,[local.3]
0042FAFE |. E8 F93EFDFF call 004039FC
0042FB03 75 1A jnz short 0042FB1F ; // 这个JNZ条件判断很关键?
0042FB05 |. 6A 00 push 0x0
0042FB07 |. B9 CCFB4200 mov ecx,0042FBCC
0042FB0C |. BA D8FB4200 mov edx,0042FBD8
0042FB11 |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042FB16 |. 8B00 mov eax,dword ptr ds:[eax]
0042FB18 |. E8 53A6FFFF call 0042A170
0042FB1D |. EB 18 jmp short 0042FB37 ; // 这个跳转是不是很可疑?
0042FB1F |> 6A 00 push 0x0
0042FB21 |. B9 74FB4200 mov ecx,0042FB74 ; ASCII 54,”ry Again!”
0042FB26 |. BA 80FB4200 mov edx,0042FB80 ; ASCII 53,”orry , The serial is incorect !”
0042FB2B |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042FB30 |. 8B00 mov eax,dword ptr ds:[eax]
0042FB32 |. E8 39A6FFFF call 0042A170 ; 这个CALL是导致跳转的语句
0042FB37 |> 33C0 xor eax,eax ; 返回到了这里
我们大概浏览下代码,最近部分有两个可疑跳转JNZ 和JMP, JNZ会通过它上面的call 004039FC 判断我们的伪码是否正确,判断的结果存在EAX中,如果EAX不等于就跳转到错误提示信息框那里。我们的目的是无论伪码是否正确都通过验证,所以最简单的办法就是将jnz这句使用NOP填充,我们尝试一下:选择JNZ这句,右键二进制->用NOP填充。回到原始程序,取消断点,再次点击Check it baby!