红队专题-REVERSE汇编/二进制PWN/逆向/反编译

红队专题

在这里插入图片描述

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

反汇编高级-恶意代码分析

IDA Pro

IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集其中
包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

在这里插入图片描述
分析 exe文件

Q1.程序初始化请求的URL是什么?

Q2. User-Agent 域是如何产生的?
在这里插入图片描述

Q3.初始化请求时,程序在内存页中查找什么?

Q4.程序如何处理它从页中提取的信息?


在这里插入图片描述

首先IDA载入分析,从头到尾稍微看下main
在0040115a遇到了第一个对抗反汇编技术
在这里插入图片描述

因为esp值是非0的,所以test指令返回结果一定是非零值
在这里插入图片描述

那么下面的jnz指令的跳转是永远成立的

其跳转的目的是40015e+1

也就是jmp指令中间的位置,这是有问题的,
而且IDA将跳转的位置标记为红色,也能说明这里是不正常的

将光标定位40115e,按d键,将这个指令变为数据
在这里插入图片描述
在这里插入图片描述

然后光标定位到40115f,按c键转为代码
在这里插入图片描述
在这里插入图片描述

这样就正常了。

继续往下,在4011d0看到了对抗反汇编的技术
在这里插入图片描述

这里通过xor给eax赋0,下面的jz指令跳转是永远成立的
在这里插入图片描述

jz的目的第4011d4处的call目的地址同样是红色的,说明也是不正常的

光标定位到4011d4,按d键转数据
在这里插入图片描述
在这里插入图片描述

然后定位到4011d5,按c键转代码
在这里插入图片描述
在这里插入图片描述

之后都是同样的处理,结果如下
在这里插入图片描述

继续往下,在401215处也存在对抗反汇编的技术
在这里插入图片描述

可以option->general如下设置,用于显示出机器码
在这里插入图片描述

如下所示
在这里插入图片描述

这是一个双字节的jmp指令。跳转目标是它的第二个字节
在这里插入图片描述

按d键转为数据
在这里插入图片描述
在这里插入图片描述

光标定位到00401216,按c键转为代码
在这里插入图片描述

继续往下,在401269处存在对抗反汇编技术
在这里插入图片描述

这里的jz和jnz指令都是跳转到同一个地址,说明命中目标代码不取决于零标志位的置位与否

将光标定位到跳转的目标,也就是0040126d,按d键转为数据
在这里插入图片描述
在这里插入图片描述

光标定位0040126e,按c键,转为代码
在这里插入图片描述

继续往下,在4012e6位置存在对抗反汇编技术
在这里插入图片描述

这里的jz跳转的目的地是4012e8,是向上跳转,跳到mov指令中间的位置。
这不是正常的跳转,而且和我们之前看到的向下跳转也是不同的

光标定位到4012ee,按d键转为数据
在这里插入图片描述
在这里插入图片描述

定位到4012ef,按c键转为代码
在这里插入图片描述

定位到4012e6,按d键转为数据
在这里插入图片描述
在这里插入图片描述

定位到4012e8按c键转为代码
在这里插入图片描述
在这里插入图片描述

至此,main函数中所有对抗反汇编的地方都被我们调整回来了。

不过可以看到,还存在一些多余的db字节,
在这里插入图片描述

我们需要将其转换为nop指令(0x90),这样才能构造出一个函数

替换nop,使用脚本就可以自动化进行

脚本内容如下
在这里插入图片描述

 #include<idc.idc>
static main()
{
   
    auto ea = ScreenEA();
    PatchByte(ea,0x90);
}

注意文件后缀名为idc

来测试一下,定位到0040115e,这里有多余的db字节
在这里插入图片描述

然后file->script file
在这里插入图片描述

选中test.idc,点击打开即可

此时已经被修改为90h了
在这里插入图片描述

其他地方也是同样如此
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样就全部修改完毕了,接着选中全部main函数

从00401000到0040130e

然后按p键,再按空格键,就可以图形化地查看生成的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在InternetOpenUrlA前调用了sub_401386,跟入
在这里插入图片描述
在这里插入图片描述

可以看到是在将字符拷贝到栈空间里
在这里插入图片描述

可以将这些16进制通过按r键进行转换为字符
在这里插入图片描述

