ASM转C语言 - 有人能解释一下这是什么结构吗?

4

我有以下的ASM代码(OllyDbg),其中应该包含了一个在C语言中开发的结构体。可以有人告诉我这个结构体在C语言编程中是如何看起来的吗?最好能简单解释一下你是如何判断这个结构体中存储了什么内容以及它们存储在哪里等等...

非常感谢!

CPU Disasm
Address   Hex dump          Command                           Comments
6A27F058  /$  68 E9A6286A   PUSH 6A28A6E9                     ; Entry point
6A27F05D  |.  64:FF35 00000 PUSH DWORD PTR FS:[0]
6A27F064  |.  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
6A27F068  |.  896C24 10     MOV DWORD PTR SS:[ESP+10],EBP
6A27F06C  |.  8D6C24 10     LEA EBP,[ESP+10]
6A27F070  |.  2BE0          SUB ESP,EAX
6A27F072  |.  53            PUSH EBX
6A27F073  |.  56            PUSH ESI
6A27F074  |.  57            PUSH EDI
6A27F075  |.  A1 E067336A   MOV EAX,DWORD PTR DS:[6A3367E0]
6A27F07A  |.  3145 FC       XOR DWORD PTR SS:[EBP-4],EAX
6A27F07D  |.  33C5          XOR EAX,EBP
6A27F07F  |.  50            PUSH EAX
6A27F080  |.  8965 E8       MOV DWORD PTR SS:[EBP-18],ESP
6A27F083  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]
6A27F086  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
6A27F089  |.  C745 FC FEFFF MOV DWORD PTR SS:[EBP-4],-2
6A27F090  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
6A27F093  |.  8D45 F0       LEA EAX,[EBP-10]
6A27F096  |.  64:A3 0000000 MOV DWORD PTR FS:[0],EAX
6A27F09C  \.  C3            RETN

为了证明我说的是真的...这个结构由三个int成员组成。但是在ollydbg的这个片段中,我无法弄清楚它们的含义。 - Chuck Bartovski
代码是做什么的?ASM 显示编译后的代码,没有数据结构。有时你可以从 ASM 推断出结构体,但往往不容易。 - Kijewski
它是使用Visual Studio 2012 Ultimate RC在“发布配置”下编译的。 - Chuck Bartovski
你遇到麻烦的部分是,似乎你声明了一个结构体的实例作为局部变量,然后对它进行了修改。没有调试信息,这很难与分配一堆本地变量区分开来,这些变量恰好按照你的结构体顺序排列。结构体通常通过地址传递,使得更容易找到/看到它们的分组,因为它们都通过特定指针/地址间接加载/存储。 - Joe
除了那个-2之外,我看不到任何常量加载。所有这些推送操作都没有弹出操作,除了ESP减法操作,这让我再次渴望使用ARM汇编语言。我猜这是在堆栈上分配信息并通过返回方式返回的,因为有所有这些未成对的堆栈操作,但如果没有更多上下文,很难确定。 - Michael Dorgan
显示剩余3条评论
3个回答

7

这个函数__SEH_prolog4是一个编译器助手,用于设置每个函数的异常处理程序。以下是来自库(RunTmChk.lib/sehprolg4.obj)的列表:

.text:00000000                   __SEH_prolog4   proc near
.text:00000000
.text:00000000                   arg_4           = dword ptr  8
.text:00000000
.text:00000000 68 60 00 00 00      push    offset __except_handler4
.text:00000005 64 FF 35 00 00 00+  push    large dword ptr fs:0
.text:0000000C 8B 44 24 10         mov     eax, [esp+8+arg_4]
.text:00000010 89 6C 24 10         mov     [esp+8+arg_4], ebp
.text:00000014 8D 6C 24 10         lea     ebp, [esp+8+arg_4]
.text:00000018 2B E0               sub     esp, eax
.text:0000001A 53                  push    ebx
.text:0000001B 56                  push    esi
.text:0000001C 57                  push    edi
.text:0000001D A1 64 00 00 00      mov     eax, ds:___security_cookie
.text:00000022 31 45 FC            xor     [ebp-4], eax
.text:00000025 33 C5               xor     eax, ebp
.text:00000027 50                  push    eax
.text:00000028 89 65 E8            mov     [ebp-18h], esp
.text:0000002B FF 75 F8            push    dword ptr [ebp-8]
.text:0000002E 8B 45 FC            mov     eax, [ebp-4]
.text:00000031 C7 45 FC FE FF FF+  mov     dword ptr [ebp-4], 0FFFFFFFEh
.text:00000038 89 45 F8            mov     [ebp-8], eax
.text:0000003B 8D 45 F0            lea     eax, [ebp-10h]
.text:0000003E 64 A3 00 00 00 00   mov     large fs:0, eax
.text:00000044 C3                  retn
.text:00000044                   __SEH_prolog4   endp

更多详细信息请点击这里

这不是程序员编写的代码,你正在看错地方。


1
你是怎么得出这个结论的?你只是识别了 OP 的汇编代码作为 SEH_prolog,还是 OP 帖子中的汇编代码给了你一些见解? - vincentleest
1
这是一个非常著名的函数。任何软件逆向工程师都会认识它。(提到security_cookie就是一个明显的线索) - ker2x

2

如果这确实是您的代码,您可以通过在CPU窗口右键单击,进入注释子菜单并选择显示源代码来使OllyDbg显示相应的C代码。要使其工作,您需要与可执行文件相关的pdb文件。

我不确定Olly1.X是否已经支持此功能,但2.X版本肯定能够实现。


我在与exe相同的文件夹中有pdb文件,但是一旦我选择显示源代码,所有注释都被删除,没有代码出现。我正在使用最新的OllyDbg 2.01 alpha 4版本。 - Chuck Bartovski
好的,知道了。我看到三个 mov 操作。 - Chuck Bartovski
1
我猜你得把pdb文件保留在编译器生成的位置,因为完整的pdb路径已经包含在二进制文件中了,所以Olly会在最初写入pdb文件的地方搜索。 - athre0z

1

我不是很确定,因为我已经有一段时间没有看过C/ASM了。但是在浏览后,这里有一些想法。请记住,我不会过分依赖它,但它可能会有所帮助。

看着这段汇编代码:

6A27F07F  |.  50            PUSH EAX
6A27F080  |.  8965 E8       MOV DWORD PTR SS:[EBP-18],ESP
6A27F083  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]
6A27F086  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
6A27F089  |.  C745 FC FEFFF MOV DWORD PTR SS:[EBP-4],-2
6A27F090  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
6A27F093  |.  8D45 F0       LEA EAX,[EBP-10]

根据帧指针偏移量,我猜测该结构包含2个INT和1个LONG或DOUBLE。

不幸的是,我目前对X86不够熟练,无法给您更好的澄清。再次强调,我不能过于依赖这个猜测,因为我可能完全错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接