程序集主函数中发生了什么?

逆向工程 拆卸 部件 x86 恶意软件 idapro-sdk
2021-06-29 10:30:44

我目前正在使用 IDA Pro(免费版)检查 WinXP VM 中的 32 位恶意软件可执行文件。我不明白这里的主要功能发生了什么。

我应该在哪里设置断点(IDA Pro,OllyDbg)以查看调试时实际压入堆栈的变量内容?我之前在偏移量00401230(开始 main)和004012C6(结束 main)处设置了一个断点,但是在观察 OllyDbg 中的例如堆栈窗格时,我并没有真正看到字符串(变量值)出现。我不确定我做错了什么。

在 OllyDbg 中打开字符串窗口,我可以看到一些字符串 - 我假设,将在 main 的函数调用中使用,包括szServerNameszPassword

正如我们所见,在 内调用了三个函数main

sub_401000(称为 7x;Pastebin)

sub_401170(称为 1x;Pastebin)

sub_401090(称为 1x;Pastebin)

旁注: 考虑到反馈,我决定在 Pastebin 中发布其他功能(见上面的链接)。在这里只发布主要功能,让我保持帖子简洁。

.text:00401230                   proc            _main near              ; CODE XREF: ___tmainCRTStartup+15Ap 
.text:00401230                                                           ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401230                   argc            = dword ptr  8    
.text:00401230                   argv            = dword ptr  0Ch
.text:00401230                   envp            = dword ptr  10h
.text:00401230
.text:00401230 55                                push    ebp
.text:00401231 8B EC                             mov     ebp, esp
.text:00401233 68 C0 B9 40 00                    push    offset szServerName 
.text:00401238 68 00 A0 40 00                    push    offset unk_40A000   
.text:0040123D E8 BE FD FF FF                    call    sub_401000          
.text:00401242 83 C4 08                          add     esp, 8
.text:00401245 68 C0 B3 40 00                    push    offset szUserName  
.text:0040124A 68 00 A1 40 00                    push    offset unk_40A100  
.text:0040124F E8 AC FD FF FF                    call    sub_401000                     
.text:00401254 83 C4 08                          add     esp, 8
.text:00401257 68 C0 BF 40 00                    push    offset szPassword  
.text:0040125C 68 00 A2 40 00                    push    offset unk_40A200
.text:00401261 E8 9A FD FF FF                    call    sub_401000
.text:00401266 83 C4 08                          add     esp, 8
.text:00401269 68 C0 B7 40 00                    push    offset szLocalFile 
.text:0040126E 68 08 A3 40 00                    push    offset unk_40A308
.text:00401273 E8 88 FD FF FF                    call    sub_401000
.text:00401278 83 C4 08                          add     esp, 8
.text:0040127B 68 C0 BB 40 00                    push    offset unk_40BBC0  
.text:00401280 68 08 A4 40 00                    push    offset unk_40A408  
.text:00401285 E8 76 FD FF FF                    call    sub_401000
.text:0040128A 83 C4 08                          add     esp, 8
.text:0040128D 68 C0 BD 40 00                    push    offset unk_40BDC0
.text:00401292 68 08 A5 40 00                    push    offset unk_40A508
.text:00401297 E8 64 FD FF FF                    call    sub_401000
.text:0040129C 83 C4 08                          add     esp, 8
.text:0040129F 68 C0 C1 40 00                    push    offset szRemoteFile
.text:004012A4 68 08 A6 40 00                    push    offset unk_40A608
.text:004012A9 E8 52 FD FF FF                    call    sub_401000
.text:004012AE 83 C4 08                          add     esp, 8
.text:004012B1 68 C0 B7 40 00                    push    offset szLocalFile ; lpszLocalFile
.text:004012B6 E8 B5 FE FF FF                    call    sub_401170
.text:004012BB 83 C4 04                          add     esp, 4
.text:004012BE E8 CD FD FF FF                    call    sub_401090
.text:004012C3 33 C0                             xor     eax, eax
.text:004012C5 5D                                pop     ebp
.text:004012C6 C3                                retn
.text:004012C6                   endp            _main

我很感激任何帮助我理解主要功能的指示和解释。

2个回答

您为 sub 401000 发布的反汇编不完整

这是一个有限的解释,
它检查提供的缓冲区(第一个空终止符的第一次调用中的 0x40A000)
并可能将其解密,并将解密后的字符串 memcpy() 到 szUserName

(您的帖子中缺少该部分(在 jz 路径 0x401025 之后发生的所有事情)

看看反汇编它说它需要两个参数 arg_0 和 arg_4

所以第一次调用这个函数的两个参数是

push    offset szServerName  << this is a pointer to a string
push    offset unk_40A000    << this is some address that ida isn't sure of
call    sub_401000           << calls the functions

所以在通话中

它将计数器 (ebp+var4) 或 (ebp-4)
初始化为 0它将 eax 初始化为 arg_0 或 ebp+8 =>0x40A000 用于第一次调用
采用此地址 0x40a000 + 计数器 (0,1,2,3, ....n...) 到 ecx
并检查 \x0 并循环直到找到 \x0
发现空终止符时它跳转到 0x401025(缺失部分)

我建议从 main() 的开头开始,就像你一样,单步执行每条指令。在 OllyDbg 中,单步进入的按键绑定是 F7。每次按 F7 时,调试器都会执行一条指令,您可以查看堆栈(右下窗格)和寄存器(右上窗格),了解它们是如何受到您刚刚执行的指令的影响的. 请记住,OllyDbg 中突出显示的指令是按下 F7 时要执行下一条指令。此外,当您想跳过 CALL(例如 API 调用)时,请使用 F8 来“跳过”指令而不是进入。

如果您正在寻找软件逆向工程和恶意软件分析的介绍材料,OpenSecurityTraining.info可能会有所帮助。完全披露:我为该网站做出了贡献。您可以在该网站上关注此课程进度:

  1. 英特尔 x86 简介
  2. (可选)中级 Intel x86
  3. (可选)二进制文件的生命周期
  4. 逆向工程软件简介
  5. (可选)恶意软件动态分析
  6. 逆向工程恶意软件

如果你对编程完全陌生,那么你应该从一个很好的 C 编程入门在线课程开始,尤其是基本的数据结构和算法。