![]() |
#2
随心2025-03-17 15:21
|
我记得以前可以的啊
如下
mov ebp,esp就会报错:框架指针寄存器“ebp”被内联程序集代码修改
即便跳过这个步骤还会报个这样的错误: 写入程序数据库“C:\Use......pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
贴上全部代码,希望有人能告诉我原因

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main()
{
//Win7 32位系统下
//本例程实现,自己构建由三环到零环的OpenProcess函数的调用
HANDLE a;
_asm
{
//模拟进入Kernel32.dll中的openprocess
push 0xcc4 ;某个进程的pid
push 0x0
push 0x1fffff
sub esp,0x4 ;模拟call后的堆栈变化
//模拟进入KernelBase.dll中的openprocess
push ebp
mov ebp, esp
sub esp, 0x20
push esi
xor esi, esi
; 开始对局部变量进行入参ebp - 4 --ebp - 20, 两个结构体, 共8个成员
; 入参cli结构体第二个参数
mov dword ptr ss : [ebp - 0x4], esi
; 入参cli结构体第一个参数
mov eax, dword ptr ss : [ebp + 0x10]
mov dword ptr ss : [ebp - 0x8], eax
; 入参obj结构体第六个参数
mov dword ptr ss : [ebp - 0xc], esi
; 入参obj结构体第五个参数
mov dword ptr ss : [ebp - 0x10], esi
; 入参obj结构体第四个参数
mov eax, dword ptr ss : [ebp + 0xc]
neg eax
sbb eax, eax
and eax, 0x2
mov dword ptr ss : [ebp - 0x14], eax
; 入参obj结构体第三个参数
mov dword ptr ss : [ebp - 0x18], esi
; 入参obj结构体第二个参数
mov dword ptr ss : [ebp - 0x1c], esi
; 入参obj结构体第一个参数
mov dword ptr ss : [ebp - 0x20], 0x18
; 开始压栈进内核所需参数
lea eax, dword ptr ss : [ebp - 0x8]
push eax
lea eax, dword ptr ss : [ebp - 0x20]
push eax
push dword ptr ss : [ebp + 0x8]
lea eax, dword ptr ss : [ebp + 0x10]
push eax
//模拟进入ntdll.dll中的ntOpenProcess
add esp, 0x4
mov eax, 0xBE
mov edx, 0x7FFE0300
call edx
sub esp, 0x10
cmp eax, esi
pop esi
jl dword ptr [0x75D4753C]
mov eax, dword ptr ss : [ebp + 0x10]
leave
retn 0xC
}
printf("handel = %x\n", a);
system("pause");
return 0;
}
[此贴子已经被作者于2025-3-15 22:42编辑过]