在这里插入图片描述

可以看到往栈上拷贝的字符组成的字符串其实是一个网址

http://practicalmalwareanalysis.com/bamboo.html

Q1.程序初始化请求的URL是什么?

A1.程序第一个请求的URL是http://www.practicalmalwareanalysis.com/bamboo.html。




返回上层函数

我们就知道了InternetOpenUrlA就是尝试访问这个网站

为了知道user-agent,我们来分析InternetOpenA
在这里插入图片描述

其第一个参数lpszAgent其实就是user-agent

其值edx来自name,往上回溯
在这里插入图片描述

可以看到是gethostname的返回值保存在name中。

所以我们可以认为user-agent的字符串就是主机名

我们f5查看伪码继续分析
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

将case里的数字转为字符,更直观一点
在这里插入图片描述

可以看到是一个for循环。
for循环的作用就是将name字符串中的每个字符进行修改:
如果是Z则修改为A,如果是z则修改为a,
如果是9则修改为0,如果不是这三种情况,
则自增,检查下一个

Q2. User-Agent 域是如何产生的?

A2. User-Agent 字符串由hostname中
每个字母和数字加1组成(Z和9对应的是A和0)。




程序使用InternetOpen初始化,然后使用InternetOpenUrlA打开一个网址
在这里插入图片描述

然后是InternetReadFile将数据下载到一个本地缓冲区
在这里插入图片描述

缓冲区包含的数据是第二个参数,上图中已经被IDA标记为Buffer

在004011DA又出现了Buffer
在这里插入图片描述

上图中调用了strstr查找一个大字符串中的子串,
在这里插入图片描述

这里就是在缓冲区Buffer中查找字符串Bamboo::,
Buffer里包含从原始的url中提取的所有数据。
在这里插入图片描述

如果查找成功,则eax会保存该子串在Buffer里首次出现的位置,
通过mov指令赋给了Str
在这里插入图片描述

Q3.初始化请求时,程序在内存页中查找什么?

A3.程序在它请求的网页中查找字符串Bamboo::。
在这里插入图片描述

上图又是调用了strstr,用来搜索::,如果找到了,
在这里插入图片描述

则将地址保存在eax里,而00401212又将0赋给了eax

其实也就是说将::的第一个:赋0,或者说赋NULL,
用于终止Bamboo::和::之间的字符串

0040123e,ecx+8,其实就是Str+8,而Bambo:长度就是8,
在这里插入图片描述

那么这里的作用就是让指针跳过Bambo:,指向后面的内容

在这里插入图片描述

之后是调用InternetOpenUrlA,其第二个参数就是要打开的url
在这里插入图片描述

所以我们就知道了,Bamboo::和尾部冒号之间的数据的目的,
就是程序要下载的一个网址

在这里插入图片描述

调用InternetReadFile将文件保存在文件里
在这里插入图片描述
在这里插入图片描述

文件名称保存在ecx,而ecx来自于Filename,往上回溯
在这里插入图片描述

Filename来自eax,而eax是sub_40130f的返回值
在这里插入图片描述

跟入该函数
在这里插入图片描述

同样有拷贝字符的操作,按r键转换
在这里插入图片描述

这里合在一起就是AccountSummary.xls.exe

这就是文件名称,我们通过InterReadFile下载的文件就是保存在这里

回到上层函数,继续往下分析
在这里插入图片描述

调用ShellExecute函数启动文件
在这里插入图片描述

之后程序就退出了。
在这里插入图片描述

Q4.程序如何处理它从页中提取的信息?

A4. 除了搜索字符串Bamboo外,
程序还查找一个额外的::,它被转换为一个NULL结束符。
Bamboo与结束符之间的字符串被下载到一个名为AccountSummary.xls.exe的文件中,
下载完后, 程序运行它



配套学习资源
1.《恶意代码分析实战》

恶意代码分析实战——反汇编

了解、学习恶意代码对抗反汇编的技术。
识别恶意代码采用的反汇编技术,并针对性地进行破解,
结合ollydbg进行分析;
在此过程中我们还会使用idc脚本辅助我们的分析;
此外,我们还将学习如何破解程序的加密原理。




恶意代码分析实战

本科/专科信息安全专业

