导入表内注入代码(二)
2007-03-17 21:59:50 来源:WEB开发网核心提示: 1.检查DLL名称是否是"Shell32.DLL",2.检查Function名称是否是"ShellAboutW",导入表内注入代码(二)(2),3.如果条件1和2均正确,重定向ShellAbout()的thunk到新的函数,你将看到它对目标CALC.
1.检查DLL名称是否是"Shell32.DLL"。
2.检查Function名称是否是"ShellAboutW"。
3.如果条件1和2均正确,重定向ShellAbout()的thunk到新的函数。
这个新的函数是一个简单的消息框:
_ShellAbout_NewCode:
_local_0:
pushad// save the registers context in stack
call _local_1
_local_1:
pop ebp
sub ebp,offset _local_1 // get base ebp
push MB_OK | MB_ICONINFORMATION
lea eax,[ebp+_p_szCaption]
push eax
lea eax,[ebp+_p_szText]
push eax
push NULL
call _jmp_MessageBox
// MessageBox(NULL, szText, szCaption, MB_OK | MB_ICONINFORMATION) ;
popad// restore the first registers context from stack
ret 10h
当你计划用一个新的函数取代一个API时,你应该考虑一些要点:
不能用missing the stack point 破坏Stack memory。因此,需要用ADD ESP,xxx或RET xxx恢复最后的原始栈指向(original stack point)。
为了保持除EAX外线寄存器的大多数安全,要用PUSHAD和POPAD捕获和恢复它们。
正如你看到的,我已经用了PUSHAD和POPAD来回收线程寄存器。对于此情况,ShellAbout(),它有4个DWORD成员因此栈指针在返回时被增加0x10。在重定向ShellAbout()后,你可以尝试从Help(帮助)菜单点击About Calculator(关于计算器),你将看到它对目标CALC.EXE做了什么。
图 9 – 重定向About Calculator(关于计算器)到一个消息对话框
EXE protectors用此方法操作目标;它们建立重定向到它们附加的存储空间,下一节将讨论。
更多精彩
赞助商链接