who is calling me?

   ULONG rip=0xffffffff;
    __asm
    {
            push eax
            mov eax,[ebp+04h]
            mov rip,eax
            pop eax
    }

 

 

DebugString("the module from ebp+04h:%s/n",GetWhoIsCalling(rip));   

 

 

char * __stdcall GetWhoIsCalling(DWORD apiAddr,DWORD pPEB=0)
{
    LDR_MODULE *ldr, *headLdr;
    LDR_MODULE *result = NULL;
   
    if(pPEB==0)
    {
        __asm
        {
            mov  eax, fs:[30h];   // get pointer to PEB from offset 30h into TEB
        }
    }
    else
    {
        __asm
        {
            mov  eax, pPEB;   // get pointer to PEB from arg pPEB
        }
    }
    __asm
    {
        mov  eax, [eax+0ch];   // retrive value from offset 0ch into PEB
        //mov  esi, [eax+1ch];   // get the head pointer to InInitializationOrderModuleList  
        //一般"按初始化顺序"前向遍历链表时,第一个节点对应ntdll.dll,第二个结点对应
        //kernel32.dll,我们不太关心其它模块。如果按加载顺序前向遍历,第一个节点对应
        //EXE文件本身,第二个节点才对应ntdll.dll。
        mov  esi, [eax+0ch];   // get the head pointer to InLoadOrderModuleList  
       
        mov  headLdr, esi;      
    }
    ldr = headLdr;
   
    while(true)
    {
        if(!IsBadReadPtr(ldr->BaseAddress, 4) && !IsBadReadPtr(ldr->BaseDllName.Buffer, 4))
        {
            //printf("BaseDllName: %ws/n",ldr->BaseDllName.Buffer);
            //printf("FullDllName: %ws/n",ldr->FullDllName.Buffer);
            DWORD dllEnd = (DWORD)ldr->BaseAddress + ldr->SizeOfImage;
           
            if(apiAddr > (DWORD)ldr->BaseAddress && apiAddr < dllEnd)
            {
                DWORD nameLen = WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, ldr->BaseDllName.Buffer, -1, NULL,
                    0, NULL, NULL);   
                if(nameLen)
                {
                    LPSTR buffer = (LPSTR)malloc(nameLen + 1);
                    if(buffer)
                    {
                        WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, ldr->BaseDllName.Buffer, -1, buffer,
                            nameLen + 1, NULL, NULL);   
                       
                        return buffer;
                    }     
                }
            }
        }
        // get the head pointer to InLoadOrderModuleList
        ldr = (LDR_MODULE *)ldr->InLoadOrderModuleList.Flink;
       
        if(ldr == headLdr)
            break;
    }
    return NULL;
}

一般在HOOK的函数头部CALL GetWhoIsCalling,就能得到调用的模块

 

<think>好的,用户想了解函数调用(Function Calling)及其工作原理。首先,我需要明确函数调用的定义,可能涉及编程中的基本概念,比如在程序中调用函数来执行特定任务。但根据提供的引用,特别是引用[3]和[4],用户可能更关注AI大模型中的函数调用机制,比如OpenAI的Function Calling功能。 首先,我应该从基础概念入手,解释函数调用在传统编程中的作用,即通过函数名和参数执行特定操作。然后,过渡到AI领域中的函数调用,这里需要结合引用中的内容,说明大模型如何生成函数参数,但不直接执行函数,而是由外部程序处理。这可能涉及到模型如何解析用户请求,判断是否需要调用函数,生成正确的参数格式。 需要区分传统函数调用和大模型中的函数调用的不同之处,比如大模型不执行代码,仅提供参数。同时,结合引用中的步骤,如用户输入、模型判断是否需要函数、处理响应、调用外部函数等流程。可能需要用示例来说明,比如天气查询的场景,模型生成参数,开发者调用天气API。 另外,要引用提供的资料,比如引用[3]提到的tools参数用于向模型提供函数定义,模型生成符合规范的参数。引用[4]讨论的AI大模型缺陷及函数调用如何补充其逻辑能力,赋予模型执行外部功能的能力。 要注意用户可能混淆传统编程和大模型中的函数调用,需要明确两者的区别和联系。同时,确保解释清晰,结构层次分明,分点说明定义、原理、流程、示例和意义。最后生成相关问题,帮助用户深入理解,比如应用场景、优势挑战、与传统调用的区别等。 总结步骤:定义函数调用,分传统和AI两部分;工作原理分步骤说明用户输入到函数执行的过程;举例说明;强调意义和优势;生成相关问题。</think>### 函数调用(Function Calling)及其工作原理 #### 1. 函数调用的定义 **函数调用**在编程中通常指通过函数名和参数执行特定操作的过程。在传统编程中,开发者直接编写代码调用函数,例如: ```python result = add(3, 5) # 调用加法函数 ``` 在 **AI 大模型**场景中,函数调用特指模型根据用户需求生成调用外部工具或 API 所需的参数,而非直接执行代码[^3]。例如,用户询问天气时,模型生成 `{"location": "北京"}` 的参数,开发者再据此调用天气 API[^2]。 --- #### 2. AI 大模型中函数调用的工作原理 **核心流程**可分为以下步骤: 1. **用户输入解析** 模型接收自然语言请求(如“北京今天气温多少?”),分析意图。 2. **函数定义匹配** 开发者预先通过 `tools` 参数向模型描述可用的函数(如 `get_weather(location)`)。模型判断是否需要调用函数。 3. **参数生成** 若需要调用,模型生成符合函数定义的参数(如 `{"location": "北京"}`),但不会执行函数本身。 4. **外部执行与反馈** 开发者根据参数调用外部 API,将结果返回给模型,模型再生成最终回答(如“北京今天 25°C”)[^2]。 **关键特性**: - **逻辑赋能**:弥补大模型无法执行真实逻辑的缺陷(如计算、数据库查询),通过外部函数扩展能力[^4]。 - **安全隔离**:模型仅生成参数,实际执行由开发者控制,避免安全隐患。 --- #### 3. 示例:天气查询场景 ```text 用户输入 → 模型生成参数 → 调用天气 API → 返回结果 ``` - **用户输入**:“上海明天会下雨吗?” - **模型输出**:`{"location": "上海", "date": "2023-10-20"}` - **开发者**:调用天气 API 获取数据,反馈给模型生成回答[^2]。 --- #### 4. 意义与优势 - **动态扩展能力**:模型可通过函数调用集成实时数据(如股票、新闻)或专业工具(如数学计算)[^4]。 - **精准控制**:开发者可限制模型行为,确保输出符合业务规范。 - **成本优化**:减少模型处理复杂逻辑的负担,提升响应效率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值