计算机网络、操作系统




1.IDA pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。

它支持数十种CPU指令集其中包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

2.OllyDbg
一个反汇编工具,
又叫OllyDebug,一个新的动态追踪工具,

将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,
己代替SoftICE成为当今最为流行的调试解密工具了。

同时还支持插件扩展功能,是目前最强大的调试工具。




服务器:Windows 7

辅助工具:IDA pro,Ollydbg




本次实验我们将会分析 exe文件。先来看看要求解答的问题

Q1.恶意代码怎样被初始化调用?

Q2.恶意代码都做了什么?

Q3.恶意代码使用了什么URL?

Q4.恶意代码使用了什么文件名?




首先使用IDA分析

查看imports窗口
在这里插入图片描述

看到了可疑函数URLDownloadToFile,WinExec
在这里插入图片描述

再通读一下main
在这里插入图片描述
在这里插入图片描述

调用上图的函数给当前进程创建快照
在这里插入图片描述

而后是一个循环结构
在这里插入图片描述

里面调用了ProcessFirst

在这里插入图片描述

对应地,在循环的下面调用了Process32Next

其组合使用可以用于列举当前进程

如果真是这样的话,我们发现的那些导入函数就没有意义了。

我们回到main开始处
在这里插入图片描述

前两条指令将40000h和0x148c进行 或操作,
结果为0x0040148c,将其保存在eax

之后该值赋给ebp+4
在这里插入图片描述

打开od,直接跳到40100c
在这里插入图片描述
在这里插入图片描述

然后下断点,执行过来
在这里插入图片描述

在这里插入图片描述

接着单步执行到401016
在这里插入图片描述

此时ebp值如上所示,我们在堆栈窗口中跟随
在这里插入图片描述

ebp+4是0012ff50

可以看到是指向main函数的返回地址

那么我们就清楚了,
这三条指令的作用就是将main函数返回地址覆盖成0040148c,
这样就可以执行0040148c后的指令了

Q1.恶意代码怎样被初始化调用?

A1.通过覆盖main函数的返回地址,初始化调用恶意代码。




回到IDA直接跳到0040148c
在这里插入图片描述

如下所示
在这里插入图片描述

可以看到是一段孤立的代码,IDA没能将其识别为函数的一部分

option->general显示机器码,方便分析
在这里插入图片描述

注意到00401494处存在对抗反汇编的技术
在这里插入图片描述

其上一条的指令给eax赋0,使用jz会一直成立。
跳到401496+1,即401497,

也就是5字节jmp指令的第二个字节,这是不正常的

光标定位到00401496,按d键转为数据
定位到00401497,按c键转为代码
在这里插入图片描述

正确反汇编后的结果如上
继续分析

在这里插入图片描述

在004014b3看到了printf,用于打印上面的字符串,
不过这是永远也不会执行的
在这里插入图片描述

因为在其之前,可以看到创建了一个异常处理例程。xor指令会给ecx赋0,而div则会将ecx做除数,从而引发除零异常。此时就会跳到4014c0
在这里插入图片描述

而我们看到IDA没有将此处的数据识别为代码,而是将其作为DWORD进行表示。

光标定位到004014c0,按c键转为代码
在这里插入图片描述

继续往下分析
在这里插入图片描述

004014c0到004014d7用于从链中摘除异常处理例程,
并从栈中删除了记录。
在这里插入图片描述

004014d7存在对抗反汇编技术,IDA将其目的地址也标记为红色

光标定位到004014d7,按d键
在这里插入图片描述

光标定位到004014d8,按c键转为代码

在这里插入图片描述

接着继续分析
在这里插入图片描述

这里调用了URLDownloadToFile
在这里插入图片描述

其第二个、第三个参数分别为url,文件名

而对应在上图,则是unk_403010,unk_403040

跟入任一个可以看到
在这里插入图片描述

这些数据不是以ascii文本显示的

004014eb,004014f8
两处调用sub_401534时
注意到传入的就是unk_403010,unk_403040

所以我们推测,sub_401534是解密函数
在这里插入图片描述

跟入该函数
在这里插入图片描述

这里一个循环结构,最重要的就是箭头所指的xor语句,
将缓冲区中的每个字符与0ffh异或从而修改他们

