如何把delphi函数或过程转化为16进制代码,是函数或者过程,不是字符。。看汇编?能用delphi实现吗?
解决方案 »
- 关于飞信WEBSERVICE接口的问题!!!
- delphi7.0中一个窗口中有treeview组件等,才能实现在不改变窗口中的各个组件的打开状态的情况下进行刷新
- DBGridEh如何得到Cells[i, j]??
- 怎么检测xp的外观为经典windows样式?
- 关于窗体继承问题
- 字符串截取
- 请问怎样用delphi执行外部的exe文件?
- ----请用过 dxDBGrid 和 dxComponentPrinter 的弟兄们帮帮忙!----
- 发布delphi应用程序时有哪些文件需要一起打包?
- 关闭程序时为什么会有"Stack Overflow"错误发生????
- delphi怎么转HTML的转译字符?
- 如何找到exe文件中32*32图标的索引号
难点在于确定函数结束位置,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进制了
你先把过程封闭到一个DLL中,然后用一个byte数组读出这个DLL,于是,就转成16进制代码了呀。最后你将这个byte数组写到狗里面。
恢复时,先从狗中读出byte数组,然后把数组写到一个TMemoryStream里面,然后再用动态加载DLL的技术来加载这个流。不需要释放DLL到硬盘。就可供你的exe使用DLL里面的过程。看似一个简单的功能,但实际要操作起来还是要应用好多技术。我没有现成的代码,所以只能给你理论上的支持,而且是绝对可以实现的,只是要花时间给你写,暂时没这份动力。
嗯,思路就这样的
入口地址好确定,用@fun就能得到
问题在于函数结束的位置或者说函数的Size怎么确定其实还可以在函数尾部嵌入一段汇编来作为函数结束的标记
类似这样的
begin
asm
dd 0
dd 0
end
end;然后你搜索这个标记后出现的retn就能确定了,最后copymemory出来……inttohex
函数最后加上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