逆向工程试验报告

逆向工程这门课也已经上完了,作为考查课需要交一份实验报告,这里我学习(抄袭)了我是用户大佬的破解实战-第一战,由于大佬水平高深,步骤间跳跃很大,我这里把大佬的意思加上自己的理解写成实验报告,仅供小白参考。

出处:https://www.52pojie.cn/thread-197281-1-1.html

注:中间有几处坑,表示自己掉进去的地方,如果想一次性实现,可以看完再练习。

开始吧!

 

超级U盘锁的逆向分析 

超级U盘锁是一款功能强大的锁定系统U盘使用软件,限制他人使用U盘或其它移动存储设备从你的电脑复制或盗取重要资料。另外新版增加锁定光驱和锁定网络功能,防止更多方式盗走你的数据。软件提供密码设置,可以自由设置解除和锁定限制的功能。锁定U盘后,插上任意U盘或移动存储设备到计算机是没有任何反应的,需要解锁后才能正常使用U盘设备。

它全面支持Win 2000/XP/2003/Win7/Win8 32/64位。但其试用版不能添加密码,需要购买了才能设置密码。

超级U盘锁下载地址:http://www.onlinedown.net/soft/52481.htm

2.2 逆向过程及分析

2.2.1安装逆向相关工具

下载并安装逆向相关工具,本人使用的工具如下:

VMware虚拟机,WIN7操作系统,PEiD查壳工具以及OD。

2.2.2 脱壳

首先将超级U盘锁软件下载安装到虚拟机中,并使用PEiD查看该软件,如图2-1所示,显示该程序加的是ASpack压缩加密壳。

 

 

 

图2-1 查壳

然后使用OD手动脱壳,我采用的是单步跟踪法,即向上的跳转不能让他实现,向下的跳转让他实现。

把超级U盘锁(Ulock)软件载入OD,会出现如图2-2所示的入口点警告,这就是因为软件加壳,因而无法直接找到程序入口点。

这里不管他,我们点击确认,然后进行单步跟踪法,按F8或者菜单栏的单步步过。期间在汇编的一个CALL命令后步过,软件就直接运行了。这里我们称为软件跑飞(图2-3)了,即没有找到OEP就直接运行了软件。

 

 

图2-3 软件跑飞

所以我们需要重新再次跑程序,不能步过(F8)这个函数,而应该步入F7这个函数继续去找OEP。

在遇到如图2-4示的需要往回跳转时候,按照单步跟踪法,我们点击下一行即005C205F 然后按F4(运行到选定位置)执行到这一行。

 

 

图2-4 单步跟踪法

按照这种方法,我们很快就找到了有RETN的地方,这里也就会进入OEP了,如图2-5边寄存器也显示模块入口点了

 

 

图2-5 程序OEP进入点

我们继续跟踪步入,会进入图2-6所示的地方,这里没有任何的反汇编,只需要右键分析即可显示OEP了(图2-7)。

 

 

图2-6 未分析的OEP

 

 

图2-7分析后的OEP

这时,我们就可以使用插件中的OD脱壳模块来脱壳了(图2-8)。

 

 

图2-8 OD自带脱壳来脱壳

我们随机保存为ssozh.exe文件,然后打开发现无法运行该程序(图2-9),百度发现这是因为ASLR基地址随机化的原因,这样脱壳dump插件获取的地址不对,而ASLR是在WIN7/8或以上系统才有,因而,我改换成了XP的系统重新脱壳。

 

 

图 2-9 程序错误

 

 

图 2-10 编程语言E language

 

2.2.3去自校验

二次脱壳我采用了ESP定律法进行手动脱壳,这里不再赘述,很成功,发现是用E language写的(图2-10)。

打开脱壳后的软件(名字叫123),这时候直接运行OD是看不出来程序有自校验了。因为这个程序不能同时开两个,在电脑去壳期间已经运行着一个程序,而去壳后用OD再次载入,他并没有再次打开该程序而是OD自己结束了,没有运行起来。这时候会把之前运行的误认为是当前OD调试的。因而无法出现如下的自校验窗口,你需要先把软件强制关闭,再次打开。

你会发现这个软件很难关闭,因此需要使用上面推荐的PChunter强制关闭,再次打开OD调试就会发现程序有自效验(图2-11)。

 

 

图 2-11 自校验

 

OD打开123.exe(代码2-1)