知道了解密的原理,我们就可以编写一个脚本帮助我们解密内容了
在这里插入图片描述

file->script file,选择该脚本,解密后如下所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

两个字符串分别为http://www.practicalmalwareanalysis.com/tt.html和spoolsrv.exe

Q3.恶意代码使用了什么URL?

A3.恶意代码使用的URL是http://www.practicalmalwareanalysis.com/tt. html。

Q4.恶意代码使用了什么文件名?

A4.恶意代码使用的文件名是spoolsrv.exe。




继续往下分析

00401519处还是同样的处理
在这里插入图片描述

正确的反汇编结果如上所示
在这里插入图片描述

调用了WinExec,运行的程序是unk_403040,也就是spoolsrv.exe

之后就是调用ExitProcess终止自身。

Q2.恶意代码都做了什么?

A2.恶意代码从一个URL下载文件,并且用WinExec启动它。




配套学习资源
1.《恶意代码分析实战》

IL指令

.NET包含多种语言

反汇编得到IL指令



IL 指令速查

IL语言,可理解为.NET的汇编,无论你使用的是C#还是VB.NET或者F#开发功能,都可以将其反编译成IL代码。

使用ildasm.exe工具反编译,可以看到IL代码和汇编差不多,可能是常用.NET吧,感觉比汇编简单好多。

IL指令转.NET操作码
如同VC反汇编提取机器码一样,我们将对应16进制复制出来,然后再对比指令速查表提取关键操作码

基础定义

ROP 链条

ROP(Return-Oriented Programming)链
是一种计算机安全领域中的攻击技术,用于绕过内存执行保护措施,实现利用漏洞进行代码注入和控制流劫持。

由一系列已存在于程序内存中的代码片段(称为gadget)组成的,
这些片段通常是程序的合法指令序列。
通过将这些gadget按照特定的顺序串联起来,攻击者可以构造出一条可执行的ROP链,用于实现特定的攻击目的。




ROP链的基本原理依赖于已存在的代码片段,而不是插入自定义的恶意代码。

这样可以避免执行数据区域中的恶意代码,
绕过诸如堆栈溢出保护 (stack overflow protection)、
执行可执行和不可执行区域交替 (DEP, Data Execution Prevention)等安全机制。

攻击者通过寻找程序中的可用gadget,这些gadget通常是由程序的已编译代码中的某些指令片段组成的。
然后,攻击者构建ROP链,将gadget的地址按照特定的顺序排列在一起,并确定返回地址指向ROP链的起始地址。

当程序执行到返回指令时,执行流将被转移到ROP链上的下一个gadget,从而改变程序的控制流,实现攻击者的目标,
例如执行特定的系统调用、获取敏感数据或执行任意指令等。

ROP链是一种高级的攻击技术,
需要深入了解目标程序的内存布局和机器代码才能构造有效的ROP链。
为了防御ROP攻击,软件开发者需要采取措施,

例如使用
栈保护技术(如Stack Canaries)、
内存随机化(ASLR)以及
执行流完整性保护(如Control Flow Integrity)等来增加攻击的复杂性和成功的概率。


指令: 命令cpu干什么,是由操作码字段和地址码字段(操作数字段)组成

操作码(Opcode): 就是执行某种操作的命令代码

BYTECODE(字节码):与机器代码相同,除了它主要由基于软件的解释器(如Java或CLR)使用

程序集:有两个“程序集” – 一个汇编程序是一系列的助记符和操作数,它们被馈送到“汇编程序”,“汇编程序”将助记符和操作数“汇编成可执行的机器代码”.可选地,“链接器”链接组件并生成可执行文件.

CLR语言:(.NET语言)中的第二个“程序集”是一系列CLR代码,其中注入了元数据信息,可执行代码库,但不能直接执行.


机器码(溢出常用的ShellCode): 就是指令的二进制代码(包括操作码和地址码),功能打开和关闭计算机中的开关的数字序列,以执行某些工作 – 例如增加数字,分支,乘法等等.这是纯机器特有的,由处理器的实现者.

栈迁移(Stack Migration)

一种计算机安全领域中的攻击技术,用于绕过内存执行保护机制,实现控制流劫持。

