返回列表 发帖

[讨论]IDA 识别动态链接库中函数的机制

[讨论]IDA 识别动态链接库中函数的机制
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

议题作者:BeQuick

IDA的识别静态库的函数的机制是通过函数签名进行匹配,那识别动态库的函数的机制是什么?
我做了如下的测试,MyCallDll_1.asm通过隐式调用(即用include use32.inc和includelib use32.lib)MessageBox,显示一个窗口信息.   MyCallDll_2.asm用显式调用(即在程序中用LoadLibrary和GetProcProcess手动获取MessageBoxA的地址,再用call指令调用)实现同样的功能。
下面是程序的源码:
Code Language : ASM
;===================MyCallDll_1.asm=======================
    .586
    .model flat, stdcall
    option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

  .data
szCaption db 'Hello', 0
szTest  db 'How are you?', 0

  .code
start:
invoke MessageBox, NULL, offset szTest, offset szCaption, MB_OK
invoke ExitProcess, NULL
    end start
;===================MyCallDll_2.asm=======================
  .586
  .model flat, stdcall
  option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib

  .data
szCaption db 'Hello', 0
szTest  db 'How are you?', 0
szDll  db 'user32.dll', 0
szMessageBox db 'MessageBoxA', 0
hDll dd 0
lpMessageBox dd 0
  .code
start:
invoke LoadLibrary, offset szDll
.if eax == 0
  invoke ExitProcess, 0
.endif
mov hDll, eax

invoke GetProcAddress, hDll, offset szMessageBox
.if eax == 0
  invoke ExitProcess, 0
.endif
mov lpMessageBox, eax

push 0
push offset szCaption
push offset szTest
push 0
call lpMessageBox

invoke ExitProcess, 0
  end start
;========================================================
Parsed in 0.024 seconds
结果IDA识别出了MyCallDll_1.asm中的MessageBoxA, 但没有识别出MessageBoxA中的MessageBoxA。
从结果看,IDA识别动态链接库的函数是通过检测程序的导入表。  这只是我通过简单的测试得出的结论,但我想,程序只通过简单的显示调用动态链接库中的函数(用LoadLibrary和GetProcProcess)就可以“骗过”IDA,有点不可信。  那IDA是不是也把动态链接库(比如windows的kernel32.dll, user32.dll)中的函数做成签名,与静态库函数识别一样去进行匹配呢? 或是IDA用其他的方法? 欢迎大家发表自己的见解!
帖子15 精华0 积分10 阅读权限40 性别男 来自湖北 武汉 在线时间5 小时

返回列表