挂钩内部函数:参数如何?

Posted

技术标签:

【中文标题】挂钩内部函数:参数如何?【英文标题】:Hooking internal function: How do the the parameters look like? 【发布时间】:2014-10-13 23:39:15 【问题描述】:

我已经在 C# 中使用 Easyhook 来挂钩 WINAPI 的函数。 现在我正在尝试挂钩程序的内部函数来记录特定的“事件”。

我已经能够通过作弊引擎的“Ultimap”-Function 发现函数调用:

008AEC40   /$  6A FF             PUSH -1
008AEC42   |.  68 E37EC100       PUSH Progra.00C17EE3
008AEC47   |.  64:A1 00000000    MOV EAX,DWORD PTR FS:[0]
008AEC4D   |.  50                PUSH EAX
008AEC4E   |.  51                PUSH ECX
008AEC4F   |.  56                PUSH ESI
008AEC50   |.  A1 4093F600       MOV EAX,DWORD PTR DS:[F69340]
008AEC55   |.  33C4              XOR EAX,ESP
008AEC57   |.  50                PUSH EAX
008AEC58   |.  8D4424 0C         LEA EAX,DWORD PTR SS:[ESP+C]
008AEC5C   |.  64:A3 00000000    MOV DWORD PTR FS:[0],EAX
008AEC62   |.  8BF1              MOV ESI,ECX
008AEC64   |.  897424 08         MOV DWORD PTR SS:[ESP+8],ESI
008AEC68   |.  E8 033CFFFF       CALL Progra.008A2870
008AEC6D   |.  C74424 14 0000000>MOV DWORD PTR SS:[ESP+14],0
008AEC75   |.  8B4424 1C         MOV EAX,DWORD PTR SS:[ESP+1C]
008AEC79   |.  50                PUSH EAX
008AEC7A   |.  8D4E 24           LEA ECX,DWORD PTR DS:[ESI+24]
008AEC7D   |.  C706 18E8CD00     MOV DWORD PTR DS:[ESI],Progra.00CDE818
008AEC83   |.  E8 F8E7FFFF       CALL Progra.008AD480
008AEC88   |.  C74424 14 FFFFFFF>MOV DWORD PTR SS:[ESP+14],-1
008AEC90   |.  8BC6              MOV EAX,ESI
008AEC92   |.  8B4C24 0C         MOV ECX,DWORD PTR SS:[ESP+C]
008AEC96   |.  64:890D 00000000  MOV DWORD PTR FS:[0],ECX
008AEC9D   |.  59                POP ECX                             
008AEC9E   |.  5E                POP ESI                                  
008AEC9F   |.  83C4 10           ADD ESP,10
008AECA2   \.  C2 0400           RETN 4

函数在这里被调用:

008CAF5F    .  85F6              TEST ESI,ESI
008CAF61    .  74 29             JE SHORT Progra.008CAF8C
008CAF63    .  6A 32             PUSH 32
008CAF65    .  8D5424 4C         LEA EDX,DWORD PTR SS:[ESP+4C]
008CAF69    .  52                PUSH EDX
008CAF6A    .  8D8F DC120000     LEA ECX,DWORD PTR DS:[EDI+12DC]
008CAF70    .  E8 2BF4F4FF       CALL Progra.0081A3A0
008CAF75    .  C68424 A4000000 1>MOV BYTE PTR SS:[ESP+A4],13
008CAF7D    .  834C24 14 40      OR DWORD PTR SS:[ESP+14],40
008CAF82    .  50                PUSH EAX
008CAF83    .  8BCE              MOV ECX,ESI
008CAF85    .  E8 B63CFEFF       CALL Progra.008AEC40    #### FUNCTION CALL ####
008CAF8A    .  EB 02             JMP SHORT Progra.008CAF8E
008CAF8C    >  33C0              XOR EAX,EAX
008CAF8E    >  C78424 A4000000 1>MOV DWORD PTR SS:[ESP+A4],14
008CAF99    .  8B95 F0130000     MOV EDX,DWORD PTR SS:[EBP+13F0]
008CAF9F    .  6A 01             PUSH 1
008CAFA1    .  8D7424 38         LEA ESI,DWORD PTR SS:[ESP+38]

现在我正在尝试了解有关 ASM(调用约定等)的更多信息。 This tutorial 很好,但是上面的函数我还是不知道怎么处理。

函数参数看起来如何?

在函数调用中断时,我尝试通过挂钩“提取”的信息(一个简单的整数)存储在 EBX 中,不幸的是,它没有被访问一次。所以我找了一个函数,这个值作为参数传递,对吧?

【问题讨论】:

【参考方案1】:

函数008AEC40 似乎正在使用thiscall calling convention。第一个参数 this 指针在 ECX 中传递。其余参数按从右到左的顺序压入堆栈。这个特殊的函数,一个 C++ 类的方法,除了它的隐式 this 指针外,只接受一个参数。

【讨论】:

非常感谢。你知道任何关于逆向工程 C++ 应用程序的书籍/教程吗?

以上是关于挂钩内部函数:参数如何?的主要内容,如果未能解决你的问题,请参考以下文章

错误 无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用

错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。 【我还在用函数组件】

React Hooks:在验证时实例化状态挂钩错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用

× 错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用。[ReactJS]

无效的挂钩调用。钩子只能在使用 react-apollo 的函数组件内部调用

useStaticQuery:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用