其原理是利用已存在的代码段(gadget)和堆栈上的数据,
将栈指针(Stack Pointer)重定向到攻击者控制的位置,从而控制程序的执行流程。

栈迁移的过程通常涉及以下步骤:


寻找漏洞:首先,攻击者需要寻找目标程序中的漏洞,如堆栈溢出、格式化字符串漏洞等。这些漏洞可能会导致栈内容被覆盖或修改。

控制栈指针:通过利用漏洞,攻击者可以通过修改目标程序的栈帧(Stack Frame)来控制栈指针的值。
栈指针通常指向下一个将要被执行的指令的地址。

构造栈迁移:攻击者在栈上构建一个新的栈帧,其中包含了指向攻击者精心构造的代码的地址(即ROP链)。
攻击者通过修改栈指针,使其指向这个新的栈帧。
当函数返回时,执行流就会被转移到攻击者的代码上,从而实现攻击目的。

控制流劫持:一旦执行流转移到攻击者的代码上,攻击者可以自由控制程序的执行流程。
这可能包括执行特定的系统调用、获取敏感信息、执行恶意操作等。

栈迁移是一种高级的攻击技术,需要对目标程序的内存布局和机器代码有深入的了解。
为了防御栈迁移攻击,软件开发者可以采取措施如

栈保护(Stack Canaries)、
内存随机化(ASLR)、
代码签名验证等,以增加攻击的困难性和复杂性。

此外,及时修补已知的漏洞和使用安全编程实践也是减少栈迁移攻击风险的重要手段。

寄存器

CPU运行的基本过程,

程序在内存中装载,由 CPU 来运行,
CPU 的主要职责就是用来处理数据,
CPU 不断的通过总线发送请求并进入存储单元,这个过程很繁琐,会占用大量的资源,
有一些内存页也是没有必要的,因此出现了寄存器。


|63..32|31..16|15-8|7-0|

			  |AH.|AL.|

               |AX.....|

       |EAX............|

|RAX...................|


寄存器都说是在向后兼容,
在RAX中EAX依然可以使用,不过指向了RAX的低位,
EAX是AX数据扩展,不可分割两个AX,
RAX同理,

但AX可以分割成AH和AL分别对应高位和地位。

除了 AX、BX、CX、DX 寄存器以外,
其他寄存器均不可以分为两个独立的 8 位寄存器。


寄存器的主要功能, 以8086来进行探讨,
8086是x86的前身,也就是16位处理器,
8086 处理器有 14 个寄存器,
每个寄存器都有一个特有的名称
AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,
但这些寄存器功能只有三种:




1. 通用寄存器

AX,BX,CX,DX

这些寄存器是16位
能存放两个字节(8bit一个字节)
AX、BX、CX、DX 这四个寄存器一般用来
存放数据,所以是数据寄存器。

AX(Accumulator Register) :累加寄存器
主要用于输入/输出和大规模的指令运算。在汇编中最频繁使用

BX(Base Register):基址寄存器,
用来存储基础访问地址,还可以用来寻址,即寻找物理内存地址。
BX 寄存器中存放的数据一般是用来作为偏移地址 使用的

CX(Count Register):计数寄存器,
CX 寄存器在迭代的操作中会循环计数,CX 中的 C 被翻译为 Counting 
也就是计数器的功能。
当在汇编指令中使用循环 LOOP 指令时,
可以通过 CX 来指定需要循环的次数,当CX的值是0时跳出循环

DX(data Register):数据寄存器,
它也用于输入/输出操作。
它还与 AX 寄存器以及 DX 一起使用,
用于涉及大数值的乘法和除法运算。

 19 ,它在 16 位存储器中所存储的表示如下:

在这里插入图片描述

寄存器的存储方式是先存储低位,
如果低位满足不了就存储高位,如果低位能够满足,高位用 0 补全,在其他低位能满足的情况下,其余位也用 0 补全。

段寄存器

段寄存器主要包含

CS(Code Segment) :代码寄存器,程序代码的基础位置

DS(Data Segment): 数据寄存器,变量的基本位置

SS(Stack Segment):栈寄存器,栈的基础位置

ES(Extra Segment):其他寄存器,内存中变量的其他基本位置。

索引寄存器

