恶意代码分析之API hash反静态分析.pdf

所需积分/C币:5 2019-11-15 2.08MB PDF
评分

在恶意代码分析中, Windows 平台的 API 函数是非常重要的信息来源, 比如通过分析恶意代码中使用的 API 函数, 我们不需要对已加壳的文件进行逆向分析,因为我们只需要对恶意代码所执行的 API 调用来进行动态分析,就可以知道某个特定文件具体的功能了。
m函区 ub 40369D proc near ca sub 406A4D uS 1 calldword41CB64 call sub 404890 test eax eax short loc 4036BD loc 4036BD sub 40lAC5 short loc 4036D2 all sub 403F36 eax call sub 406A52 pop 回卤区 西晒 h 0 sub 403EEF 1oC4036D2 Faz)|(65. 6)0000A9D0040369D: sub_40369nl(Synchronized with Hex View-1)I 步一步分析,再接着进入sub_406A4D,发现有跣转,跟随珧转。如下: Attributes: bp-based frame thunk sub 406A4D proc near sub 405BCD sub 406A4D endp Attributes: bp-based frame sub 405BCD proc near var_ 18= byte ptr-18h var3- byte ptr-3 push moy P, esp b esp, 18h Us es工 Xor esl, esl loc 405BD6 push dword 41C9F8Lesil cal sub 405DCE dword 41C9F8Lesil, eax ado pop eCx Cmp esi, 230h jb short loc 405BD6 西图 eax,「ebp+var181 BCD: sub_405BcD)(Synchroni red with Hex viev 函数一开头就是一个循环,发现 dword_419F8[es有徳环赋值的操作,而sub_405DCF则是关键的重建A叫函数地址的函数(后续动态调试会发现),所以首要分析该函数。该处活环每次累加04,直到累加和为0x230 大小时结束,也就是在 dword41C℃24地址处结束。每个 DWORD值对应一个AP函数, Sodinokibi/REvi勒索软件会使用 API hash解析成框应的AP函数地址。进入该数组后,发现编码的hash值内容如下,每个值 为 DWORD类型。 data: 8041C9F4 db data: 001C9F5 data: 041c9H6 data: 0041C97 db 6oh data: 0041(918 dword_41c9-8 dd (B6U391Ath DAIA XREF: sub 40424+86tr data: c01C9Tg b 405BCD loc 405BD6tr data: (e41(9- dword_41c9- dd eACB/1303h DAIA XREF: sub 404588tr data: ee41corc sub 40489C+3ETr data: ee11cAee dword_M1C/o9 dd 9F9CE2/7h DATA XREF: sub 106826+17A1r data:(e41(A94 dword_41CA04 dd 50493AH5h DA|AXR上 60b+28Tr data:8811C/91 sub461B1+12个r ata:0041(Ag] dword_41CA08 dd Cc351-85Bh DAIA XREF:sub424/C上+31↑r data: c011CA99 bAA7CE+59↑ data: e41(AgC dword 41cA0C dd 39AD42/Ch DAIA XREF: sub 405BCD+5lTW data: 6041CA9C b40573「+16↑ data:0041CAle dword 41CA10 dd 286C42DAH DATA XREF: sub 404668+10Tr data: e041CA14 dword 41CAl4 dd eAE6CAA51h DATA XREF, sub 40667A+41r data: e011CA1/ subA0567A+B3↑r data: 04IcA1 dd yhBlsAah data: 00 1CA1 dd3D35734h data: 6041CA2e dword 41CA2g dd ec1BC2C14h ALA XR上:sub4836b+12↑r data: 0011CA24 dword 41C/2 dd ercBrDBC2h DATA XRE sub /039B0+201tr data: ((A28 dword_41CA28 dd CE5AN8H1Ah DAIA XREF: sub 403BHA6Tr data: 0041CA2C dword 41CA2C dd CADCr0A5Eh DATA XRE: sub 404D60+211r data: e011CA20 sub 401D60+ATr data: 041(A3e dword 41CA30 dd 66D30C/Hh DAI ub423}3+94个 data:@/ dword cA3 dd 13DBBA0Bh DATA XRE: sub /01B55+3Tr a dword 41cA38 dd 6A0800BEh DALA XREH: sub 403CD3+85t data: 0e11CABC dvicrd A1C/3c dd eC97rA3D5h i D/TA XREr: sub 403DCB+6tr data: 004. data: 0041CA40 dword 41CA40 dd CE96083Drh DATA XRE: sub 406AAD+10BTr 41二A4: freni 进入上述的AP构建函数sub405DCF内部,如下 sub_405F proc near pang时 Jz short IDc_4:EEsg 1624, Sur.cheon ce1…出Has 可以发现存在很乡分支结构,有很多判断条忖,为了方便,转换成伪G代码看看 nint cdecl sub 405DCF(int (*a1)(void) 3 unsigned int v1;//es 4 unsigned int v2;//eax 5 int v3: / eax 6 int v4; //eax eax 8 int v6; // 9 int v7;// eax 10 int (*v8)(void);// 11 int v9: eax 12 int v10: //eax 13 int v11;// eax 14 int v12;//ea 15 int v13;// eax int v14;// edi 17 tv15; 18 int v16;//eb 19 DWORD *v17;//ecx 0 int v18:// edx 21 int v20;//[esp+Ch [ebp-ChI 22 int v21;//[esp+10h [ebp-8hI 23 int v22;//esp+14hlebp-4h 24 unsigned int v23; // esp+20hI [ebp+8h] 26 v1=(unsigned int)al (((unsigned int)a1 A 0x76C7)<< 16)A OxAFB9 27V2=V1》>21; 28if(V2>0x397) 29{ 2-1243 31if(!v9) 000051CF sub_405DCF: 1(405DCF 函潋开头的就对输入参潋进行了¢理,该函数的翰入参数是网焖哽编码的 DWORD大小的值,也就是 API hash值,为了便于分析,对其进行重命名为 API hash a1 1=(unsigned int)al A(((unsigned int)al A 0x76C7)<< 16)A 0XAFB9; 1>>21 f(v2>x397 s Please enter a string 2-1241eas5 (!v9) OK Cancel v8=(int (*)(void))sub 405C9A; goto LABEL 2 输入的值首先会与0κ76C7异或,得到的结果左移佁6位,然后再与0xAFB9异或,最后的结果再与之前输入的儘进行异或,最终得到v 25 26 v1=(unsigned int)API hash al A(((unsigned int)API hash al A 0x76C7)<< 16)A 0xAFB9; 27v2=v1>>21; 28if(v2>0x397) 30 9=V2-1243; 1if(!v9) v8=(int (*)(void))sub 405C9A; goto LABEL 2 36 f(!v18) 接着由Ⅵ1右移21位得到的v2,在后续流程里会跟进v2的值来到不同的分支,如下 22 int v21; // esp+10hI [ebp-8h 23 int v22;// esp+14h[ebp-4h 24 unsigned int API hash ala; //Iesp20h] Lebp+8h] 25 26 v1 =(unsigned int )API hash al A(((unsigned int)API hash a1 A 0x76C7)<< 16)A 0xAFB9; if(v2>x397) 78931233567890 2-1243; f(!v9) v8=(int (*)(void))sub_405C9A; goto LABEL 27; v19=v9-368 if(v10) v8=(int (*)(void))sub_405D17; goto LABEL 27; 11 10-63 函数 (!v11) v8=(int (*)(void))sub_ 405C61; goto LABEL 27; v12=V11-110; (!v12) v8=(int (*)(void))sub 405FEC goto LABEL 27; 50ub405r:30(405E50 跟进其中一个分支的函数里,发现又会调用sub_405DCF,输入畚数为硬编码的 DWORD数值,同样是解码鬓作, lint sub 405C9A0 2 3 int( thiscall *vo)(int, char );//eax 4 int v1://STeC 4 5 char v3;// [esp+oh] [ebp-Ch] 6 char v4;// Lesp+9h Lebp-3h 8sub404E3((int)&unk41CC28,1491,10,9,(int)&v3) 9V4=; 10 v0=(int thiscall *)(int, char *))sub 405DCF((int (*)(void))0x5C1336BE); 11 return ve(vl, &v3); 接着往下分析,選到了0x3C与0X78(0x18与060的和),如果对PE文件结构熟悉,就会发现这与寻找导出表有关,因为叫文件从加载基址算起,偏移0x3C的地方就是其PE头,PE头偏移0x78的地方存放着 指向函数导出表的指针,如下图.就是寻找PE文件的导出表的过程 96if(v7!=31) 98 LABEL 22: 99 8= API hash al 10 2 v8= sub 405F7A; 103 LABEL 27 104V13=V8() 105V14 1861f(!v13 107 return 0: 108 V15=v1& 0XlFFFFF: 109V16=0 110V17=( DWORD X)(v13+*( DWORD*)(*( DWORD*)(v13+0x3)+V13+0x78)) 111V21=V13+V17[9] 112V18=V13+V17[8] 114V20=V13+V17[7 115 API hash ala=V17[6]; 116 if(! API hash ala 117 return g 118 while((sub405BA(v14+*( DWORD*)(18+4*v16))&0x1FFFF)!=V15) 119{ v18=v22; f(++v16>=API hash ala return 0 124 return v14 +* DWORD *)(v20+ 4**(unsigned int16 *)(v21 +2 x v16)); 为了便于查看,这里的话我们可以在IDA中自建本地类型,构建结构体,如下是wnn nh中导出表 typedef struct IMAGE EXPORT DIRECTORY t DWORD Characteristics: Offset ox0 WORD Major Version: // offset DxB DWORD Name:/offset Oxc DWORD Base: offset 0x10 DWORD NumberOfFunctions: /offset Ox 14 DWORD NumberofNames: offset ox18 DWORD AddressofFunctions: M/offset Oxic DWORD AddressOfNames: /offset 0x20 DWORD AddressOfName Ordinals: / offset 0x24 在|DA中加入 Local Types,如下: h yiew Debugger Options Windows Help Open subviews 〉 Quick view Ctrl+1 m■ No debugger molars Proximity browser Ful‖ screen F11 HEX VIEW-1 A O Hex dump ii Graph Overview 昌 Recent scripts Data ba ase snae anager. Ctrl+Shift+T Bl Print segment registers Ctrl+ Space 了 Functions Shift+F3 夏 Print internal flags F s Strings Shift+f12 Hide Ctrl+ Numpad+ Shift+F7 Unhide Ctrl+Numpad++ nent regIsters Hide all X Delete hidden range a Signatures Shift+F5 etup hidden items. a Type libraries Shift+flt 109v16=0 a structures 110V17 (DWORD X)(v13+ text 111v21 shift+F10 text 0 112 V18=v: B Local types Shift+Fl text 113v22 pen local type definitions window text 114V20 115 api hast if Function calls text 116if(!A 0 117 118 while A Problems )(v18 v16)) text 119{ a Patched byte Ctrl+Alt+p 128 V18 LE IDA VIEW-A X E'SEUDOCODE-A x LOCAL TYPES x O HEX VIEW-1 x Ordinal Name Ctrl+c opy al Ctrl+shift+Ir y Quick filter Ctr+e h Modify filters Ctrl+ shift +F Synchronize to idb Export to header file Map to another type. Please enter text Please enter new type declaration(s) struct IMAGE EXPORT DIRECTORY i DWORD Characteristics //offset 0x0 DWORD Time DateStamp; //offset 0x4 WORD Majorversion; //offset 0x8 WORD Minorversion; //offset @xa DWORD Name: //offset @xc DWORD Base: //offset 0x10 DWORD Numberof Functions: // offset 0x14 DWORD Numberof Names: //offset 0x18 DWORD AddressofFunctions: //offset 0x1c DWORD AddressofNames: //offset 0x20 DWORD AddressofNameOrdinals; //offset 0x24 Cancel 唱| DA VIEW PSEUDOCODE-A x回 LOCAL TYPES x面 HEX VIEY1 Ordinal Name MAGE EXPORT DIREC. 00000028 struct(DWORD Characteristics; DWORD TimeDateStamp WORD Major'Version: WORD MinorVersio 右键选中需要转换的变量进行转换,如下 v16=0 P nlIonn 5e\/.1) DWORD*)(*( DWORD*)(v13+0x3C)+V13+0x78); hame vat Set lvar t Reset pointer type Convert to struct s Edit comment Edit block comment Ins ( DWORD*)(v18+4*V16))&0x1FFFF)!=V15) Hide casts if ++v16 > API hash al 司 Select a structure Type name Declaration 回1 MAGE EXPORI DIRECTORY struct (DWORD Characteristics; DWORD TimeDate Stamp: WO.28 dce earch Line 1 of 1 10 v17=( IMAGE EXPORT DIRECTORY %)(v13+*( DWORD *)(* DWORD *)(V13+0x30)+ v13 + 0x78)); OIll V21= v13 V17->AddressofNameordinals v13 VI7->AddressofNames; 12= v13 + v17->AddressofNames; 114 V20= V13 Vl7->Addres sOfFunctions; o 115 API hash ala= v17->NumberofNames; 116 if( API hash ala return o 118 while( (sub 405BAE(V14 +*( DWORD *)(v18+ 4* v16))& 0X1FFFFF)!= v15 119 v18 21 if ++v16 >API hash ala return e 123 124 return v14 +*(DWORD *)(v20+ 4**(unsigned int16 *)(v21 +2* v16)) AC sub_405DCP: 110(405EAc) 上图可以很清楚的显示岀导岀表结枃体里的相字段,在卜面的whl循环里,通过比較之前获取的ⅵ经过计算后的值v15与sυb405BAE生成的结果,看是否一致,如果一致就会获取到当前的AP函数的地址(由最 后的 retum V14+ DWORD*)(v21+4*t{ unsigned int16*v22*2*v16)返回),进入405BAE查看,如下: 1 void cdecl sub 405BAE(int a1) 3 JUMPOUT(&loC 405BC5): 发现存在烑转,双击进入反繃译失败。 st 1 void cdecl sub_405BAE (int a1) 3 JUMPOUT(&loc 405BC5); 4} S Warning Decompilation failure 405BCC: positive sp value has been found Please refer to the manual to find appropriat Don' t display this message again (for this session only 只能来到原始的汇编区域看看,按G眺转到sub405BAE,如下

...展开详情
立即下载 最低0.43元/次 身份认证VIP会员低至7折
举报 举报 收藏 收藏
分享
108.79MB
恶意代码分析实战(带目录)

本书是一本内容全面的恶意代码分析技术指南,其内容兼顾理论,重在实践,从不同方面为读者讲解恶意代码分析的实用技术方法。 本书分为21章,覆盖恶意代码行为、恶意代码静态分析方法、恶意代码动态分析方法、恶意代码对抗与反对抗方法等,并包含了shellcode 分析,C++恶意代码分析,以及64 位恶意代码分析方法的介绍。本书多个章节后面都配有实验并配有实验的详细讲解与分析。通过每章的介绍及章后的实验,本书一步一个台阶地帮助初学者从零开始建立起恶意代码分析的基本技能。 本书获得业界的一致好评,IDA Pro 的作者Ilfak Guilfanov 这样评价本书:“一本恶意代码分析的实践入门指南,我把这

2018-10-05
112.46MB
恶意代码分析实战(书籍)

恶意代码分析实战电子书是网络维护工程师必读的一般书籍,该书籍主要讲解了恶意代码的分析技术、判断恶意代码的方法,恶意代码的特征、数据加密技术,让您可以连接网络上的恶意代码来源,增加自己的网络防护知识;大家都知道网络上拥有很多的病毒,这些病毒都是人为设计的一些恶意程序、代码,它可以一直运行在网页中、运行在软件上,甚至是您的代码中,感染病毒的方式也是多种多样,通过阅读本书以后,您就可以对恶意的代码有一定的了解了,本书采用的是PDF的电子版,下载就能观看,非常方便,需要的朋友可以下载观看! 但是运行书中的代码或者链接时,为了您的电脑安全,需要在虚拟机或沙箱中进行

2018-09-02
1.78MB
恶意代码分析实战课后配套练习

这是由Michael Sikorski与Andrew Honig编写的《恶意代码分析实战》课后的配套练习题。本书具有极强的实战性,可以说是每一位恶意代码分析师人手必备的经典。特别是每一章后面的配套练习,都是作者以自己的实战经验,结合该章节的内容而设计的,非常值得每一位读者认真练习。但是由于该练习题库在国内网站上并不提供,就算有也是可能需要积分之类,并且还不能保证该题库没有被加载额外的病毒木马。于是我在作者的网站上下载了这一套题库,免积分提供给各位有兴趣的读者。需要特别说明的是,由于该练习题本身就是病毒木马,所以大家一定要在虚拟机的环境下执行,并且在解压缩时会被杀软报毒,也请给位留意。

2014-12-12
1.63MB
恶意代码分析实例

恶意代码分析实例 病毒、木马实际案例分析 恶意代码分析实例

2018-04-19
912KB
恶意代码分析实战原书配套课后练习程序

《恶意代码分析实战》原书配套课后练习程序。 《恶意代码分析实战》原书配套课后练习程序。

2017-11-30
141.33MB
恶意代码分析实战

本书是一本内容全面的恶意代码分析技术指南,其内容兼顾理论,重在实践,从不同方面为读者讲解恶意代码分析的实用技术方法。, 本书分为21章,覆盖恶意代码行为、恶意代码静态分析方法、恶意代码动态分析方法、恶意代码对抗与反对抗方法等,并包含了shellcode 分析,C++恶意代码分析,以及64 位恶意代码分析方法的介绍。本书多个章节后面都配有实验并配有实验的详细讲解与分析。通过每章的介绍及章后的实验,本书一步一个台阶地帮助初学者从零开始建立起恶意代码分析的基本技能。, 本书获得业界的一致好评,IDA Pro 的作者Ilfak Guilfanov 这样评价本书:“一本恶意代码分析的实践入门指南,我把这

2016-09-20
910KB
恶意代码分析实战-实验-样本-样例

恶意代码分析实战书籍里面用到的恶意代码样本 解压密码:csdn

2014-07-30
386KB
恶意代码分析实战》-实验实例文件

《恶意代码分析实战》-实验实例文件,解压密码:malware

2014-11-22
973KB
恶意代码分析实战 课后练习实验文件

恶意代码分析实战 课后练习配套完整文件。

2018-09-07
11.4MB
恶意代码分析(Malicious Mobile Code)

恶意代码分析(Malicious Mobile Code)

2012-09-10
9.27MB
恶意代码分析实战 英文原版pdf

恶意代码分析实战,详细介绍了网络安全基本技术。包括:静态分析、动态分析、反汇编、IDA分析等

2018-12-28
990KB
恶意代码分析实战实验作业

这是由Michael Sikorski与Andrew Honig编写的《恶意代码分析实战》课后的配套练习题。本书具有极强的实战性,可以说是每一位恶意代码分析师人手必备的经典。特别是每一章后面的配套练习,都是作者以自己的实战经验,结合该章节的内容而设计的,非常值得每一位读者认真练习。但是由于该练习题库在国内网站上并不提供,就算有也是可能需要积分之类,并且还不能保证该题库没有被加载额外的病毒木马。于是我在作者的网站上下载了这一套题库,提供给各位有兴趣的读者。需要特别说明的是,由于该练习题本身就是病毒木马,所以大家一定要在虚拟机的环境下执行,并且在解压缩时会被杀软报毒,也请给位留意。

2017-09-19
3.4MB
Android恶意代码分析

通过对本书的阅读,了解一定的相关分析能力,对于Android的开发会有一定的帮助

2015-12-28
907KB
恶意代码分析实战(实验)

密码是“malware”,《安全技术大系》-《恶意代码分析实战》

2014-10-24
388KB
恶意代码分析实战课后练习

恶意代码分析实战的课后资料,如果有兴趣的同学可以下载,然后通过7z解压,

2018-09-04
618KB
论文研究-恶意代码同源性分析及家族聚类.pdf

针对恶意代码数量呈爆发式增长,但真正的新型恶意代码却不多,多数是已有代码变种的情况,通过研究恶意代码的行为特征,提出了一套判别恶意代码同源性的方法。从恶意代码的行为特征入手,通过敏感恶意危险行为以及产生危险行为的代码流程、函数调用,应用反汇编工具提取具体特征,计算不同恶意代码之间的相似性度量,进行同源性分析比对,利用DBSCAN聚类算法将具有相同或相似特征的恶意代码汇聚成不同的恶意代码家族。设计并实现了原型系统,实验结果表明提出的方法能够有效地对不同恶意代码及其变种进行同源性分析及判定。

2019-09-07
36.76MB
Twitter手机端安装包--Android

Android手机Twitter客户端,很多时候下载特别慢,希望对你有帮助。

2017-09-29
1.5MB
60分钟学会OrCAD-Capture-CIS

60分钟学会OrCAD-Capture-CIS 很不错的资料,推荐给大家

2017-09-29
1.05MB
ModbusTCP/RTU网关设计

基于UIP协议栈,实现MODBUS联网,可参考本文档资料,有MODBUS协议介绍

2017-09-30
3.75MB
html+css+js制作的一个动态的新年贺卡

该代码是http://blog.csdn.net/qq_29656961/article/details/78155792博客里面的代码,代码里面有要用到的图片资源和音乐资源。

2017-10-03
img
jordan22

关注 私信 TA的资源

上传资源赚积分,得勋章
相关内容推荐