00401000 >/$  E8 06000000   call 123.0040100B

00401005  |.  50 push eax                                   ; \ExitCode = 0x0

00401006  \.  E8 BB010000 call <jmp.&kernel32.ExitProcess> ; \ExitProcess

0040100B   $  55           push ebp

0040100C   .  8BEC         mov ebp,esp

0040100E   .  81C4 F0FEFFFF add esp,-0x110

00401014   .  E9 83000000   jmp 123.0040109C

00401019   .  6B 72 6E 6C 6>ascii "krnln.fnr",0

00401023   .  20 20 20 20 2>ascii "         ",0

0040102D   .  47 65 74 4E 6>ascii "GetNewSock",0

00401038   .  20 20 20 20 2>ascii "                "

00401048   .  20 20 20 20 2>ascii "         ",0

00401052   .  20 20 20 20 0>ascii "    ",0

00401057   .  c8 b1c9 d9    enter 0xc9b1,0xd9

0040105B   .  c8 edbc fe    enter 0xbced,0xfe

0040105F   .  BA CBD0C4D6   mov edx,0xD6C4D0CB

00401064   .  A7            cmps dword ptr ds:[esi],dword ptr es:[ed>

00401065   .  B3 D6         mov bl,0xD6

00401067   .  BF E22CC7EB   mov edi,0xEBC72CE2

0040106C   .  D6            salc

0040106D   .  D8D0          fcom st

代码2-1

 

命令行对window下的MessageBoxA 下断点,即 BP MessageBoxA。然后进行堆栈回溯(图2-12)。图中右边是堆栈区,显示了图2-11中“程序已经被破坏”的位置,因为操作系统是小端模式,为了寻找代码段所在的位置,应该向之前的高地址寻找到第一次出现“程序已经被破坏”字符前面对应的代码段堆栈地址(代码2)找到堆栈地址0012FBD0进行反汇编窗口跟随(按回车)。图2-13所示即反汇编窗口跟随的用户代码领空,上一句CALL调用函数应该就是自校验,我们需要跳过这个自校验,即继续向上找找到可以跳过的JMP之类的语句。最后在005AECD9地址把反汇编语句jle 123.005AED5B改成JMP 123.005AED5B即可。

 

 

 

图 2-12 下断,堆栈回溯

 

0012FBD0 005AED3E  返回到 123.005AED3E 来自 123.005B2D86;第一句出现堆栈回溯的用户领空

0012FBD4 00000003

0012FBD8 00166868  ASCII "程序已经被破坏!"

0012FBDC 00000000

0012FBEC 80000301

0012FBF0 00403452  123.00403452

0012FBF4 00000000

0012FC00 0017A9FC

0012FC04 100E7A1C  krnln.100E7A1C

0012FC08 100E5948  krnln.100E5948

0012FC0C 0012FC50

0012FC10 001C5400 ASCII "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((("

0012FC14   00166868  ASCII "程序已经被破坏!";\第一句关键字符串

0012FC18   00464100  ASCII "B3CCD0F2D2D1BEADB1BBC6C6BBB521"

代码2-2

 

 

 

图2-14 反汇编窗口跟随

 

       双击右下角图标,,弹出程序被损坏(图2-15)

 

 

图2-15程序被破坏

 

BP ExitProcess,堆栈回溯,定位程序退出为005B0B27处,向上找出关键跳转为005B0A76 改为JMP。完成去自校验(如图2-16)

 

 

 

图2-16

2.2.4 爆破

如图2-16试用版不能保存密码,点击密码修改按钮,弹出提示,试用版不能保存密码。为了保存多个情况下的软件去自校验后的名字为ssozh.exe。

前面我们查壳的时候已经知道这款软件是用易语言写的,我们采用二进制字符串查找法,查找易语言的按钮事件(特征码 )FF55FC,然后找到关键代码即可实现注册。

具体过程如下:

       第一步,直接在反汇编窗口的00401000处搜索特征码FF55FC,发现找不到,说明这个软件不是静态编译,而是动态编译的,因此我们需要到易语言下的运行库(krnln.fnr,注一般来说运行库(动态库)是dll格式的,易语言的运行库后缀不太一样)里面查找特征码。

       第二步,因此我们先在OD中运行程序,打开模块窗口(Alt+E)或者点击上面的e按钮,找到krnln.fnr并回车,在CPU中查看代码(如图2-17)。并再次在CPU反汇编窗口查找二进制字符串FF55FC,找到相关代码段(代码2-3),第一行二进制代码就是\FF55FC,在这里设置断点。

 

 

 

图2-17 在模块中找到易语言的运行库

10028B46  |> \FF55 FC call [local.1] ;  krnln.100E5948

10028B49  |.  5F pop edi ;  user32.77D191BE

10028B4A  |.  5E pop esi ;  user32.77D191BE

10028B4B  |.  895D F4 mov [local.3],ebx

10028B4E  |.  8945 F8 mov [local.2],eax

10028B51  |.  8B55 E8 mov edx,[local.6]

10028B54  |.  C782 0C020000>mov dword ptr ds:[edx+0x20C],0x0

10028B5E  |.  837D F4 00 cmp [local.3],0x0

代码2-3

第三步,点击设置密码按钮,此时程序会运行到断点处停止,这里F7步入CALL,即找到关键代码处(代码2-4),代码2-4中005AE463地址显然这两行是一个if-else语句,在动态调试中表明会直接跳转到代码2-4最后一行005AE4AA,显然是无法设置密码,因此我们可以猜测,比较一定是关于是否注册的比较,而紧接着if成立就是已经注册的程序,不成立则是试用版。

如果想要实现设置密码,则可以直接对005AE463填充成nop。

005AE453    55              push ebp

005AE454    8BEC           mov ebp,esp

005AE456    81EC 08000000   sub esp,0x8

005AE45C    833D F40CB600 0>cmp dword ptr ds:[0xB60CF4],0x0

005AE463    0F84 41000000   je ssozh.005AE4AA

005AE469    68 02000080     push 0x80000002

005AE46E    6A 00           push 0x0

005AE470    68 01000000     push 0x1

005AE475    68 01000100     push 0x10001

005AE47A    68 00000106     push 0x6010000

005AE47F    68 01000152     push 0x52010001

005AE484    68 01000100     push 0x10001

005AE489    68 CB000106     push 0x60100CB

005AE48E    68 CC000152     push 0x520100CC

005AE493    68 03000000     push 0x3

005AE498    BB 20030000     mov ebx,0x320

005AE49D    E8 E4480000     call ssozh.005B2D86     ; 弹出密码窗口

005AE4A2    83C4 28         add esp,0x28

005AE4A5    E9 90000000     jmp ssozh.005AE53A

005AE4AA    68 02000080     push 0x80000002

 

代码2-4

 

重新运行程序,定位[0xB60674],下断硬件断点,重启程序,因为一开始内存中没有0xB60674这个地址使用,因此在多次执行到代码段005xxxxxx的时候找到这段代码在代码2-5的第三句。显然这段代码表示未注册的意思,我们向上找到跳转到这里的语句(第一句),我们把第一句nop掉,或把005AD381 代码处的0x0改为0x1,即可表示已经注册。

005AD31D   /0F84 5E000000   je ssozh1.005AD381

005AD323    C705 F40CB600 0>mov dword ptr ds:[0xB60CF4],0x1

//关于注册的相关语句

005AD381    C705 F40CB600 0>mov dword ptr ds:[0xB60CF4],0x0

 

第三章 实验总结

3.1 实验结果总结

成功爆破后可以使用密码了。

 

 

3-1 设置密码

3.2 实验心得

写实验报告,自己实践是提升自我解决问题能力以及快速掌握一些知识点的良好途径,作为一名跨专业的学生,在本课程中学会了很多,感谢何老师的引领入门,感谢同学们的帮助,感谢网络上的各位网友的指导。

 

转载于:https://www.cnblogs.com/SsoZhNO-1/p/9983769.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逆向工程实验报告全文共9页,当前为第1页。逆向工程实验报告全文共9页,当前为第1页。 逆向工程实验报告全文共9页,当前为第1页。 逆向工程实验报告全文共9页,当前为第1页。 课程题目:利用OllyDbg逆向工具学习高级语言的输入输出与底层的对应关系 逆向工程实验报告全文共9页,当前为第2页。逆向工程实验报告全文共9页,当前为第2页。实验背景 逆向工程实验报告全文共9页,当前为第2页。 逆向工程实验报告全文共9页,当前为第2页。 软件逆向工程是在1990年发展起来的,现在已经有一些会议和计算机用户组的专题会议主题。软件逆向工程是分析目标系统,认定系统的组件及其交互关系,并且通过高层抽象或其他的形式来展现目标系统的过程。逆向工程 是了解软件"所作所为"的一套最重要的技术和工具。正式地讲,逆向工程是"通过分析目标系统以识别系统的组件以及这些组件之间的相互关系并创建该系统另一种形式的表或更高级的抽象过程"。从工程实际的角度来看,大体上可以将软件逆向工程分为两大类:(1)从已知软件系统的完整代码出发,生成对应系统的 结构以及相关设计原理和算法思想的文档。(2)从没有源代码的程序出发,生成对应的源程序、系统结构以及相关设计原理和算法思想的文档等。逆向工程在软件分析中的作用主要分为以下六个部分:(1)查找恶意代码,许多病毒和恶意代码 的 探测技术使用逆向工程来理解那些令人憎恶的代码是怎样构成和运作的。通过逆向找出可用作特征码 的可识别模式用于驱动商业探测器和代码扫描器。(2)发现意想不到的缺陷和错误,即使是设计最完美的系统也可能存在漏洞,这是由于我们使用的"前向工程"开发技术所固有的特点导致的。逆向工程可以帮助我们在发生致命的软件失效前识别缺陷和错误。(3)查找是否使用了其他人所写的代码,搞清楚在应用程序的哪里使用了受保护的代码和技术,这对于保护知识产权不被滥用是很重要的。逆向工程技术可用于检测应用程序是否包含所关心的软件单元。(4)寻找对共享软件和开放源码的使用(在不该使用的地方),与侵犯代码版权相反的是,如果一个产品以 安全 和 专用 为目的,是否有可公开获取的代码可能是大家关心的问题。逆向工程能够用于检测代码复制问题。(5)从其他(不同领域或用途)产品中学习,逆向工程技术使我们能够学习先进的软件方法,还允许新学员研究大师的作品。这对于学习和积累不断发展的代码知识来说是非常有用的。许多网站是通过参考其他网站的做法来建立的。许多网页开发人员是通过阅读其他网站的源代码学习HTML和网页编程技术的。(6)发现原开发人员以前没有意思到的特性或机遇,(6)发现原开发人员以前没有意思到的特性或机遇 逆向工程实验报告全文共9页,当前为第3页。逆向工程实验报告全文共9页,当前为第3页。 逆向工程实验报告全文共9页,当前为第3页。 逆向工程实验报告全文共9页,当前为第3页。 实验环境介绍 Windows平台、OLLYDBG逆向软件、测试程序、c-free5.0。 实验工具介绍 在现代操作系统中,可以将调试器粗略地分为两种不同的风格:用户模式调试器 和 内核模式调试器。用户模式调试器是一种普通的应用程序,它将自己加在另一个进程(即被调试程序)之上,并可以完全控制该进程。本实验使用的用户模式调试器是OLLYDBG,对于逆向工作人员而言,由Oleh Yuschuk编写的OLLYDBG可能是最佳的用户模式调试器(尽管选择的余地非常小)。OLLYDBG的诱人之处在于:它一开始就是作为逆向工具而设计的,因此它具有强大的内置的反汇编器。OLLYDBG的代码分析器可以识别出循环、switch控制块以及其它主要的代码结构。它能显示所有已知函数和API的参数名,支持在代码和数据之间查找交叉引用——代码到数据或数据到代码。OLLYDBG是调试器中(除了IDA Pro调试器)反汇编能力最强的一款,连内核模式都比不上。除了具有强大的反汇编能力外,OLLYDBG还提供了大量不同的视图,包括列出模块中的导入和导出、显示被调试者拥有的窗口和其它对象的列表、显示当前的异常句柄链以及对那些在库中正确命名的函数使用导入库(.lib文件)等等。OLLYDBG的典型界面如图3.1。 逆向工程实验报告全文共9页,当前为第4页。逆向工程实验报告全文共9页,当前为第4页。 逆向工程实验报告全文共9页,当前为第4页。 逆向工程实验报告全文共9页,当前为第4页。 图3.1 OLLYDBG的典型界面 相应知识点介绍 通过测试键盘中的输入,屏幕的屏幕输出学习VC/VS 中的各种常用的输入与输出函数在底层是如何实现的;然后破解"lianxi.exe"这个小程序。输入方式很多并且高级语言也有很多种。C语言 输入函数有很多,常用的输入函数有:Scanf,getchar,getch 和 getche。如语法:sca
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值