逆向入门分析实战

hetianlab hetianlab     2023-03-31     304

关键词:

本文作者:xiaoyuer

1.木马分析入门


 

大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会。由于是入门的内容,所以对于二进制大佬来说这很简单,所以本文主要面向的对象主要是和我一样一直做Web安全,又想入门二进制安全的人。本次我学习的案例是木马和病毒常用的一个技术:确保只有一个病毒或者木马在系统中运行,即运行单一实例。对于病毒和木马而言,如果多次重复运行,会增加暴露的风险。所以要确保系统中只运行一个病毒或木马的进程。

 

1.1.正向编写C代码

要实现运行单一实例,一种常见且简单的方法是通过创建系统命名互斥对象实现的,这种方法主要是利用CreateMutex函数,通过该函数我们也可以查看是否已经有一个进程运行了。那么,如果通过CreateMutex函数得知是否已经有一个在运行的进程了呢?

下面简要介绍下CreateMutex函数,它的功能是创建或者打开一个已命名或者未命名的互斥对象。

关于它的返回值,如果函数成功,则返回值是新创建的互斥对象的句柄。如果函数失败,则返回值为NULL。要获得扩展的错误信息,请调用GetLastError。如果互斥锁是一个已命名的互斥锁,并且该对象在此函数调用之前就存在,则返回值是现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。

简单点来说,就是如果CreateMutex函数的返回值不是NULL,并且调用GetLastError函数后,返回值是ERROR_ALREADY_EXISTS,那么可以判定已经存在了一个在运行的进程。用C语言代码实现如下:

技术图片

使用VC++6.0完成编译链接后生成可执行文件,双击运行,显示如下:

技术图片

在不关闭上述进程的前提下,再次双击生成的可执行文件,显示如下:

技术图片

可以看出当系统中运行第二个进程的时候,输出了Already Run!!!!说明程序已经成功地判断出重复运行了。

 

1.2.逆向分析

下面我们就对这个程序进行逆向分析,我们需要对主函数和子函数分别进行逆向分析,这次先分析主函数。

关于学习的方法,我的收获是在初学阶段,我们先分析自己写的代码,分析完之后再进行印证,慢慢地就可以脱离源码并尝试分析其他未公开源码的程序流程。

在学习过程中,十分重要的一点是:要分清主次。什么意思呢?

学习汇编语言和逆向,我们完全没有必要逐条指令去仔细阅读所有的代码,重要的是从整体上理解程序究竟做了哪些操作。汇编语言也是一种编程语言,平常大家也不会去一行一行地仔细阅读别人写的大量代码,除了必须要理解的重要部分花时间仔细读一读,剩下的部分基本都是一带而过,只要大体上理解程序在做什么事就好了。逆向工程也是一样,“重要的部分花时间仔细理解”“其余部分大概知道怎么回事就好”这两条原则同样适用。

那么哪些是重要的呢?在病毒木马分析中,其中一点比较重要的是分析call函数,只要将这个程序所调用的函数分析清楚了,那么就知道这个病毒木马在做什么了。与此同时要弄清楚它的逻辑结构,比如什么时候跳转到哪执行。

接下来我们首先对主函数进行分析。

 

1.2.1.主函数:

主函数的C语言代码如下图所示:

技术图片

下面对其汇编代码进行分析:

技术图片

 

_main_0 proc near

var_40= byte ptr -40h

push    ebp

mov     ebp, esp

sub     esp, 40h

push    ebx

push    esi

push    edi

lea     edi, [ebp+var_40]

mov     ecx, 10h

mov     eax, 0CCCCCCCCh

rep stosd

 

以上代码完成所有的函数入栈操作,每个函数开始时都会有这样的操作,这里我们无需过分细究,如感兴趣,对这段代码详细的分析可参考《C++反汇编与逆向分析技术揭秘》p150,我也将其主要的内容贴出来了:

技术图片

技术图片

关于这段内容中补充介绍两个指令,其中,xor eax,eax直接会将eax的值设置为0,这是将寄存器设置为0最常见的方式,cmp指令是条件指令,详细内容如下图所示:

技术图片

这段内容在这里暂时只需了解,无需深究,等需要的时候再去研究也不迟。

之后,到了需要认真理解的地方了,下一条的指令是

call    sub_401005

它的意思是调用子函数sub_401005,在这里其实对应的是我们编写的IsAlreadyRun函数。

需要补充的是在函数调用时,如果有参数需要传递,需要在call指令之前,使用push先将参数从后往前入栈。这里因为无任何参数传递,所以在调用之前,无需使用push指令将参数入栈。后面还会详细介绍是如何从后往前入栈的,这里需要先记住这个知识点。

