我用aheadlib生成了劫持ws2_32.dll的结构我想获取send函数的参数buf,该如何是好?  请各位帮帮忙,100分送上,谢谢其他的地方我就略了,就把有关send的地方贴出来.
#pragma comment(linker, "/EXPORT:send=_AheadLib_send,@19")////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_send(void)
{
GetAddress("send");
__asm JMP EAX;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////新函数里面的参数是void,并不跟原函数一样,我不明白,也不知道如何把buf取出来,苦恼了我一个多星期了,想不通,特来向各位请教,麻烦大家了!

解决方案 »

  1.   

    那个dll函数太多了...
    那个<<神奇的马甲dll>>里用的是lpk
      

  2.   

    ALCDECL AheadLib_send(void)
    {
    SOCKET s;
    char* buf;
    int len;
    int flags;
    __asm

    MOV EAX,[ESP + 4h]
    MOV s,EAX
    MOV EAX,[ESP + 8h]
    MOV buf,EAX
    MOV EAX,[ESP + 0Ch]
    MOV len,EAX
    MOV EAX,[ESP + 10h]
    MOV flags,EAX
    }
    //....
    GetAddress("send");
    __asm JMP EAX;
    }
      

  3.   


    naked函数里不能定义变量,改全局
      

  4.   

    或者一般这样用__asm
    {
    MOV EAX,[ESP + 8h]
    PUSH EAX
    CALL func
    TEST EAX,EAX
    JE xxx
    //....
    }BOOL func(char* buf)
    {
    ...
    }
      

  5.   

    神奇的马甲我看过了,源码我也有,那只是打内存patch用,没用到获取参数
    另外先多谢stjay,我去试一下
      

  6.   

    一般函数,比如int send(
      SOCKET s,              
      const char FAR *buf,  
      int len,               
      int flags              
    );
    调用汇编:
    push  flags
    push len
    push buf
    lea s
    push s
    call send进入send之后:
    堆栈:
    返回地址
    参数
    参数buf
    参数len
    参数flag
      

  7.   

    你好,请问是3楼的改成ebp还是5楼的改成ebp? 谢谢你好,说实话,汇编我不懂...谢谢你的指点,虽然9楼的内容我不是很懂,我会努力研究的,谢谢
      

  8.   

    死记硬背也可以:
    esp + 8为第一个参数,
    esp + 0ch 为第二个参数,
    esp + 10h为第三个参数
    每隔4为一个参数.
    大多情况是这样.
    lz还是先好好学基础....
    给你鱼,只够你一顿饱...
      

  9.   


    明白一点了,那为什么3楼的兄弟是从4开始,8,0ch,10h这样的呢?还有7楼的兄弟说哪里要改成ebp呢?  谢谢. 马上结贴
      

  10.   

    哦,我错了,是应该从4开始.
    给你举个例子:
    int add(int a, int b)
    {
    return a + b;
    }void main
    {
    int c = add(a, b);
    }对应汇编void main
    {
    push b
    push a
    call add 
    mov c, eax
    .....
    }
    参数保存在堆栈中.
    整个过程堆栈如下:
    返回地址         esp
    a              esp + 4
    b              esp + 8
    第一个参数在esp + 4