当前位置:文档之家› 提取及反汇编函数

提取及反汇编函数

提取及反汇编函数
提取及反汇编函数

提取及反汇编函数

Hcper @ 2012年12月8日星期六

在调试过程中有时候会遇到一些函数,它在汇编的情况下难以理解。如果用IDA 的HexRay插件是可以转化难以理解的汇编码为C代码。但是,有时候又没必要反汇编整个文件,如果文件比较小还好说,一兆以上往往要花费很多时间,而且大多数时候是做无用功的。

如果能够把要分析的函数代码拷出来为一个单独的二进制文件,用IDA在函数实际的地址上建立段,并建立函数,然后用HexRay插件反成C代码,这样就可以很好的分析函数了。

下面用一个例子说明,分析的是一个mshtml.dll里面的一个函数。

这个mshtml.dll文件很大,如果用IDA反汇编整个文件估计要花很多时间。

如果我们只分析其中的一个函数,那就没必要分析整个文件,我们用windbg附加到那个进程,把要分析的函数二进制码导出到单独的文件里,qd安全退出。然后用IDA按以上方法分析即可。

要反汇编的函数调用结构大概如下:

0:000> uf /c 3dea0a43

mshtml!IERegisterXMLNS+0x9bf59 (3dea0a43)

mshtml!IERegisterXMLNS+0x9bf70 (3dea0a5a):

call to mshtml!DllGetClassObject+0x8d36b (3db2a740)

mshtml!IERegisterXMLNS+0x9bf7e (3dea0a68):

call to mshtml!DllGetClassObject+0x888e0 (3db25cb5)

mshtml!IERegisterXMLNS+0x9bfa0 (3dea0a8a):

call to mshtml!CreateHTMLPropertyPage+0x42b05 (3ddd16ef)

在windbg下用uf反汇编看看

0:000> uf 3dea0a43

mshtml!IERegisterXMLNS+0x9bf59:

3dea0a43 8bff mov edi,edi //这里是函数开头

3dea0a45 55 push ebp

3dea0a46 8bec mov ebp,esp

3dea0a48 8b08 mov ecx,dword ptr [eax]

3dea0a4a 53 push ebx

3dea0a4b 8b5d08 mov ebx,dword ptr [ebp+8]

3dea0a4e 57 push edi

3dea0a4f 8bc1 mov eax,ecx

3dea0a51 83e00f and eax,0Fh

3dea0a54 8d7e18 lea edi,[esi+18h]

3dea0a57 50 push eax

3dea0a58 890f mov dword ptr [edi],ecx

3dea0a5a e8e19cc8ff call mshtml!DllGetClassObject+0x8d36b (3db2a740)

3dea0a5f 85c0 test eax,eax

3dea0a61 7411 je mshtml!IERegisterXMLNS+0x9bf8a (3dea0a74)

mshtml!IERegisterXMLNS+0x9bf79:

3dea0a63 6a08 push 8

3dea0a65 57 push edi

3dea0a66 8bc3 mov eax,ebx

3dea0a68 e84852c8ff call mshtml!DllGetClassObject+0x888e0 (3db25cb5)

3dea0a6d 895e04 mov dword ptr [esi+4],ebx

3dea0a70 891e mov dword ptr [esi],ebx

3dea0a72 eb2a jmp mshtml!IERegisterXMLNS+0x9bfb4 (3dea0a9e)

mshtml!IERegisterXMLNS+0x9bf8a:

3dea0a74 837d1001 cmp dword ptr [ebp+10h],1

3dea0a78 7415 je mshtml!IERegisterXMLNS+0x9bfa5 (3dea0a8f)

mshtml!IERegisterXMLNS+0x9bf90:

3dea0a7a 8bc1 mov eax,ecx

3dea0a7c c1f804 sar eax,4

3dea0a7f 99 cdq

3dea0a80 6a64 push 64h

3dea0a82 59 pop ecx

3dea0a83 f7f9 idiv eax,ecx

3dea0a85 57 push edi

3dea0a86 99 cdq

3dea0a87 f77d10 idiv eax,dword ptr [ebp+10h]

3dea0a8a e8600cf3ff call mshtml!CreateHTMLPropertyPage+0x42b05 (3ddd16ef)

mshtml!IERegisterXMLNS+0x9bfa5:

3dea0a8f 8b450c mov eax,dword ptr [ebp+0Ch]

3dea0a92 c70601000000 mov dword ptr [esi],1

3dea0a98 8b4010 mov eax,dword ptr [eax+10h]

3dea0a9b 894604 mov dword ptr [esi+4],eax

mshtml!IERegisterXMLNS+0x9bfb4:

3dea0a9e 5f pop edi

3dea0a9f 895e08 mov dword ptr [esi+8],ebx

3dea0aa2 5b pop ebx

3dea0aa3 5d pop ebp

3dea0aa4 c20c00 ret 0Ch //这里是函数结尾,注意最后字节地址不等于行首地址!

在windbg下用.writemem导出该段函数代码

0:000> .writemem d:\temp\test.bin 3dea0a43 3dea0aa6

然后用IDA打开test.bin设定载入的偏移为函数原来的地址0x3dea0a43。

进入后在函数开头按C则建立段分析出汇编码。

再建立函数即可。

如果要反成C则按F5即可,这里反成如下:

int __userpurge sub_3DEA0A43(int a1, int a2, int a3, int a4, signed int a5) {

int v5; // edx@1

signed int v6; // ecx@1

int v7; // ebx@1

int result; // eax@2

int v9; // ST04_4@1

int v10; // eax@5

v7 = a3;

v9 = *(_DWORD *)a1 & 0xF;

*(_DWORD *)(a2 + 24) = *(_DWORD *)a1;

if ( v3db2a740(v9) )

{

result = v3db25cb5(v7, v5, v6);

*(_DWORD *)(a2 + 4) = v7;

*(_DWORD *)a2 = v7;

}

else

{

if ( a5 != 1 )

v3ddd16ef((v6 >> 4) / 100 / a5, (v6 >> 4) / 100 % a5, 100, a2 + 24);

v10 = a4;

*(_DWORD *)a2 = 1;

result = *(_DWORD *)(v10 + 16);

*(_DWORD *)(a2 + 4) = result;

}

*(_DWORD *)(a2 + 8) = v7;

return result;

}

如果汇编码不是函数结构的话,这里会反不成C代码。

相关主题
文本预览
相关文档 最新文档