本帖最后由 玉面飞龙之王 于 2020-9-17 11:49 编辑
seg000:004D51CA lea esi, [edi+84h]
;esi 指向[edi+84h],edi+84h 处是什么呢?去 004D5028 + 0x84 处看一下,结果发现有 K e r n e l ;等字符。貌似这里 esi 指向字符串,而且还是系统 dll 名称。不妨直接把 004D50AC 处开始;的区域转换为字符串看看。不断地使用 A 键,结果如下:
;seg000:004D50AC aKernel32_dll db 'Kernel32.dll',0
;seg000:004D50B9 aGettemppatha db 'GetTempPathA',0
;seg000:004D50C6 aGettempfilenam db 'GetTempFileNameA',0
;seg000:004D50D7 aCreatefilea db 'CreateFileA',0
;seg000:004D50E3 aReadfile db 'ReadFile',0
;seg000:004D50EC aWritefile db 'WriteFile',0
;seg000:004D50F6 aSetfilepointer db 'SetFilePointer',0
;seg000:004D5105 aClosehandle db 'CloseHandle',0
;seg000:004D5111 aGettickcount db 'GetTickCount',0
;seg000:004D511E aGetmodulefilen db 'GetModuleFileNameA',0
;seg000:004D5131 aAdvapi32_dll db 'ADVAPI32.dll',0
;seg000:004D513E aRegopenkeyexa db 'RegOpenKeyExA',0
;seg000:004D514C aRegqueryvaluee db 'RegQueryValueExA',0
;seg000:004D515D aRegclosekey db 'RegCloseKey',0
;seg000:004D5169 aSoftwareMicros db
'Software\Microsoft\Windows\CurrentVersion\Explorer',0
;seg000:004D519C aPinf db 'PINF',0
;seg000:004D51A1 aInitiate db 'Initiate',0
;可见,esi 现在可能指向字符串“Kernel32.dll”,也可能被用于字符串表基址。具体是什么,继续向下看。现在我们可以确定的是:edi+0x84(004D50AC)至 edi+0x182(004D51AA)之 ;间的内容为字符串表
seg000:004D51D0 add eax, [edi+8]
;edi + 0x8 是 004D5030,[edi+8]处也是个 dword,值为 0x400000,而原 eax 的值上边已经分析出;来了是 0x4A2C0。而 0x400000 最有可能的是 exe 模块的加载基址,而相应的,把基址加;到 eax 上,显然这里的 eax 应该是个 RVA 了。具体这个 RVA 值是什么含义呢?猜测可能是;入口点什么的。用调试器载入未被感染的样本 chrome.exe,结果入口点是:0x44A2C0。可见,这个 RVA 值确实是原程序入口点的 RVA。现在已经基本确定数据段中两个字段的含义:
;edi + 8: OEP 的 RVA
;edi + 0Ch:原程序加载基址(module base ) ;此条指令完成后,eax 为 OEP (原始入口点)
seg000:004D51D3 add edx, 4
;edx 指向函数返回地址
seg000:004D51D6 mov [edx], eax
;修改函数返回地址为 eax,而这里的 eax 正是 OEP。也就是说,本函数返回后,程序将跳转
;至 OEP 执行,加载原始程序。
分析函数 sub_4D524A(调用部分)
seg000:004D51D8 push esi
;esi 为字符串表/某特定字符串 基址
;参数 2 压栈
|