Visual studio 2008 反汇编并使用.obj文件
我在大学里有一门课程(逆向工程),我有一个家庭作业。 我得到了一个.obj文件(它是用VisualStudio2008编译的),我必须对它进行反汇编,找出控制结构并在一个小c程序中调用它 我使用了IDA反编译器,下面是asm代码:Visual studio 2008 反汇编并使用.obj文件,visual-studio-2008,assembly,disassembly,ida,.obj,Visual Studio 2008,Assembly,Disassembly,Ida,.obj,我在大学里有一门课程(逆向工程),我有一个家庭作业。 我得到了一个.obj文件(它是用VisualStudio2008编译的),我必须对它进行反汇编,找出控制结构并在一个小c程序中调用它 我使用了IDA反编译器,下面是asm代码: _FB3: 00000000: 55 push ebp 00000001: 56 push esi 00000002: 57 pus
_FB3:
00000000: 55 push ebp
00000001: 56 push esi
00000002: 57 push edi
00000003: 8B 7C 24 10 mov edi,dword ptr [esp+10h]
00000007: 83 3F 00 cmp dword ptr [edi],0
0000000A: 74 79 je 00000085
0000000C: 8D 64 24 00 lea esp,[esp]
00000010: 8B 2F mov ebp,dword ptr [edi]
00000012: 8B 75 00 mov esi,dword ptr [ebp]
00000015: 8B 44 24 14 mov eax,dword ptr [esp+14h]
00000019: 8B CE mov ecx,esi
0000001B: EB 03 jmp 00000020
0000001D: 8D 49 00 lea ecx,[ecx]
00000020: 8A 10 mov dl,byte ptr [eax]
00000022: 3A 11 cmp dl,byte ptr [ecx]
00000024: 75 1A jne 00000040
00000026: 84 D2 test dl,dl
00000028: 74 12 je 0000003C
0000002A: 8A 50 01 mov dl,byte ptr [eax+1]
0000002D: 3A 51 01 cmp dl,byte ptr [ecx+1]
00000030: 75 0E jne 00000040
00000032: 83 C0 02 add eax,2
00000035: 83 C1 02 add ecx,2
00000038: 84 D2 test dl,dl
0000003A: 75 E4 jne 00000020
0000003C: 33 C0 xor eax,eax
0000003E: EB 05 jmp 00000045
00000040: 1B C0 sbb eax,eax
00000042: 83 D8 FF sbb eax,0FFFFFFFFh
00000045: 85 C0 test eax,eax
00000047: 7D 05 jge 0000004E
00000049: 8D 7D 0C lea edi,[ebp+0Ch]
0000004C: EB 32 jmp 00000080
0000004E: 8B 44 24 14 mov eax,dword ptr [esp+14h]
00000052: 8B CE mov ecx,esi
00000054: 8A 10 mov dl,byte ptr [eax]
00000056: 3A 11 cmp dl,byte ptr [ecx]
00000058: 75 1A jne 00000074
0000005A: 84 D2 test dl,dl
0000005C: 74 12 je 00000070
0000005E: 8A 50 01 mov dl,byte ptr [eax+1]
00000061: 3A 51 01 cmp dl,byte ptr [ecx+1]
00000064: 75 0E jne 00000074
00000066: 83 C0 02 add eax,2
00000069: 83 C1 02 add ecx,2
0000006C: 84 D2 test dl,dl
0000006E: 75 E4 jne 00000054
00000070: 33 C0 xor eax,eax
00000072: EB 05 jmp 00000079
00000074: 1B C0 sbb eax,eax
00000076: 83 D8 FF sbb eax,0FFFFFFFFh
00000079: 85 C0 test eax,eax
0000007B: 7E 1E jle 0000009B
0000007D: 8D 7D 08 lea edi,[ebp+8]
00000080: 83 3F 00 cmp dword ptr [edi],0
00000083: 75 8B jne 00000010
00000085: 6A 10 push 10h
00000087: E8 00 00 00 00 call _malloc
0000008C: 83 C4 04 add esp,4
0000008F: 89 07 mov dword ptr [edi],eax
00000091: 85 C0 test eax,eax
00000093: 75 14 jne 000000A9
00000095: 5F pop edi
00000096: 5E pop esi
00000097: 33 C0 xor eax,eax
00000099: 5D pop ebp
0000009A: C3 ret
0000009B: 8B C5 mov eax,ebp
0000009D: FF 40 04 inc dword ptr [eax+4]
000000A0: 5F pop edi
000000A1: 5E pop esi
000000A2: B8 01 00 00 00 mov eax,1
000000A7: 5D pop ebp
000000A8: C3 ret
000000A9: 8B 74 24 14 mov esi,dword ptr [esp+14h]
000000AD: 8B C6 mov eax,esi
000000AF: 8D 50 01 lea edx,[eax+1]
000000B2: 8A 08 mov cl,byte ptr [eax]
000000B4: 40 inc eax
000000B5: 84 C9 test cl,cl
000000B7: 75 F9 jne 000000B2
000000B9: 2B C2 sub eax,edx
000000BB: 40 inc eax
000000BC: 50 push eax
000000BD: E8 00 00 00 00 call _malloc
000000C2: 8B 0F mov ecx,dword ptr [edi]
000000C4: 89 01 mov dword ptr [ecx],eax
000000C6: 8B 07 mov eax,dword ptr [edi]
000000C8: 83 C4 04 add esp,4
000000CB: 83 38 00 cmp dword ptr [eax],0
000000CE: 74 C5 je 00000095
000000D0: 8B 10 mov edx,dword ptr [eax]
000000D2: 8B CE mov ecx,esi
000000D4: 8A 01 mov al,byte ptr [ecx]
000000D6: 88 02 mov byte ptr [edx],al
000000D8: 41 inc ecx
000000D9: 42 inc edx
000000DA: 84 C0 test al,al
000000DC: 75 F6 jne 000000D4
000000DE: 8B 17 mov edx,dword ptr [edi]
000000E0: C7 42 04 01 00 00 mov dword ptr [edx+4],1
00
000000E7: 8B 07 mov eax,dword ptr [edi]
000000E9: C7 40 08 00 00 00 mov dword ptr [eax+8],0
00
000000F0: 8B 0F mov ecx,dword ptr [edi]
000000F2: 5F pop edi
000000F3: 5E pop esi
000000F4: C7 41 0C 00 00 00 mov dword ptr [ecx+0Ch],0
00
000000FB: B8 01 00 00 00 mov eax,1
00000100: 5D pop ebp
00000101: C3 ret
IDA还为我打造了一个不错的控制结构:
如您所见,代码如下所示:
for(...)
{
for1(...){...}
...
for1(...){...}
}
malloc
....
for3() ...
malloc
...
for2(...)
{
...
}
#include <stdio.h>
extern int FB3(void** root, const char *text);
int main(void)
{
void* root = NULL;
int i = FB3(&root, "e3y");
printf("%p %d", root, i);
return 0;
}
据我所知,for1和for2的结构几乎相同,只是活动不同,for3实现的功能与for1和for2一样位于functionfamily中。
for3使用第二个malloc的结果作为参数,因此我认为for2应该是某种数组复制循环。
for1、for2和for3是已知的stdc内联实现
有人能帮我弄清楚这个f3函数的用途吗
第二个问题:如何在一个示例C程序中使用这个.obj文件?
如何在VS中调用它的函数
提前感谢,感谢您的帮助
更新:
杰斯特:有趣。您是如何知道节点的结构的?
我仍在努力(在你的帮助下)弄明白这整件事,但还没有
我发现,IDA反汇编程序有一个伪代码查看功能。
以下是伪代码:
signed int\uu cdecl FB3(int a1,const char*a2)
{
int v2;//edi@1
常量字符**v3;//ebp@2
void*v4;//eax@7
带符号整数结果;//eax@8
int v6;//edx@11
常量字符*v7;//ecx@11
常量字符v8;//al@12
v2=a1;
而(*(_DWORD*)v2)
{
v3=*(常量字符***)v2;
如果(strcmp(a2,**(常量字符***)v2)>=0)
{
如果(strcmp(a2,**(const char***)v2)快速浏览,这似乎是一个用于计算字符串出现次数的二叉树。树节点如下所示:
const char* text;
int count;
node* left;
node* right;
函数本身是intaddstring(节点**root,常量char*text)
首先,代码检查树是否为空,如果为空,则跳过搜索。
搜索从0x10开始,执行if(strcmp(current->text,text)>0)current=current->right;
并循环返回。此代码看起来没有优化,在0x4E它执行相同的比较,这次检查<0
,然后向左。在0x9B是“found”分支,它递增计数器并返回1
如果找不到文本,将在0x85处创建一个新节点,将其插入树中,并使用strdup
(实现为malloc(strlen())
+strcpy
)将文本复制到树中。新节点的左
和右
都设置为空
,并且计数
设置为1
更新:节点大小为16字节,这可以从malloc
调用中看到。偏移量0用于比较文本,因此它必须是文本。偏移量4递增,因此它必须是计数器。偏移量8和12是两个子指针,因为它们是这样使用的
IDA提出的原型毫无意义,第一个参数必须是指针,否则它会爆炸。此外,C区分大小写,所以请尝试使用FB3(大写)。
大概是这样的:
for(...)
{
for1(...){...}
...
for1(...){...}
}
malloc
....
for3() ...
malloc
...
for2(...)
{
...
}
#include <stdio.h>
extern int FB3(void** root, const char *text);
int main(void)
{
void* root = NULL;
int i = FB3(&root, "e3y");
printf("%p %d", root, i);
return 0;
}
#包括
外部输入FB3(无效**根,常量字符*文本);
内部主(空)
{
void*root=NULL;
int i=FB3(&root,“e3y”);
printf(“%p%d”,根,i);
返回0;
}
如果可以的话,你可以继续添加节点结构,这样你就可以遍历并打印C中的树。我对上面的问题做了一些修改,请检查。谢谢。很好,它现在已经生成了。你确定,它一定是节点**?因为它现在对我有效(未处理的例外)。我更新了我的帖子,你可以看到结果。是的,它必须是节点**
。它只是意外地对你起作用,因为你分配了一个节点(你不应该这样做)然后将count
设置为0。FB3
将使用count
作为根。如果打印root->count
,您应该能够看到。此外,返回值不是count
。这只是成功(1)/失败(0)内存分配指示。我已经在答案中给了您代码。您不必分配任何东西,FB3
将执行此操作。您只需将root
(类型为node*
)设置为NULL
,并传递root
(因此将属于node**
)的地址我想剩下的唯一问题是结构。在所有节点中,计数都是相同的(我认为是非常大的int,内存垃圾),并且const char*text是错误的指针。感谢所有帮助。
#include <stdio.h>
extern int FB3(void** root, const char *text);
int main(void)
{
void* root = NULL;
int i = FB3(&root, "e3y");
printf("%p %d", root, i);
return 0;
}