还有一个要记住的是在函数调用完成后,VC中,会使用eax寄存器来保存函数的返回值。

接下来的一条指令是

test    eax, eax

关于test指令,只需记住若eax为0,则zf标志位会设置为1,此时eax中的值是上一条指令的返回值,若对test指令感兴趣可参考如下解释:

技术图片

技术图片

接下来的指令是

jz      short loc_4010E0

jz是跳转指令,即jump zero,即当零标志位ZF=1的时候跳转到 loc_4010E0这个位置执行,此时也就是上一个指令test eax,eax得到的操作使得ZF=1,也就是eax=0,由于eax保存的是子函数的返回值,所以我们得知子函数的返回值为0。由我们编写的C语言代码可知,此时对应的是IsAlreadyRun函数返回结果为false,和我们的分析相对应。

跳转到该位置后:

loc_4010E0:             ; "NOT Already Run!
"

push    offset aNotAlreadyRun

call    _printf

add     esp, 4

 

可以看到的call  _printf 指令,这将会调用printf输出函数。由于printf需要传递参数,所以在call _printf之前,需要先执行push的操作。我们将鼠标放在aNotAlreadyRun上可以看到对应的字符串与loc_4010E0:后的备注信息"NOT Already Run! "一样,如下图所示:

技术图片

所以得出结论,若子函数sub_401005的返回值为0时,跳转到loc_4010E0位置,将会输出"NOT Already Run! "。与我们编写的C语言代码相符合。

那么,若子函数sub_401005的返回值为1时,会怎么样呢?

技术图片

此时,会走到左边的执行框内,不会跳转到右边。同理,这里将会输出"NOT Already Run! "字符串。

执行完成后,左右两边的内容都会到loc_4010ED这个位置继续执行:

技术图片

这段内容看到有call ds:Sleep指令,此处是调用了Sleep函数,对应的是我们C代码中的Sleep(10000):

技术图片

由于要传递参数,所以需要先将参数入栈,即push操作,可以看到在call ds:Sleep指令之前,有push    186A0h 指令,将鼠标放置在186A0h上,右键可观察对应的十进制:

技术图片

刚好也是100000,所以和我们编写的C代码也刚好符合。

之后,使用pop和call  __chkesp等指令,完成出栈、检查栈平衡等函数返回工作。

技术图片

目前,关于主函数的分析已经完成,下篇我们一起进一步对子函数进行详细的分析。

 

参考书籍

《Windows黑客编程技术详解》甘迪文著--北京:人民邮电出版社,2018年12月。

《C++反汇编与逆向分析技术揭秘》钱松林,赵海旭著--北京:机械工业出版社,2011年9月。

《恶意代码分析实战》 (美)Michael Sikorski / Andrew Honig 著,诸葛建伟,姜辉,张光凯译 -- 北京:电子工业出版社,2014年4月,原书名:Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software。

《汇编语言》王爽 著--2版,北京:清华大学出版社,2008年4月。

windows逆向分析入门——代码篇

...体的代码细节,等到实战会展开细说。 明确一下  逆向两个目的  1、调用功能  2、获取数据 对应的实现方法  1、调用功能    找到偏移,直接调用。  2、获取数据    对于全局数据,找到偏移,... 查看详情

逆向入门分析实战

本文作者:xiaoyuer1.木马分析入门 大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会。由于是入门的内容,所以对于二进制大佬来说这很简单,所以本文主要面向的对象主要是和我一样... 查看详情

记一次androidapp逆向入门实战(逆向思路&工具使用&crackme)(代码片段)

目录背景知识CrackMe工具逆向实战App1正向分析法Smali修改法IDA动态调试法逆向实战App2参考链接​​​​​​​​​​​​​​背景知识随着Android设备的急剧增长和逆向工具链的成熟,AndroidApp的安全性问题日益突出,其中... 查看详情

什么是android逆向?如何学习安卓逆向?android逆向自学笔记入门到实战(代码片段)

前言“安卓逆向”不是一个新名词,它伴随着安卓开发而生,但是一直以来,仅限于技术圈内流行,对于非技术圈人士,往往把“APP破解”和“安卓逆向”划等号。这是写给非技术圈人士看的,在于普及安... 查看详情

pythonjs逆向实战项目:某咕视频逆向分析&攻破~~

