OFFSET 如何的得到?static LRESULT CALLBACK NewProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam )  // second message parameter
{
// calculate the location of INJDATA
// (remember that INJDATA in the remote process
// is placed immediately before NewProc)
INJDATA* pData;
_asm {
call dummy
dummy:
pop ecx // <- ECX contains the current EIP (instruction pointer);
sub ecx, OFFSET // <- ECX contains the address of NewProc;
mov pData, ecx
}
pData--;
}

解决方案 »

  1.   

    你这不是有病么?
    typedef static LRESULT CALLBACK callback_fn_t(HWND, UINT, WPARAM,LPARAM);
    callback_fn_t* lpfn = NewProc;
    这不就拿到了么?
      

  2.   

    楼上的方法在release中能得到,在debug中由于间接调用,只能得到一个jmp语句
      

  3.   

    谢谢,两位哥们;  我没有说清楚, 因为某些原因,我不能在函数外边获得地址,
    我必须在函数内部获得自己的地址;
        于是用了一下的方法,执行了一句没有任何用处的 : call dummy;
    这样做只是将程序的执行点IP入栈,然后pop 到 ecx中,就得到了,离
    函数,最近的地址,但还是又一个差值,就是  OFFSET,他是函数入口地址
    到pop ecx  之间的偏移,因为各种原因,这个值会变,所以,要通过各种发法,
    获得,反汇编进行察看;;  但我总也看不对
      

  4.   

    void Proc(void)
    {
     PROC_ENTRY:
    //get address
    _asm mov eax,PROC_ENTRY
    }
    这样,eax不就是函数地址了吗
      

  5.   

    不知道楼主想干什么。
    如果要函数的地址,可以直接使用函数名字得到。// DevC++ 4.9.8.0
    #include <iostream>
    #include <stdlib.h>
    using namespace std;void PrintFunAddr()
    {
      typedef void (*FUN)();
      FUN pFun = PrintFunAddr;
      cout << "PrintFunAddr = " << (void*)pFun << endl;
    }int main(int argc, char *argv[])
    {
      PrintFunAddr();
      system("PAUSE");
      return 0;
    }/*
    PrintFunAddr = 0x401290
    请按任意键继续 . . .
    */
      

  6.   

    to  cai12345(cai) : 肯定不是。。我的这个函数,是不能用函数名得到的
    因为,这个函数要注入到其他函数的体内,不是在自己的函数内执行:
    =-------------------
    我必须在函数内部获得自己的地址;
        于是用了一下的方法,执行了一句没有任何用处的 : call dummy;
    这样做只是将程序的执行点IP入栈,然后pop 到 ecx中,就得到了,离
    函数,最近的地址,但还是又一个差值,就是  OFFSET,他是函数入口地址
    到pop ecx  之间的偏移,因为各种原因,这个值会变,所以,要通过各种发法,
    获得,反汇编进行察看;;  但我总也看不对
      

  7.   

    代码重定位?晕……这个可是汇编的专利,高级语音没的什么好方法来实现(至少我不知道)。首先计算代码偏移量是一个问题,其次将代码远程注入后,因为VC会给您的函数产生一些代码,如分配参数到堆栈中。so 一般VC进行远程注入都采用DLL的方式。如果您找到方法请告诉我一声,没有怎么研究过,不知道是否有方法。
      

  8.   

    我可以告诉你,这是可以的。。不用Dll可以的。。你如果要代码,我可以给你一个,绝对没问题。。
      

  9.   

    Mycro(莫论国事,违者杀头):
    是要写CreateRemoteThread是吧,如果是的话就早说嘛!
    在release中,可以用函数指针得到的。因为没有间接调用。
    通用的办法有一个:
    CreateRemoteThread中,lpfn为LoadLibrary的地址
    那样就会调用DllMain函数了,那时你想干嘛就干嘛去吧
      

  10.   

    呵呵,谢谢了 cai12345(cai)确实,我经过跟踪,已经发现,debug的,
    有问题,得到函数名地址一看,哇,
    就一句
    jmp 99999 晕,这样的话我还真没招了