如何把delphi函数或过程转化为16进制代码,是函数或者过程,不是字符。。看汇编?能用delphi实现吗?

解决方案 »

  1.   

    只知道用Keil C可以用C语言写程序编译成汇编,Delphi貌似没听说过可以这样
      

  2.   

    在DEBUG方式下,设置断点,进入CPU窗口,就可以看到
      

  3.   

    过程就是地址,设断点,Ctrl+Alt+C 打开cpu窗口
      

  4.   

    函数入口地址假设为 FunStart : Pointer;
    难点在于确定函数结束位置,FunEnd : Pointer;
    不负责任的作法查找指令RET(C3),C2之后2-10(RET n)来表示结束.负责任的作法,检查每条指令,需要处理以下语句
    1.判断跳转语句
    2.跳转地址表
    3.Try结构指令
    4.一些特殊的函数
    5.C3之后如果是1个或者2个90,并且90位置为地址对齐,则肯定是结束(当然用户自己写的汇编过程除外)
    这些跳转地址覆盖的范围,很可能包含在函数中,之所以说很可能,那是因为System,SysUtils等几个系统单元中的函数有把这些指令有用来跳转到其他函数的汇编指令出现.判断出了,FunStart和EndStart之后,就好办了,
    用PChar,再用EndStart-FunStart就得到PChar的长度了,
    之后就是循环整个区域 IntToHex(Byte(P)^,2) 即可转换成16进制了
      

  5.   

    楼主,你是想把过程写到加密狗里面是吧?
    你先把过程封闭到一个DLL中,然后用一个byte数组读出这个DLL,于是,就转成16进制代码了呀。最后你将这个byte数组写到狗里面。
    恢复时,先从狗中读出byte数组,然后把数组写到一个TMemoryStream里面,然后再用动态加载DLL的技术来加载这个流。不需要释放DLL到硬盘。就可供你的exe使用DLL里面的过程。看似一个简单的功能,但实际要操作起来还是要应用好多技术。我没有现成的代码,所以只能给你理论上的支持,而且是绝对可以实现的,只是要花时间给你写,暂时没这份动力。
      

  6.   


    嗯,思路就这样的
    入口地址好确定,用@fun就能得到
    问题在于函数结束的位置或者说函数的Size怎么确定其实还可以在函数尾部嵌入一段汇编来作为函数结束的标记
    类似这样的
    begin
      asm 
        dd 0
        dd 0
      end
    end;然后你搜索这个标记后出现的retn就能确定了,最后copymemory出来……inttohex
      

  7.   

    对对对,如果是自己的函数,直接用标记就行了
    函数最后加上Function ....
    ...
    begin
      ...
      asm
        PUSH $90909090
        ADD  ESP , 4
      end;
    end;然后在函数开始位置往下搜索 #$68#$90#$90#$90#$90#$83#$C4#$04
    在这之后,搜索 C3(RET 1个字节) 及 C2 n(RET n ,2个字节)
    函数就结束了其实这也不保险,如果函数私有变量中,有String,动态数组时,会在函数的end;这句调用字符串清除函数或者数组清除函数,那么寻址中还是可能出现C3,C2的,因此还是要在搜索到90909090之后,取指令长度来判断OP=C3,C2