最近由于工作需要  需要做一个远程线程的例子  不知道为什么  每次创建远程线程的时候目标进程总是挂掉  我在网上找到一个类似的例子  在他的线程函数前面下了一个断点 反汇编出来的代码如下static DWORD WINAPI ThreadFunc (INJDATA *pData)
{
0042DB00  push        ebp  
0042DB01  mov         ebp,esp 
0042DB03  sub         esp,44h 
0042DB06  push        ebx  
0042DB07  push        esi  
0042DB08  push        edi  
int nXferred  = 0; // number of chars retrieved by WM_GETTEXT
0042DB09  mov         dword ptr [nXferred],0 
而我的线程函数下了一个断点 反汇编出来的内容如下static DWORD WINAPI RemoteThreadProc(PRemotePara lpData)
{
00413870  push        ebp  
00413871  mov         ebp,esp 
00413873  sub         esp,10Ch 
00413879  push        ebx  
0041387A  push        esi  
0041387B  push        edi  
0041387C  lea         edi,[ebp-10Ch] 
00413882  mov         ecx,43h 
00413887  mov         eax,0CCCCCCCCh 
0041388C  rep stos    dword ptr es:[edi] 
0041388E  mov         eax,dword ptr [___security_cookie (421190h)] 
00413893  xor         eax,ebp 
00413895  mov         dword ptr [ebp-4],eax 
         char pStatckDebugString1[] = "进入远程线程";
00413898  mov         eax,dword ptr [string "\xbd\xf8\xc8\xeb\xd4\xb6\xb3\xcc\xcf\xdf\xb3\xcc" (41DFF4h)] 
根据我的猜想 我认为目标程序挂掉的主要原因就是编译器加了好多绝对地址的指令  因此 我想问  是什么编译器设置会产生这些不同的汇编代码?

解决方案 »

  1.   

    汗  CSDN咋了?  排半天版成这个样子 ...
    我想问的是  到底是什么编译器设置会产生这些不同的汇编代码?
      

  2.   

    还好帖子还在  又遇到一个问题  mySendMessage((HWND)(pData->hwndLocal),WM_SETTEXT,
    NULL,(LPARAM)pData->str);
    004136CD  mov         eax,dword ptr [pData] 
    004136D0  add         eax,0Ch 
    004136D3  mov         esi,esp 
    004136D5  push        eax  
    004136D6  push        0    
    004136D8  push        0Ch  
    004136DA  mov         ecx,dword ptr [pData] 
    004136DD  mov         edx,dword ptr [ecx+8] 
    004136E0  push        edx  
    004136E1  call        dword ptr [mySendMessage] 
    004136E4  cmp         esi,esp 
    004136E6  call        @ILT+1600(__RTC_CheckEsp) (411645h) 程序在最后一个call的地方又挂掉了  又是绝对地址...
    这个又是啥问题引起的呢  
      

  3.   

    怎么看起来晕晕的,楼主的代码好奇怪,非常非常之奇怪。难道楼主的字符串和函数不是放在同一个DLL中的?
      

  4.   

    没有使用DLL 用char [] 是确保字符串放在栈里面  这样避免常量字符串的绝对地址在进程间出现问题 
      

  5.   

    原来不用DLL也能创建远程线程啊可是远程进程是怎么找到远程线程函数的代码的呢?
      

  6.   

    先写进去 WriteProcessMemory 为了麻烦 所以我就把调试信息直接放到栈里面去了 
      

  7.   

    准备发博客去  我的Word写了3页  发这  划不着 
      

  8.   

    1.禁用运行时库检查
    2.不用运行时库函数,要重定位
    3.部分API可能也要重定位,可用LoadLibrary,GetProcAddress
    4.常量字符串,可转为16进制数组
    如DWORD sz[]={0x31323334, 0x00003536}表示ANSI的"432165"
      

  9.   

    我写了个RawPeApi的库,可以轻松的实现远线程注入,楼主要不要试试啊,说不定很有用呢,呵呵
      

  10.   

    我刚学习多线程,大概浏览了一下《Win32多线程程序设计》,对于多线程完全还是雾里看花。我来观摩学习。