BP(Base Pointer):基础指针,它是栈寄存器上的偏移量,用来定位栈上变量

SP(Stack Pointer): 栈指针,它是栈寄存器上的偏移量,用来定位栈顶

SI(Source Index): 变址寄存器,用来拷贝源字符串

DI(Destination Index): 目标变址寄存器,用来复制到目标字符串

这两个寄存器通过段寄存器确定基本地址也叫基地址,

索引寄存器就是在基地址的基础上的偏移地址,通过基地址加上偏移地址,CPU就可以找到在内存中的准确位置。

状态和控制寄存器

IP(Instruction Pointer):指令指针寄存器,

它是从 Code Segment 代码寄存器处的偏移来存储执行的下一条指令

FLAG : Flag 寄存器用于存储当前进程的状态,这些状态有

位置 (Direction):用于数据块的传输方向,是向上传输还是向下传输

中断标志位 (Interrupt) :
1 - 允许;0 - 禁止

陷入位 (Trap) :确定每条指令执行完成后,CPU 是否应该停止。
1 - 开启,0 - 关闭

进位 (Carry) : 设置最后一个无符号算术运算是否带有进位

溢出 (Overflow) : 设置最后一个有符号运算是否溢出

符号 (Sign) : 如果最后一次算术运算为负,则设置 
1 =负,0 =正

零位 (Zero) : 如果最后一次算术运算结果为零,
1 = 零

辅助进位 (Aux Carry) :用于第三位到第四位的进位

奇偶校验 (Parity) : 用于奇偶校验

反调试

 反调试技术和如何绕过反调试 


调试无论是在
脱壳
还是PWN
及逆向
中都有着很重要的意义

反调试被程序作者用来保护程序不被调试,以此来保护自己的秘密。
不过逆行分析人员也有自己的破解反调试的方法,就是“反反调试”。

反调试技术

分为以下三类

通过调试的痕迹去识别是否正在被调试、
识别调试器行为、
干扰调试器功能

调试痕迹识别

WindowsAPI

手动检测数据结构

系统痕迹检测



这里最常见得就是手动检测数据结构,
也就是检测PEB
(PEB表存放进程信息)
表BeingDebugged,ProcessHeap,NTGlobalFlag属性,
PEB得地址
32位程序的是fs:[30],FS段寄存器
64位程序的为gs:[60],GS段寄存器
位于用户地址空间,进程环境块PEB的地址对于每个进程来说是固定的。
如果发现程序中出现引用PEB的地址然后出现程序退出的地址比如sub_401000,那大概率是进行了反调试。

在这里插入图片描述

绕过:
fs段寄存器偏移0x30h,
用ctrl+G可以找到PEB。
第一个fs:[30h]+2指向了PEB的BeingDubgged,这是检验反调试的一种技术。
BeingDubgged=1的时候就是被调试,这里是第一处反调试。
然后我们通常会在fs:[30h]+201修改为00或使用插件:
PhantOM,勾选hide from PEB。
[fs:[30h]+18]+10,ProcessHeap也是用来测试反调试的的标志。
fs:30h+68,NtGlobalFlag反调试。
同样是BeingDubgged原理,通过修改调试标志来绕过。

在这里插入图片描述

识别调试器的行为

INT扫描
执行代码校验和检查
时钟监测
判断父进程是否是explorer.exe



这里常用就是时钟监测,
计算时间差值,反调试。
如果时间过长,判断文件当前正在被调试,就删除文件。
我们在OD里找到这个时钟的地方,QueryPerformanceCounter,GetTickCount,

使用nop(汇编代码无操作 空指令)就可以绕过,
其实原理就是破坏他程序监测反调试的功能。
其他几种也是同样的道理,检测都是程序编写,代码控制,我们只要破坏掉就可以了


在这里插入图片描述

干扰调试器的功能

使用TLS回调
使用异常
插入中断

这里最常用的也是TLS回调,因为现在OD的插件越来越牛,新版的OD看不出有什么区别,

最简单的方法,扔到CFF去看一下目录结构,可以很明确的看到TLS目录(全保护)

在这里插入图片描述

打开IDA可以看到调用的函数

在这里插入图片描述

