首页
社区
课程
招聘
[原创]编写自己的反汇编引擎之用法举例
发表于: 2011-1-21 13:20 8864

[原创]编写自己的反汇编引擎之用法举例

2011-1-21 13:20
8864

首先声明本帖首发于赏金论坛,希望大家能多多关注这个正在成长的论坛dfdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4Y4L8$3I4V1j5$3&6Q4x3X3g2U0L8$3#2Q4x3U0k6F1j5Y4y4H3i4K6y4n7
         
本来打算接着帮大家分解我的代码,但暂时先停一下,给大家举个例子,看看如何使用我的反汇编引擎。大家不应该有个误区说,反引擎只是为了把代码翻译出来给人看,其实他还有更多的用途,比如反病毒引擎、虚拟机等都需要有自己的反汇编引擎,他们把程序的代码翻译出来后都是给机器看的,而不是给人来看,拿例子说话吧。 
         给大家演示的是一个抓病毒变种的方法(我会不会不小心把免杀方法给透露了?呵呵,没关系,兵来将挡,水来土掩)。 
         给大家提供几个病毒变种,记住,不要在真实机器上玩火。 
 
         可以看到这些样本都是同一个病毒的变种,他们的大小以及代码都有所不同。但是要知道,既然是变种,他们的代码肯定是会有相同的部分,那好,哪里相同我们就检测哪里。其实这些病毒变种都是DLL文件,我这里改成EXE是为了给大家看一下他们有很多图标是一样的,至少可以在视觉上让大家相信他们确实是同一病毒。 
直接OD载入,来到OEP: 
 
来到这个call或者jmp处: 
 

那好,知道了上面这些特征,我们不必再往下看就可以想到一个检测此种病毒变种的方法了。 
1.       检测OEP处的第一条指令是否为cmp dword ptr[esp+8],1,有则跟进,无则退出检测,说明这个检测的文件不是我们要找的病毒变种。 
2.       检测从OEP开始处到50个字节内是否有call或jmp,有则跟进,无则退出检测。 
3.       跟进之后检测在100个字节内是否有MOV disp32,reg/Ib/Iz,有则进行统计。 
4.       检查统计数据,大于20个垃圾代码则说明这就是我们要找的变种,杀之。 
一百个人可能会想出一百种办法来检测这个病毒,我只是提供了一种思路。好了,现在来用我的引擎查杀此种病毒变种。 
/======================================================================================================================================== 
                            INSTRUCTION Instruction={0}; 
                            int iOpcodeLen=0; 
                            DWORD dwCount89C6C7 = 0; 
                            DWORD JmpOrCallAddr = 0; 
  

                            iOpcodeLen = Dissassemble((BYTE*)OepVa,&Instruction);   //dissassemble 
  

                            //OEP处的第一行指令必须是 : cmp dword ptr [esp+8], 1 
                            //这里也可以使用Instruction. InstructionBuf[]来直接比较,更方便 
                            if (Instruction.Opcode1 == 0x83 && Instruction.Modrm == 0x7C && Instruction.SIB == 0x24 && Instruction.Displacement.DispByte == 0x08 && Instruction.Immediate.ImmByte == 0x01)        //837C24 08 01    cmp     dword ptr [esp+8], 1 
                            { 
                                     for (int i = 0;i <= 50; i++)  //oep --> oep + 50 
                                     { 
                                               OepVa+= iOpcodeLen; 
                                               iOpcodeLen = Dissassemble((BYTE*)OepVa,&Instruction);   //dissassemble 
                                               if ((Instruction.Opcode1 == 0x89 || Instruction.Opcode1 == 0xC6 || Instruction.Opcode1 == 0xC7)&& Instruction.Modrm & 0x05)    // rm == 101,mov disp32,reg/Ib/Iz 
                                               { 
                                                        dwCount89C6C7++; 
                                               } 
  

                                               if (Instruction.Opcode1 == 0xE8 || Instruction.Opcode1 == 0xE9) //call/jmp xxxxxxxx 
                                               { 
                                                        OepVa += iOpcodeLen; 
                                                        JmpOrCallAddr = OepVa + Instruction.Immediate.ImmDword; //跳到 call/jmp 
                                                        for (int i = 0;i <= 100; i++) 
                                                        { 
                                                                 iOpcodeLen = Dissassemble((BYTE*)JmpOrCallAddr,&Instruction);      //dissassemble 
                                                                 if ((Instruction.Opcode1 == 0x89 || Instruction.Opcode1 == 0xC6 || Instruction.Opcode1 == 0xC7)&& Instruction.Modrm & 0x05)     // rm == 101,mov disp32,reg/Ib/Iz 
                                                                 { 
                                                                           dwCount89C6C7++; 
                                                                 } 
                                                                 if (dwCount89C6C7 >= 20)//大于20说明是变种 
                                                                 { 
                                                                           printf("%s Detectedn",FileName); 
                                                                           dwCountDetectedFiles++; 
                                                                           goto _FindNext; 
                                                                 } 
                                                                 JmpOrCallAddr += iOpcodeLen; 
                                                        } 
                                               } 
                                     } 
                            } 
                            else  //OEP处指令不是: cmp dword ptr [esp+8],1,则检查下一文件 
                            { 
                                     goto _FindNext; 
                            } 
//======================================================================================================================================== 
         来看看最终效果: 
 
   在此仅举一例,引擎的更多用途还待大家发掘。 
 病毒样本.rar (348 K) 
 Test_Detect_Virus.rar (2212 K) 
您正在看的文章来自赏金论坛 e37K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4Y4L8$3I4V1j5$3&6Q4x3X3g2U0L8$3#2Q4x3V1y4Q4c8e0g2Q4z5p5g2Q4z5f1k6Q4c8e0k6Q4z5e0k6Q4z5o6N6Q4c8e0g2Q4z5f1y4Q4b7U0m8Q4c8e0g2Q4z5f1c8Q4z5o6m8Q4x3@1q4Z5N6s2c8H3i4K6y4m8i4K6u0r3i4K6u0r3N6%4N6%4i4K6u0W2M7$3N6G2L8r3c8U0L8W2)9J5k6h3y4G2L8g2)9J5c8Y4u0W2j5h3c8Q4x3X3g2H3K9s2m8Q4x3@1k6@1K9h3c8Q4x3@1b7&6x3U0u0Q4x3X3g2Q4c8e0g2Q4b7e0k6Q4z5o6u0Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0S2Q4b7V1c8Q4b7f1y4Q4c8e0S2Q4b7V1c8Q4b7V1c8Q4x3V1y4Q4c8e0S2Q4b7f1k6Q4b7U0N6Q4c8e0S2Q4b7f1k6Q4b7f1k6Q4c8e0g2Q4z5o6S2Q4b7e0m8Q4c8e0W2Q4z5e0W2Q4b7e0c8Q4c8e0k6Q4b7f1c8Q4b7e0c8Q4c8e0c8Q4b7V1k6Q4b7e0q4Q4c8e0k6Q4z5o6q4Q4b7f1j5`.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 437
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
学习了。
2011-9-1 19:16
0
游客
登录 | 注册 方可回帖
返回