背景知识
什么是特征码
特征码必须是某类或某个唯一的,比如,人具有思考的功能,但是所有人都具有,所以这只是人的特征。但是如果要找具体某个人,那么需要分析这个人具有哪些信息,如面部有疤痕,身高2米,长期活动范围等等。
那么反过来,需要找一个call的特征,那么要知道该功能具有什么信息。
在逆向工程中特征其实就是汇编指令对应的十六进制机器码,如:59 89 4D F8 6A 00 6A 00
,对应的汇编代码就是:
59 pop ecx
894D F8 mov [local.2],ecx
6A 00 push 0x0
6A 00 push 0x0
通过分析前篇test程序:
015D3EA0 /> \55 push ebp ; 这里是test call
015D3EA1 |. 8BEC mov ebp,esp
015D3EA3 |. 81EC CC000000 sub esp,0xCC
015D3EA9 |. 53 push ebx
015D3EAA |. 56 push esi
015D3EAB |. 57 push edi
015D3EAC |. 51 push ecx
015D3EAD |. 8DBD 34FFFFFF lea edi,[local.51]
015D3EB3 |. B9 33000000 mov ecx,0x33
015D3EB8 |. B8 CCCCCCCC mov eax,0xCCCCCCCC
015D3EBD |. F3:AB rep stos dword ptr es:[edi]
015D3EBF |. 59 pop ecx ; test.01648053
015D3EC0 |. 894D F8 mov [local.2],ecx
015D3EC3 |. 6A 00 push 0x0
015D3EC5 |. 6A 00 push 0x0
015D3EC7 |. 68 0C60C601 push test.01C6600C ; UNICODE "test"
015D3ECC |. 8B4D F8 mov ecx,[local.2]
015D3ECF |. E8 95D2FCFF call test.015A1169 ; call test1111
015D3ED4 |. 5F pop edi ; test.01648053
015D3ED5 |. 5E pop esi ; test.01648053
015D3ED6 |. 5B pop ebx ; test.01648053
015D3ED7 |. 81C4 CC000000 add esp,0xCC
015D3EDD |. 3BEC cmp ebp,esp
015D3EDF |. E8 997EFBFF call test.0158BD7D
015D3EE4 |. 8BE5 mov esp,ebp
015D3EE6 |. 5D pop ebp ; test.01648053
015D3EE7 \. C3 retn
=====================华丽的分割线==================
015D3E40 /> \55 push ebp ; 这里是 test2 call
015D3E41 |. 8BEC mov ebp,esp
015D3E43 |. 81EC CC000000 sub esp,0xCC
015D3E49 |. 53 push ebx
015D3E4A |. 56 push esi
015D3E4B |. 57 push edi
015D3E4C |. 51 push ecx
015D3E4D |. 8DBD 34FFFFFF lea edi,[local.51]
015D3E53 |. B9 33000000 mov ecx,0x33
015D3E58 |. B8 CCCCCCCC mov eax,0xCCCCCCCC
015D3E5D |. F3:AB rep stos dword ptr es:[edi]
015D3E5F |. 59 pop ecx ; test.015D20AB
015D3E60 |. 894D F8 mov [local.2],ecx
015D3E63 |. 6A 00 push 0x0
015D3E65 |. 6A 00 push 0x0
015D3E67 |. 68 1860C601 push test.01C66018 ; UNICODE "test2"
015D3E6C |. 8B4D F8 mov ecx,[local.2]
015D3E6F |. E8 F5D2FCFF call test.015A1169 ; call test2
015D3E74 |. 5F pop edi ; test.015D20AB
015D3E75 |. 5E pop esi ; test.015D20AB
015D3E76 |. 5B pop ebx ; test.015D20AB
015D3E77 |. 81C4 CC000000 add esp,0xCC
015D3E7D |. 3BEC cmp ebp,esp
015D3E7F |. E8 F97EFBFF call test.0158BD7D
015D3E84 |. 8BE5 mov esp,ebp
015D3E86 |. 5D pop ebp ; test.015D20AB
015D3E87 \. C3 retn
发现两个程序几乎一模一样,就参数不一样。 这个时候就需要往上一层分析他们不一样并具有唯一性的特征(一般特征都是自底向上)。因为这里函数功能都一样,所以上层跟call内部一样,只有参数不一样,但是68 1860C601 push test.01C66018
这部分是动态变化的,所以不能作为特征码。像这种情况是很少的,所以在记录特征码时这里可以以分类的方式记录。也就是找到的都是同一种功能。
特征就是:
59 89 4D F8 6A 00 6A 00