C 和 x86 asm 之间的链接

逆向工程 部件 x86
2021-06-23 10:02:24

我想知道如何将这些指令(直到注册细节)链接到原始 C 代码。变量在哪里(无论是局部变量、全局变量、静态变量还是函数参数),以及变量的大小(如果适用):

mov     DWORD PTR [ebp-0x4], 0x8    //DWORD PTR [ebp-0x4]-Global variable
mov     eax, DWORD PTR [ebp+0x8]    // DWORD PTR [ebp+0x8]  global V
lea     eax, [ecx + eax*1]
call    _htons
cmp     [ebp+0x8], 0
ret

这是我的 C 代码:

#include <stdio.h>

int my_global_var ;

int main() { 
    i = 8;
    my_global_var = htons(i);    
} 
1个回答

i=8; 这是您的本地函数main
这个是在拆开的指令引用的

a) mov     DWORD PTR [ebp-0x4], 0x8  <-- i local variable

指令b引用my_global_var

b) mov     eax, DWORD PTR [ebp+0x8]

在普通函数范围内,所有低于 ebp (ebp-4,ebp-8,ebp-100) 等的地址都是局部变量访问

ebp 以上的所有地址(ebp+8、ebp+1c、ebp + 256)等访问传递给函数的参数或函数外部可见的其他全局变量

发布的 ecx 未定义,您可能没有粘贴推送指令,_htons()使用 u_short 而不是 int

u_short WSAAPI htons(
  _In_ u_short hostshort
);

你应该发布一个带有代码或反汇编的正确查询,任何人都可以轻松重现以获得正确的答案

编译并产生结果的代码如下所示

#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")

int my_global_var ;

int main()
{ 
    u_short i = 8;
    my_global_var = htons(i); 
    printf("%d\n" , my_global_var);    
} 

您应该始终在尽可能多的警告下进行编译,并尽可能让编译器进行代码分析以减少缺陷

如果您使用的是 Visual Studio,则应复制此命令行或使用反映项目中这些开关的适当设置

cl /Zi /Od /W4 /analyze:log foo.txt htons.cpp /link /RELEASE

W4使警告的最高水平/分析:日志foo.txt的做了代码分析,并显示在您的代码有什么可能的缺陷

cat foo.txt
<?xml version="1.0" encoding="UTF-8"?>
<DEFECTS></DEFECTS>

编译并执行这应该产生2048 或 0x800结果

_htons 基本上就是做这个操作

0:000> ?? 8 << 0x8 | 8 >> 0x8
int 0x800
0:000> .enable_long_status 0
0:000> ?? 8 << 0x8 | 8 >> 0x8
int 0n2048

相关反汇编本地/全局变量的范围和内容如下

当前 src 行

0:000> lsa .
     6: 
     7: int main()
     8: { 
     9:     u_short i = 8;
>   10:     my_global_var = htons(i); 
    11:     printf("%d\n" , my_global_var);    
    12: } 

函数main的反汇编

0:000> uf .
htons!main [c:\xxx\htons.cpp @ 8]:
    8 00861000 55              push    ebp
    8 00861001 8bec            mov     ebp,esp
    8 00861003 51              push    ecx
    9 00861004 b808000000      mov     eax,8
    9 00861009 668945fc        mov     word ptr [ebp-4],ax
   10 0086100d 0fb74dfc        movzx   ecx,word ptr [ebp-4]
   10 00861011 51              push    ecx
   10 00861012 e8b9000000      call    htons!htons (008610d0)
   10 00861017 0fb7d0          movzx   edx,ax
   10 0086101a 891578488a00    mov     dword ptr [htons!my_global_var (008a4878)],edx
   11 00861020 a178488a00      mov     eax,dword ptr [htons!my_global_var (008a4878)]
   11 00861025 50              push    eax
   11 00861026 68b0b18900      push    offset htons!__xt_z+0x10 (0089b1b0)
   11 0086102b e860000000      call    htons!printf (00861090)
   11 00861030 83c408          add     esp,8
   12 00861033 33c0            xor     eax,eax
   12 00861035 8be5            mov     esp,ebp
   12 00861037 5d              pop     ebp
   12 00861038 c3              ret

本地我

0:000> dv /v /t
0016fc10          unsigned short i = 8

全球的

0:000> dt /v /t my_global_var
Got address 008a4878 for symbol
htons!my_global_var
0n0