主题思想:分析jmp jcc 等转移类指令,需找最远的指令地址;寻找ret指令;如果当前指令为ret指令并且为最远指令则函数到达结束位置。

代码:
GetProcSize  proc  uses esi ebx edi pProc:DWORD
;eax    指令长度
;ebx    当前指令
;ecx    函数地址
;esi    当前指令地址,也是当前最远的那条指令地址

  mov    esi,pProc
  mov   edi,esi
  
  invoke  GetCodeSize,esi
  .while  eax
    .if  eax == 2 && ( (byte ptr[esi] > 70H && byte ptr[esi] < 7FH) || byte ptr[esi] == 0EBH )
      movsx  ebx,byte ptr[esi+1]
    .elseif  eax == 5 && byte ptr[esi] == 0E9H
      mov   ebx,[esi+1]
    .elseif eax == 6 && byte ptr[esi] == 0FH && byte ptr[esi+1] > 80H && byte ptr[esi+1] < 8FH
      mov   ebx,[esi+2]
    .else
      .if  (byte ptr[esi] == 0C2H || byte ptr[esi] == 0C3H || byte ptr[esi] == 0CAH || byte ptr[esi] == 0CBH) && esi == edi
        lea   eax,[esi+eax]
        sub    eax,pProc
        ret
      .else
        xor    ebx,ebx
      .endif
    .endif
    add    esi,eax
    test  ebx,ebx
    .if  !sign?
      add   ebx,esi
      .if  ebx > edi
        mov   edi,ebx
      .endif
    .endif
    .if  esi > edi
      mov   edi,esi
    .endif
    invoke  GetCodeSize,esi
  .endw
  xor    eax,eax
  ret
GetProcSize endp
备注:
1、GetCodeSize为lde32长度反汇编引擎。
2、此代码有局限性,不能解析 jmp [xx]指令;由后面jmp 到ret 指令的函数可能不能获取完整大小。但是由编译器生成的大部分都是可以解析的。
    希望大家给点改善的意见,使劲拍砖。