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--;
}
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--;
}
typedef static LRESULT CALLBACK callback_fn_t(HWND, UINT, WPARAM,LPARAM);
callback_fn_t* lpfn = NewProc;
这不就拿到了么?
我必须在函数内部获得自己的地址;
于是用了一下的方法,执行了一句没有任何用处的 : call dummy;
这样做只是将程序的执行点IP入栈,然后pop 到 ecx中,就得到了,离
函数,最近的地址,但还是又一个差值,就是 OFFSET,他是函数入口地址
到pop ecx 之间的偏移,因为各种原因,这个值会变,所以,要通过各种发法,
获得,反汇编进行察看;; 但我总也看不对
{
PROC_ENTRY:
//get address
_asm mov eax,PROC_ENTRY
}
这样,eax不就是函数地址了吗
如果要函数的地址,可以直接使用函数名字得到。// 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
请按任意键继续 . . .
*/
因为,这个函数要注入到其他函数的体内,不是在自己的函数内执行:
=-------------------
我必须在函数内部获得自己的地址;
于是用了一下的方法,执行了一句没有任何用处的 : call dummy;
这样做只是将程序的执行点IP入栈,然后pop 到 ecx中,就得到了,离
函数,最近的地址,但还是又一个差值,就是 OFFSET,他是函数入口地址
到pop ecx 之间的偏移,因为各种原因,这个值会变,所以,要通过各种发法,
获得,反汇编进行察看;; 但我总也看不对
是要写CreateRemoteThread是吧,如果是的话就早说嘛!
在release中,可以用函数指针得到的。因为没有间接调用。
通用的办法有一个:
CreateRemoteThread中,lpfn为LoadLibrary的地址
那样就会调用DllMain函数了,那时你想干嘛就干嘛去吧
有问题,得到函数名地址一看,哇,
就一句
jmp 99999 晕,这样的话我还真没招了