程序无法运行,反汇编调试时发现访问违例
http://blog.csdn.net/Civet148/archive/2005/12/26/562102.aspx
看了上面链接的文章,也模仿学习。遇到访问违例,发现坛子里面的类似的帖子也救不了急。
原作者这样写了源代码
-------------------------------------------------------------------------------
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;//设置为输入输出句柄为Socket
si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD;
-------------------------------------------------------------------------------
原作者很牛,也写了汇编代码,如下
-------------------------------------------------------------------------------
lea edi,[esp]; //可能是构造si
mov word ptr [edi+2ch], 0x0101; //si.dwFlags =0x0101
mov [edi+38h],ebx; //si.hStdInput
mov [edi+3ch],ebx; //si.hStdOutput
mov [edi+40h],ebx; //si.hStdError = Socket
-------------------------------------------------------------------------------
但我移植到一个程序里面的时候,却出现违例错误。代码如下
-------------------------------------------------------------------------------
01045C19 . E8 5DC17B7B call kernel32.LoadLibraryA ; \LoadLibraryA
01045C1E . 81EC 00020000 sub esp,200
01045C24 . 54 push esp ; /pWSAData
01045C25 . 68 02020000 push 202 ; |RequestedVersion = 202 (2.2.)
01045C2A . E8 260E9E70 call WS2_32.WSAStartup ; \WSAStartup
01045C2F . 81C4 00020000 add esp,200
01045C35 . 6A 00 push 0 ; /Flags = 0
01045C37 . 6A 00 push 0 ; |Group = 0
01045C39 . 6A 00 push 0 ; |pWSAprotocol = NULL
01045C3B . 6A 06 push 6 ; |Protocol = IPPROTO_TCP
01045C3D . 6A 01 push 1 ; |Type = SOCK_STREAM
01045C3F . 6A 02 push 2 ; |Family = AF_INET
01045C41 . E8 242F9E70 call WS2_32.WSASocketA ; \WSASocketA
01045C46 . 8BD8 mov ebx,eax
01045C48 . B8 01000000 mov eax,1
01045C4D . 50 push eax
01045C4E . 8BF4 mov esi,esp
01045C50 . 6A 04 push 4 ; /DataSize = 4
01045C52 . 56 push esi ; |Data
01045C53 . 6A 04 push 4 ; |Option = SO_REUSEADDR
01045C55 . 68 FFFF0000 push 0FFFF ; |Level = SOL_SOCKET
01045C5A . 53 push ebx ; |Socket
01045C5B . E8 C1E89D70 call WS2_32.setsockopt ; \setsockopt
01045C60 . 6A 00 push 0
01045C62 . 68 02000015 push 15000002
01045C67 . 8BF4 mov esi,esp
01045C69 . 6A 10 push 10
01045C6B . 56 push esi
01045C6C . 53 push ebx
01045C6D . E8 CA637E7B call kernel32.BindIoCompletionCallback
01045C72 . 6A 02 push 2
01045C74 . 53 push ebx
01045C75 . E8 C6778E7B call ntdll.ZwListenPort
01045C7A . 6A 10 push 10
01045C7C . 54 push esp
01045C7D . 56 push esi
01045C7E . 53 push ebx
01045C7F . E8 BC718E7B call ntdll.ZwAcceptConnectPort
01045C84 . 8BD8 mov ebx,eax
01045C86 . 8D3C24 lea edi,dword ptr ss:[esp]
01045C89 . 66:C747 2C 0101 mov word ptr ds:[edi+2C],101
01045C8F . 895F 38 mov dword ptr ds:[edi+38],ebx
01045C92 . 895F 3C mov dword ptr ds:[edi+3C],ebx
01045C95 . 895F 40 mov dword ptr ds:[edi+40],ebx
01045C98 C745 32 636D6400 mov dword ptr ss:[ebp+32],646D63
01045C9F . 8D4424 44 lea eax,dword ptr ss:[esp+44]
01045CA3 . 50 push eax
01045CA4 . 57 push edi
01045CA5 . 6A 00 push 0
01045CA7 . 6A 00 push 0
01045CA9 . 6A 00 push 0
01045CAB . 6A 01 push 1
01045CAD . 6A 00 push 0
01045CAF . 6A 00 push 0
01045CB1 . 8D45 32 lea eax,dword ptr ss:[ebp+32]
01045CB4 . 50 push eax
01045CB5 . 6A 00 push 0
01045CB7 . E8 C4AFD976 call ADVAPI32.CreateProcessAsUserA
-------------------------------------------------------------------------------
访问违例是访问了不该访问的内存,有劳大牛们费心,小弟恭候,感激不尽。