预备知识
本实验要求实验者具备如下的相关知识。
1.加密外壳中,破坏原程序的输入表是很关键的一步。在脱壳中,需要脱壳者对于pe格式中的输入表概念非常清楚。常见输入表的结构是为了表示从系统或外界调用DLL中的某些函数设计的。使用这些函数会涉及到函数名,函数所在的地址,这些分别用INT,IAT来表示。
INT:全称import name table输入名称表。简单来说,INT表存放了若干指针,通过这些指针,你可以找到所调用的函数的名字。
IAT:全称import address table输入地址表。简单来说,IAT表同样存放了若干指针,通过这些指针,你可以找到所调用函数的内存加载地址,也就是函数的入口地址。
windows弹窗程序编码说明:
程序用到的函数有两个:
MessageBoxA,在user32.dll中:
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
ExitProcess在kernel32.dll中:
VOID WINAPI ExitProcess(
_In_ UINT uExitCode
);
实验目的
通过该实验熟悉windowspe文件中导入表的结构和加载过程。通过手动完成导入表修复,理解导入表在pe文件中的作用。
实验环境
测试环境:windows xp sp3
实验步骤一
实验提供了一个不能正常运行的程序,如果在正常运行的情况下,程序的功能是弹出一个messagebox,然后正常退出。要做的,是通过排查错误,找到问题所在,修改程序,使其正常运行。
为此,本实验大致需要执行以下三个步骤:
1.大致了解程序的执行过程,通过od,配合stud_pe找到问题所在。
2.修改pe文件头中关于导入表的信息。
3.修改涉及到INT与IAT表的段中的信息。
任务描述:运行程序,用od调试,使用stud_pe查看,了解整个程序的流程,找出问题所在。
1.测试程序:
从图中可以看到可以显示控制台,但是程序没有正常运行,系统提示报错。
2.使用OD加载程序,查看程序执行流程,分析出错原因。
3.汇编代码中有push,有call,有jmp到最终地址,可以知道这里面涉及了函数调用,因为最终的函数调用都是用jmp这条指令来执行的,所以查看一下jmp到了那里。
选中jmp函数,右键[数据窗口中跟踪],[内存地址]。
从图中可以看到地址4020008处的hex数据为0x00000000,这是个不可执行的函数地址。
同理,可以查到指令00