我前面发了一个贴子。可能请得不是太清楚。    比如反汇编程序里面有这样一段代码。 400001   push ecx
  400002  call  xxxxxxxx
    40007 mov [esi+64],eax
    call xxxxxxxxxx  这里面是一个记算函数。最后得出eax的值。
   我在CE里面,可以用CE的代码注入把mov [esi+64] 改成jmp 0700001   然后再 0700001  call xxxxxx
      mov [我分配的地址],eax
jmp 400007  我现在有几个问题想请教下。  首先,如何用高级语言来实现CE的代码注入功能?
  我现在的方法是。在CE里面改好。把字节记下来。然后用D写代码。一个字节一个字节的改。我想我这个方法肯定是不行的。 麻烦。而且无法确定分配的地址。  其次,听别人说还可以注入自己的函数。
  比如 procedure newfun;
      begin
    end;用@ 取地址。  
  那是不是这样来写
     
     begin
   pbyte($0700001)^:=$e9;
   pint($0700002)^:=integer(@newfun);
   
希望各位有空能指点一下。或者给些相关资料让我自己去看。谢谢各位。
     
      

解决方案 »

  1.   

    用高级语言最简单的方法是写成DLL让目标进程加载,例如CreateRemoteThread、SetWindowsHookEx等方法。因为各个进程的地址空间是相互独立的,程序注入其它进程需要进行重定位,否则程序内使用静态地址会出问题。加载DLL时,系统会进行重定位操作,不需要程序自己处理。
    修改目标进程的代码,属于反汇编的范畴,一般只做一些简单的修改,例如修改指令中的立即数或地址,或者是插入跳转指令,使其跳转到自己的代码上。
    注入函数是在目标进程内分配内存,把函数的代码复制过去,然后利用CreateRemoteThread或者插入跳转指令等方式使注入函数被执行。函数中最好不要使用任何静态数据或函数,如果需要使用则需要重定位,这种注入的函数用汇编来写相对容易一些。
      

  2.   

    我有一份把DLL代码注入到目标进程的代码可以发邮件向我索取
    [email protected]
      

  3.   

       不好意思。可能是我说得不是太清楚。我现在已经是把DLL注入目标进程。我现在是想知道自己编写修改目标进程的反汇编代码如何写。  比如这段。这是目标程序的反汇编代码00518042 - 8b c8                      - mov ecx,eax
    00518044 - e8 37 5e fc ff             - call 0043de80
    00518049 - 8b c8                      - mov ecx,eax  我现在想替换掉call 0043de80  改成我自己的CALL
      我的代码这样写
       function myfun(dz:integer):integer;
    begin
        result:=$30;
     end;procedure TForm1.sButton1Click(Sender: TObject);
    begin
         pint($00518044+1)^:=integer(@myfun);
    end;  修改后,我看了下反汇编。进程的内存中的CALL地址的确必变了。但是我跟进这个CALL。
      结果变成了。。  05D07620 - 00 00                      - add [eax],al  我改这个CALL的目的是想修改这个CALL的返回值。   但是按我的理解。我这个CALL这样写程序肯定会死掉。好像CALL都没有RET。
      所以我想请教一下。像这种代码应该如何写。
      还有比如我想在我自己写的过程中加一个判断。 
      00518042 - 8b c8                      - mov ecx,eax
      判断ecx 的值是否是我指定的值。如果不是,就执行原来的CALL返回,是的,就通过我的CALL返回我给出的值。希望各位指点下。不胜感谢。
        
      

  4.   

    call指令使用的是相对地址,在E8后面写入 你的函数地址减去518049的结果。
      

  5.   

    pbyte($518049)^:=$eb;
    pint($518049+1)^:=integer(@isSelfAddr)-$518049;这样的结果也不对。
      

  6.   

    这个帖子也是你发的?
    eb是短跳转指令的机器码,段内调用指令的机器码是e8。
      

  7.   

    //远程注入试试const dwSize=1024;//
    var gPRemoteThread: Pointer;   //远程线程地址
    NumberOfBytesWritten,PHandle: Cardinal;PHandle:=目标进程句柄procedure RunAsmThreadCY(); stdcall;  
    begin
        asm    end;
    end;gPRemoteThread := VirtualAllocEx(PHandle, nil, dwSize, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE);WriteProcessMemory(PHandle, gPRemoteThread,  @RunAsmThreadCY, dwSize, NumberOfBytesWritten) ;
    CreateRemoteThread(PHandle , nil, 0, gPRemoteThread, nil, CREATE_SUSPENDED, NumberOfBytesWritten);
      

  8.   

    可以用 asm ... end;  插入汇编!