Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 反汇编并使用.obj文件_Visual Studio 2008_Assembly_Disassembly_Ida_.obj - Fatal编程技术网

Visual studio 2008 反汇编并使用.obj文件

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

我在大学里有一门课程(逆向工程),我有一个家庭作业。 我得到了一个.obj文件(它是用VisualStudio2008编译的),我必须对它进行反汇编,找出控制结构并在一个小c程序中调用它

我使用了IDA反编译器,下面是asm代码:

_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;
}