文章目录目标:实现咪咕视频登录逆向探究成果展示源码更多优质文章尽在,点我本文仅供学习参考,如有侵权请联系删除!!!声明:本文不是什么手把手非常细致的教学,可能需要有点经验的&#... 查看详情

安全逆向分析实战

...文记录了对某发行版Linux中一个安全模块(LSM)的逆向过程,该LSM对系统中待运行的程序进行安全校验,数据流穿越内核态与用户态,涉及系统内核及系统服务。此LSM对系统安全性的增强效果明显,其设计... 查看详情

安卓逆向--实战某峰窝app(动态分析)(代码片段)

往期文章安卓逆向--实战某峰窝APP(静态分析)安卓逆向--IDA动态调试一、启动调试环境1、启动android-server./as 2、转发端口adb forwardtcp:23946tcp:23946二、启动IDA,加载要调试的SO文件三、在上节课分析的关键处下断,然后查看... 查看详情

windows逆向分析入门——总篇

...己找新的功能时,容易不知道怎么下手。  也没找到把逆向分析这事说明白的资料,只能自己搜集零碎的信息,慢慢形成对逆向分析的整体认知。  学习过程,也加入一些逆向的圈子。接触下来,交流的氛围不太理想。小白... 查看详情

《逆向分析实战》数据的存储及表示形式

本文摘自人民邮电出版社异步社区《逆向分析实战》一书,点击查看http://www.epubit.com.cn/book/details/4918关注微信公众号【异步社区】每周送书学习过计算机的读者都知道,计算机中的各种数据都是以二进制形式进行存储的,无论是... 查看详情

《逆向分析实战》1.1

1.OD界面的熟悉左上为反汇编窗口,用于显示反汇编代码,调试分析程序主要在这个窗口中进行。左中为信息提示窗口,用于显示与反汇编窗口中上下文环境相关的内存,寄存器或者跳转来源,调用来源等信息。左下为数据窗口... 查看详情

安卓逆向--实战某峰窝app(静态分析)

一、通过抓包进行对比分析,需要找的参数的是"oauth_signature",感觉像是Base64编码二、JEB载入该APP搜索关键词三、按tab键,切换成java代码,有个关键加密函数“cryptoParams”四、双击进入该函数,该函数又... 查看详情

安卓逆向入门练习之电影天堂app逆向分析(代码片段)

准备抓包环境及工具准备,参考:使用Fiddler对安卓App抓包APP:电影天堂APP,版本:3.5.0抓包使用fiddler在模拟器里对App进行抓包,拦截到四种类型的数据:http://m.dydytt.net:8080/adminapi/api/version.json?vs=0http 查看详情

安卓逆向入门练习之电影天堂app逆向分析(代码片段)

准备抓包环境及工具准备,参考:使用Fiddler对安卓App抓包APP:电影天堂APP,版本:3.5.0抓包使用fiddler在模拟器里对App进行抓包,拦截到四种类型的数据:http://m.dydytt.net:8080/adminapi/api/version.json?vs=0http 查看详情

朴实无华pythonjs逆向实战:某8同城js逆向,淦就完事了~~~(代码片段)

文章目录前言目标:登录密码JS逆向逆向解析验证成果源码获取方式福利Java入门到就业学习路线规划小白快速入门Python爬虫路线前言本文仅供学习参考,如有侵权,请联系我删除!更多爬虫教程项目实战尽在——&... 查看详情

逆向&编程实战metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell(代码片段)

/QQ:3496925334作者:MG193.7CNBLOG博客号:ALDYS4未经许可,禁止转载/关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具【Android编程】Java利用apktool编写Metasploit恶意后门注入工具【Android编程】Java利用Socket类编写Metasploit安... 查看详情

逆向与反汇编实战--peid分析复现(代码片段)

1.准备简介:PEiD(PEIdentifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名。 整个过程需要测试文件成品:https://www.lanzous.com/b07r7qu0d 首先使用PEiD检测之前做的... 查看详情

如果你是安全工程师逆向工程师,那么你可能需要一本《二进制分析实战》

绝大多数计算机程序是使用C或C++等高级语言编写的,该类编程语言无法直接运行。在使用它们之前,必须先将其编译为包含计算机可运行的机器语言的二进制可执行文件。但是,你如何知道编译后的程序与高级... 查看详情

入门python数据分析最好的实战项目(代码片段)

北京二手房房价分析与预测目的:本篇给大家介绍一个数据分析的初级项目,目的是通过项目了解如何使用Python进行简单的数据分析。数据:通过爬虫采集的链家全网北京二手房数据\\数据初探首先导入要使用的科学... 查看详情