所有的短跳转都可以使用长条转来代替。
如果你要使用记事本里面已经有的,那么就必须找到记事本中的IAT表,才可以使用API。
我们使用OD打开记事本程序。
01001FCF |> \FF75 18 push dword ptr [ebp+18] ; /Style
01001FD2 |. FF75 0C push dword ptr [ebp+C] ; |Title
01001FD5 |. FF75 10 push dword ptr [ebp+10] ; |Text
01001FD8 |. FF75 08 push dword ptr [ebp+8] ; |hOwner
01001FDB |. FF15 68120001 call dword ptr [<&USER32.MessageBoxW>] ; \MessageBoxW
上面这段代码是记事本中调用MessageBoxW的代码,你可以看到那个CALL指令(FF15 68120001),他的地址是0x01001268,这个就是IAT表中MessageBoxW函数的位置。
这时候我们看一下地址0x01001268的内容(这是一个VA):
01001268 >77D66534 4e謜 USER32.MessageBoxW
0100126C >77D2C2BB .乱w USER32.SetWindowLongW
01001270 >77D188A6 ..褀 USER32.GetWindowLongW
01001274 >77D2436E nC襴 USER32.GetDlgItem
01001278 >77D2B112 .币w USER32.SetFocus
0100127C >77D2736C ls襴 USER32.SetDlgItemTextW
01001280 >77D1A9B6 .┭w USER32.wsprintfW
01001284 >77D24305 .C襴 USER32.GetDlgItemTextW
01001288 >77D24A4E NJ襴 USER32.EndDialog
0100128C >77D2910F ..襴 USER32.GetParent
01001290 >77D318AC ..觲 USER32.UnhookWinEvent
01001294 >77D18A01 .娧w USER32.DispatchMessageW
01001298 >77D18BF6 ?褀 USER32.TranslateMessage
0100129C >77D1941E ..褀 USER32.TranslateAcceleratorW
010012A0 >77D27424 $t襴 USER32.IsDialogMessageW
010012A4 >77D18CCB 藢褀 USER32.PostMessageW
010012A8 >77D191C6 ?褀 USER32.GetMessageW
010012AC >77D317F7 ..觲 USER32.SetWinEventHook
010012B0 00000000 ....
可以看到第一行就是0x01001268的内容,他存放的数值是0x77D66534,就是MessageBoxW在内存中的真实地址(这个也是VA),0x01001268的内容在不同版本的Windows上是会变动的,所以你要调用MessageBoxW就只能call 0x01001268而不能直接call 0x77D66534,否者就只能在你的机器上运行,换一台机器可能就不行了。
我们在进一步确认一下,进入地址看一下啊反汇编:
77D66533 90 nop
77D66534 > 8BFF mov edi, edi
77D66536 55 push ebp
77D66537 8BEC mov ebp, esp
77D66539 833D BC14D777 00 cmp dword ptr [77D714BC], 0
77D66540 74 24 je short 77D66566
77D66542 64:A1 18000000 mov eax, dword ptr fs:[18]
77D66548 6A 00 push 0
77D6654A FF70 24 push dword ptr [eax+24]
77D6654D 68 241BD777 push 77D71B24
77D66552 FF15 C412D177 call dword ptr [<&KERNEL32.InterlockedCompareE>; kernel32.InterlockedCompareExchange
77D66558 85C0 test eax, eax
77D6655A 75 0A jnz short 77D66566
77D6655C C705 201BD777 0100000>mov dword ptr [77D71B20], 1
77D66566 6A 00 push 0
77D66568 FF75 14 push dword ptr [ebp+14]
77D6656B FF75 10 push dword ptr [ebp+10]
77D6656E FF75 0C push dword ptr [ebp+C]
77D66571 FF75 08 push dword ptr [ebp+8]
77D66574 E8 BFA2FEFF call MessageBoxExW
77D66579 5D pop ebp
77D6657A C2 1000 retn 10
77D6657D 90 nop
确实是MessageBoxW的代码。
如果你要插入一个自己的消息框,那么在push四个参数之后,需要使用call 0x01001268来调用API。
另外,还要注意,XP的记事本程序中只有MessageBoxW函数的导入地址,没有MessageBoxA函数的导入地址,所以你在PUSH输入参数的时候,字符串需要用unicode字符串。