关于函数入口点与WinMain函数
msvcrt.dll(名称:Microsoft C Runtime Library)提供了printf,malloc,strcpy等C语言库函数,并且为使用C/C++(Vc)编绎的程序提供了初始化(如获取命令行参数)以及退出等功能. msvcrt - msvcrt.dll - DLL文件信息 DLL 文件: msvcrt 或者 msvcrt.dll DLL 名称: Microsoft C Runtime Library
msvcrt.__set_app_type 这是特征码
鄙人结合最近从论坛学到的知识,并结合流星学长的过主动防御教程 ,有点感想,在此抒发。
首先帖一篇文章:
什么是特征码:
程序运行时,在内存中为完成特定的动作,要有特殊的指令,
一个程序在运行时,同一内存地址的指令是相同的
同一个程序中,一段连续的地址(它的指令相同),那么我截取这段地址,
就可以判断它是不是这个程序。
为了防止出现病毒的误查杀,可以提取出多段特征码。
在WINNT下面的NOTEPAD.EXE的反汇编程序
01006420 > $ 55 PUSH EBP
01006421 . 8BEC MOV EBP,ESP
01006423 . 6A FF PUSH -1
01006425 . 68 88180001 PUSH NOTEPAD.01001888
0100642A . 68 D0650001 PUSH <JMP.&MSVCRT._except_handler3> ; SE handler installation
0100642F . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
01006435 . 50 PUSH EAX
01006436 . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
0100643D . 83C4 98 ADD ESP,-68
01006440 . 53 PUSH EBX
01006441 . 56 PUSH ESI
01006442 . 57 PUSH EDI
01006443 . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
01006446 . C745 FC 000000>MOV DWORD PTR SS:[EBP-4],0
0100644D . 6A 02 PUSH 2
0100644F . FF15 60110001 CALL DWORD PTR DS:[<&MSVCRT.__set_app_ty>; msvcrt.__set_app_type
01006455 . 83C4 04 ADD ESP,4
01006458 . C705 38990001 >MOV DWORD PTR DS:[1009938],-1
01006462 . C705 3C990001 >MOV DWORD PTR DS:[100993C],-1
0100646C . FF15 5C110001 CALL DWORD PTR DS:[<&MSVCRT.__p__fmode>] ; msvcrt.__p__fmode
01006472 . 8B0D 44880001 MOV ECX,DWORD PTR DS:[1008844]
01006478 . 8908 MOV DWORD PTR DS:[EAX],ECX
0100647A . FF15 4C110001 CALL DWORD PTR DS:[<&MSVCRT.__p__commode>; msvcrt.__p__commode
01006480 . 8B15 40880001 MOV EDX,DWORD PTR DS:[1008840]
01006486 . 8910 MOV DWORD PTR DS:[EAX],EDX
01006488 . A1 54110001 MOV EAX,DWORD PTR DS:[<&MSVCRT._adjust_f>
0100648D . 8B08 MOV ECX,DWORD PTR DS:[EAX]
0100648F . 890D 40990001 MOV DWORD PTR DS:[1009940],ECX
01006495 . E8 86010000 CALL NOTEPAD.01006620
0100649A . A1 C0850001 MOV EAX,DWORD PTR DS:[10085C0]
0100649F . 85C0 TEST EAX,EAX
010064A1 . 75 0E JNZ SHORT NOTEPAD.010064B1
010064A3 . 68 10660001 PUSH NOTEPAD.01006610
010064A8 . FF15 50110001 CALL DWORD PTR DS:[<&MSVCRT.__setusermat>; msvcrt.__setusermatherr
010064AE . 83C4 04 ADD ESP,4
010064B1 > E8 3A010000 CALL NOTEPAD.010065F0
010064B6 . 68 0C800001 PUSH NOTEPAD.0100800C
010064BB . 68 08800001 PUSH NOTEPAD.01008008
010064C0 . E8 17010000 CALL <JMP.&MSVCRT._initterm>
010064C5 . 83C4 08 ADD ESP,8
010064C8 . 8B15 3C880001 MOV EDX,DWORD PTR DS:[100883C]
010064CE . 8955 94 MOV DWORD PTR SS:[EBP-6C],EDX
010064D1 . 8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
010064D4 . 50 PUSH EAX
010064D5 . 8B0D 38880001 MOV ECX,DWORD PTR DS:[1008838]
010064DB . 51 PUSH ECX
010064DC . 8D55 9C LEA EDX,DWORD PTR SS:[EBP-64]
010064DF . 52 PUSH EDX
010064E0 . 8D45 90 LEA EAX,DWORD PTR SS:[EBP-70]
010064E3 . 50 PUSH EAX
010064E4 . 8D4D A0 LEA ECX,DWORD PTR SS:[EBP-60]
010064E7 . 51 PUSH ECX
010064E8 . FF15 48110001 CALL DWORD PTR DS:[<&MSVCRT.__getmainarg>; msvcrt.__getmainargs
010064EE . 83C4 14 ADD ESP,14
010064F1 . 68 04800001 PUSH NOTEPAD.01008004
010064F6 . 68 00800001 PUSH NOTEPAD.01008000
010064FB . E8 DC000000 CALL <JMP.&MSVCRT._initterm>
我们取 地址 01006420 到 0100642A 的指令(杀毒软件都是取核心部分的地址代码),如果别的程序的指令和他不一样,那这个程序就是病毒。通常杀毒软件会提取3处以上的关键代码(程序没有这段代码就无法感染文件或无法启动),如果在同一个EXE都存在则这个文件就是病毒。
在这儿的回答中能谁讲的更详细点吗?
我感觉大部分程序在刚进入入口点的时候都会有这么一段类似的代码。若是自己写的程序用OD载入,也会有这段代码。我搞不清楚这段代码是从哪儿来的,感觉函数的执行应该从WinMian函数开始呀,为什么入口点是在这儿呢?还有就是如何找到WinMain函数开始执行的地方
[解决办法]
你说的只是个例子,特征码提取很复杂的,有些病的的特征码是字符串,有些是代码。
[解决办法]
DLL的入口点是DllMain。进程中的每一个DLL都有一个唯一的32位HINSTANCE值所标识。此外进程本身也有一个HINSTANCE值,所有这些实例句柄只有在进程内部有效,它代表了DLL或EXE的起始虚拟地址。进程(EXE)实例句柄几乎总是0X400000,而装入在默认基地址的 DLL的句柄是0X10000000,如果有多个DLL,则每个都有不同的HINSTANCE值。
[解决办法]
对啊 特征码本身就很复杂的
这个判断不是很准确的 。字符串 代码 指令
我以前就做过一个360免杀的木马
那个就是把特征码改了 而且我改的只是一个字符串的大小写而已
就绕过360了
[解决办法]
我感觉大部分程序在刚进入入口点的时候都会有这么一段类似的代码。若是自己写的程序用OD载入,也会有这段代码。我搞不清楚这段代码是从哪儿来的,感觉函数的执行应该从WinMian函数开始呀,为什么入口点是在这儿呢?还有就是如何找到WinMain函数开始执行的地方
关于这个问题.对于一般的用户来说,程序的入口点是main或是WinMain.但对于OS来说,入口点并不是这两个函数.而是CRT的启动函数.这个函数主要的功能是初始化应用程序的环境,各种全局对象,并准备main/WinMain的参数.当main/WinMain结束时,返回到CRT的代码后,它还要做各种清理工作.