能力值:
( LV13,RANK:260 )
2 楼
naked 函数...
能力值:
( LV2,RANK:10 )
3 楼
栈帧没有正确构造,以前看过相同功能的shellcode,好像是这个样子的
push lpNumberOfBytesRead
push nSize
push lpBuffer
push lpBaseAddress
push hProcess;参数压栈
call $+5
pop eax;重定位
add eax, 0x0A
push eax;返回地址压栈
push ebp
mov ebp, esp
jmp ebx; ebx是入口+5
其中 0x0A = 1(pop eax) + 3(add eax, 0x0a) + 1(push eax) + 1(push ebp) + 2(mov ebp, esp) + 2(jmp ebx)
能力值:
( LV2,RANK:10 )
4 楼
__declspec( naked ) void test( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
__asm
{
mov eax,RET
push eax//压入返回地址
mov edi,edi
push ebp
mov ebp,esp
mov eax,0x7C8021D5
jmp eax
RET:
ret 0x14
}
}
能力值:
( LV2,RANK:10 )
5 楼
__declspec( naked ) void test( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
__asm
{
mov eax,RET
push eax//压入返回地址
mov edi,edi
push ebp
mov ebp,esp
mov eax,0x7C8021D5
jmp eax
RET:
ret 这个不要平衡堆栈了,调用的函数 ReadProcessMemory
平衡堆栈
}
}
能力值:
( LV2,RANK:10 )
6 楼
运行提示错误。。。。。错误:
0x7C802200 指令引用的 0x0000010 内存。该内存不能为 written。 __declspec( naked ) void test( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
__asm
{
mov eax,JRET
push eax//压入返回地址
mov edi,edi
push ebp
mov ebp,esp
mov eax,0x7C8021D5
jmp eax
JRET:
ret
}
} void main()
{
char cc[1024] ;
ReadProcessMemory((LPVOID)-1, (LPVOID)0x400000 , &cc, 1024 , 0);
test((LPVOID)-1, (LPVOID)0x400000, &cc, 0x10, 0);
system("pause");
}
能力值:
( LV2,RANK:10 )
7 楼
如果你读的是代码执行指令空间,你要用VirtualProtect
VirtualProtect
The VirtualProtect function changes the access protection on a region of committed pages in the virtual address space of the calling process. This function differs from VirtualProtectEx, which changes the access protection of any process.
BOOL VirtualProtect(
LPVOID lpAddress, // address of region of committed pages
DWORD dwSize, // size of the region
DWORD flNewProtect, // desired access protection
PDWORD lpflOldProtect
// address of variable to get old protection
);
能力值:
( LV2,RANK:10 )
8 楼
就是选把要读的指令空间属性设置为可读写
能力值:
( LV15,RANK:520 )
9 楼
7C8021D0 > 8BFF mov edi,edi ; ReadProcessMemory
7C8021D2 55 push ebp
7C8021D3 8BEC mov ebp,esp
jmp 0xC8021D0+5
能力值:
( LV9,RANK:200 )
10 楼
__asm
{
mov edi,edi
push ebp
mov ebp,esp
mov eax,ReadProcessMemory
add eax,5
jmp eax
}
不用返回
能力值:
( LV2,RANK:10 )
11 楼
不知道为什么。。。
那个函数不好用。。。单次执行啥问题没有,,,但是我大量执行,问题就来了。。总是出错。。大家看看我那里没有写好。
大概执行 5次就会出错。。。 使用 test_ReadProcessMemory 大量执行的时候总出错,,,,但是用 ReadProcessMemory 就没问题。
vodi test_ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
{
__asm
{
mov edi,edi
push ebp
mov ebp,esp
mov eax,ReadProcessMemory
add eax,5
jmp eax
}
}
void main()
{
char cc[0x1024] ;
int tmpaddr = 0x400000;
while(tmpaddr < 0x7FFFFFFF)
{
tmpaddr = tmpaddr + 0x1024;
test_ReadProcessMemory((LPVOID)-1, (LPCVOID)tmpaddr, (LPVOID)&cc, 1024, 0);
printf(" %x %x \n" , tmpaddr, &cc);
}
system("pause");
}
能力值:
( LV12,RANK:760 )
12 楼
函数要naked的啊啊啊~~
能力值:
( LV4,RANK:50 )
13 楼
naked 关键字。__declspec( naked )
能力值:
( LV2,RANK:10 )
14 楼
不行的。。。加上 naked 关键字。__declspec( naked ) 一样不行,,,总是出错。。。。有点不明白呢,而且看 printf的输出。。。地址怎么显示的不对
能力值:
(RANK:280 )
15 楼
你的代码有几个问题
tmpaddr是带符号整数,所以那个while永远为真,不过这不是那个错误信息的原因
问题可能在&cc上,cc已经是数组了,不需要这个&,有可能是你用的编译器比较老,编译器把&cc编译成了一个独立变量,造成堆栈错误,导致tmpaddr,以及堆栈中的0被重写了,看那个地址似乎是函数在尝试写入lpNumberOfBytesRead
另外还有个不是问题的问题,数组长度一会1024, 一会0x1024,统一起来比较好
能力值:
( LV2,RANK:10 )
16 楼
hProcess
[in] A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.
不知道是不是这个原因。
能力值:
( LV2,RANK:10 )
17 楼
cc这样写也可以 没什么问题的 不过一般不推荐这样的写法
最关键是没加 __stdcall
能力值:
(RANK:280 )
18 楼
拿vc6编译了一下,是堆栈被重写导致的,但前面关于&cc的猜测是错的,而是因为test_ReadProcessMemory是个普通函数,你需要再加一个WINAPI的声明,否则VC6会在函数调用后调整ESP(5个参数,所以加了0x14)
__declspec(naked) WINAPI void test_ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
这么写就不会有问题了
能力值:
(RANK:280 )
19 楼
你说的没错,前面的猜测是错的
能力值:
( LV3,RANK:25 )
20 楼
地址空间不可读,那内存根本没分配出来
能力值:
( LV2,RANK:10 )
21 楼
一样的代码 我用 ReadProcessMemory 就可以的。。 但是用 test_ReadProcessMemory 就不行,,,大概循环几次就 出错呢。
能力值:
(RANK:280 )
22 楼
因为test_ReadProcessMemory每次调用结束后esp都会增加0x14, 你改成如下声明就没事了 __declspec(naked) WINAPI void test_ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
能力值:
( LV2,RANK:10 )
23 楼
终于可以了。。感谢楼上所有大虾们。。。我基础太差了。。。 不过加了 WINAPI 就有这个提示。。。编译器提示 不过程序可以正常运行。
__declspec(naked) WINAPI void test_ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) Compiling...
tcp.cpp
d:\program files\vc6\myprojects\tcp\tcp.cpp(379) : warning C4518: 'void ' : storage-class or type specifier(s) unexpected here; ignored
d:\program files\vc6\myprojects\tcp\tcp.cpp(379) : warning C4230: anachronism used : modifiers/qualifiers interspersed, qualifier ignored
Linking...
能力值:
(RANK:280 )
24 楼
抱歉是我疏忽了,
把void去掉或是放在WINAPI前面
能力值:
( LV2,RANK:10 )
25 楼
再次领略乌龟风范!