-
-
[原创]编写自己的反汇编引擎之用法举例
-
发表于: 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直播授课
赞赏
- 文件过滤驱动DEMO版 19967
- [原创]编写自己的反汇编引擎之用法举例 8865
- [原创]编写自己的反汇编引擎 31394
- [郁闷]绝无抄袭,绝无更改,全部复制 4724
- [原创]上午看到题,不知道现在晚不晚 3456