- 帖子
- 251
- 积分
- 667
- 威望
- 1075
- 金钱
- 829
- 在线时间
- 2 小时
|
[讨论]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 小时 |
|