可以看到字符
如果当前窗口类名为OLLYDBG,就退出程序。
这个是最简单的干扰,
实际上现在常用的OD都已经会隐藏自己的窗口类名了,插件的功能越来越多,TLS回调对于反调试的干扰越来越弱。


在这里插入图片描述

用VMProtect3.5进行全保护加壳。

点击运行,
VMP3.5的全保护首先就是要
过掉BeingDebugger和NTGLObalflags,
用的程序是64位,
所以PEB地址为gs:[60],
BeingDebugger和NTGLObalflags的地址
PEB+2 -> BeingDebugger,
PEB + BC ->NTGLObalflags。

在这里插入图片描述
在这里插入图片描述

删除所有断点:

然后给这两个函数下断点 
设置条件断点
NtQueryInformationProcess:函数就可以获取调试端口。
若处于调试状态 , 第三个参数会被置为0xFFFFFFFF(-1);
若处于非调试状态,第三个参数值会被设置为0。

设定条件断点rdx == 0x07 || rdx ==0x1E

NtSetInformationThread:
使用Windows的一个未公开函数的方法,你可以在当前线程里调用NtSetInformationThread,
调用这个函数时,
如果在第二个参数里指定0x11这个值(意思是ThreadHideFromDebugger),
等于告诉操作系统,
将所有附加的调试器统统取消掉。设定条件断点rdx == 0x11


 

在这里插入图片描述

然后运行 执行顺序可能不一样 但处理方法一样 
我这里先断在了

NtQueryInformationProcess:rdx == 0x07 
把r8 置为nullptr(0

在这里插入图片描述

再运行,NtQueryInformationProcess:rdx ==0x1E 把r8 置为nullptr(0)
执行到返回值
ret返回 并将RAX返回值C0000353

在这里插入图片描述

在这里插入图片描述

在运行,NtSetInformationThread:rdx == 0x11 
将rdx置为3后,禁用这两个断点。
在这两个函数下硬件断点
ntclose 硬件断点:NtClose函数在释放无效句柄时。
如果没有被调试,那么函数返回FALSE。
如果处于调试状态则会抛出异常C0000008H 
并设置条件 rcx == 0xDEADC0DE



NtQuerySystemInformation硬件断点:
被 ntdll.dll 导出,当第一个参数传入 0x23 (SystemInterruptInformation) 时,
会返回一个SYSTEM_KERNEL_DEBUGGER_INFORMATION 结构,
里面的成员KdKdDebuggerEnable 和 KdDebuggerNotPresent 标志系统是否启用内核调试。
并设置条件 rcx == 0x23



在这里插入图片描述

然后运行如果执行到NtQuerySystemInformation 且rcx==0x23 
执行到返回 然后将RAX变为status_unsuccessful(0xC0000001)
然后运行到ntclose 并将RCX设置为0(flase)

然后清除(禁用)所有断点然后运行

在这里插入图片描述
在这里插入图片描述
成功的绕过了反调试,shift+F9运行在进行调试中就不会有任何报错。

Mobile

APK


https://mp.weixin.qq.com/s/0RFRxeZtFGXbAiIgD5yt_Q
# 摸瓜—自动化APK违法线索分析平台

大量传统apk反编译的人工工作,实现机器自动化,降低分析违法APK难度。

集成分析工具、数据接口。一键查询域名、ip、服务器等数据。提升安全研究者分析效率

1、进入网站:https://mogua.co

  

2、点击按要求进行风险apk上传

摸瓜

亚洲首款交互式Android反编译器

GDA主页-亚洲首款交互式Android反编译器

Android免杀小结 - 先知社区 (aliyun.com)

APP的登录协议分析

https://mp.weixin.qq.com/s/Z4hI_8FO_77dHLcjKMeXFw
尝试逆向方向相关的探索
某款运动APP的登录协议进行了分析

抓包使用 Charles

请求头里面有sign字段

整体长度为40,常用的MD5长度为32,第一反应不太像,但是也有可能md5以后再拼接其它字段,
sha1散列函数的长度是40,正好吻合



是否有MD5的痕迹,直接写脚本frida试着跑下。
脚本内容比较明确,针对MD5的Init、Update、Final分别hook打印看下输入与输出,下面给到关键代码:


// hook CC_MD5
    // unsigned char 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值