内核反编译学习笔记2(上)
本节任务:通过具有不同数量参数的函数调用,看其中区别
所用程序bz3
需要掌握:
windbg命令:
uf 反汇编
dd 查看内容
调用的时候:
mov 给参数赋值
push eax 供函数使用的参数
被调用函数内部
push ebp 保存ebp,用来保存调用前运行的代码地址
mov ebp,esp 将esp赋值给ebp,现在有新的ebp指针了,指向栈顶
pop ebp 恢复ebp,取得地址,准备跳到那地址的代码,继续运行程序
需要了解
JMP 无条件跳转,去运行跳转后地址的代码
ret 8 返回,注意,调用前每push一个参数,esp就-4,两个参数就-8,ret的时候,需要+8返回
无需了解:
call=push+JMP
ret = pop+JMP 将在后面继续说明
//先贴代码,仔细看其实很简单
VOID MyP0()
{
DbgPrint("no arg...\r\n");
}
VOID MyP1(ULONG u1)
{
DbgPrint("One arg:%d\n!",u1);
}
VOID MyP2(ULONG u1,ULONG u2)
{
ULONG u3;
u3 = u1+u2;
DbgPrint("two arg:%d\n!",u3);
}
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("unload…\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
ULONG x1 = 5;
ULONG x2 = 8;
#if DBG
_asm int 3
#endif
MyP0();
MyP1(x1);
MyP2(x1,x2);
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
//////代码结束
以下分别为Entry主函数和3个自定义函数的反汇编。
汇编完了先放那,具体解析在下面。
kd> uf bz3!driverentry
bz3!DriverEntry [d:\mydriver\bz3\bz3.c @ 31]:
31 f8451520 8bff mov edi,edi
31 f8451522 55 push ebp
31 f8451523 8bec mov ebp,esp
31 f8451525 83ec08 sub esp,8
32 f8451528 c745f805000000 mov dword ptr [ebp-8],5
33 f845152f c745fc08000000 mov dword ptr [ebp-4],8
38 f8451536 cc int 3
41 f8451537 e854ffffff call bz3!MyP0 (f8451490)
42 f845153c 8b45f8 mov eax,dword ptr [ebp-8]
42 f845153f 50 push eax
42 f8451540 e86bffffff call bz3!MyP1 (f84514b0)
43 f8451545 8b4dfc mov ecx,dword ptr [ebp-4]
43 f8451548 51 push ecx
43 f8451549 8b55f8 mov edx,dword ptr [ebp-8]
43 f845154c 52 push edx
43 f845154d e87effffff call bz3!MyP2 (f84514d0)
47 f8451552 8b4508 mov eax,dword ptr [ebp+8]
47 f8451555 c74034001545f8 mov dword ptr [eax+34h],offset bz3!DriverUnload (f8451500)