basm 操作属性

s11ss 2012-02-14 05:15:47
procedure TForm1.FormCreate(Sender: TObject);
asm//以下两句都不行!
call TWinControl.Handle
call TWinControl.GetHandle
end;


我只是想获得窗体的句柄而已!用basm肿么弄!
...全文
283 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色光芒 2012-02-20
  • 打赏
  • 举报
回复
我的用途和你不一样
我当时是为了能解释执行 Object.Handle这样的文本代码,需要把所有入口地址保存到列表中,你这个研究,具体看用途了.个人观点.:)
s11ss 2012-02-20
  • 打赏
  • 举报
回复
Up~~~
s11ss 2012-02-20
  • 打赏
  • 举报
回复
原来如此啊!呵呵[Quote=引用 23 楼 kiboisme 的回复:]
我的用途和你不一样
我当时是为了能解释执行 Object.Handle这样的文本代码,需要把所有入口地址保存到列表中,你这个研究,具体看用途了.个人观点.:)
[/Quote]
s11ss 2012-02-17
  • 打赏
  • 举报
回复
又学到了![Quote=引用 18 楼 kiboisme 的回复:]
Create+偏移,自然能得到地址,有区别的就是,如果这个类的某些函数没被编译进来,那这个地址就得跟着变动,有一定不可靠因素,甚至连这个函数都没有被编译进来, 这和fHandle地址不一样,对象本身的成员,只要一定义,并且别任意地方引用,不管这个地方是否被编译进来,就回跟随Create一起申请内存,而函数地址就有不好说了。

NIL通过是D7
忘记说了,我最常用的是D7
[/Quote]
蓝色光芒 2012-02-17
  • 打赏
  • 举报
回复
Create+偏移,自然能得到地址,有区别的就是,如果这个类的某些函数没被编译进来,那这个地址就得跟着变动,有一定不可靠因素,甚至连这个函数都没有被编译进来, 这和fHandle地址不一样,对象本身的成员,只要一定义,并且别任意地方引用,不管这个地方是否被编译进来,就回跟随Create一起申请内存,而函数地址就有不好说了。

NIL通过是D7
忘记说了,我最常用的是D7
s11ss 2012-02-17
  • 打赏
  • 举报
回复
要把NIL改成非0常数才能通过编译!

另外我有个方法,就是先获得TWinControl.Create的地址:
const
PPTWinControlCreate: Pointer = @TWinControl.Create;

然后通过这个地址加个固定的偏移量就是TWinControl.GetHandle的地址了!
[Quote=引用 9 楼 kiboisme 的回复:]
如果只是想调用非Pushished属性的Get方法,如GetHandle
还可以这样
procedure Get_TWinControlHandle_Address;
begin
TWinControl(NIL).Handle;
end;

然后分析 函数@Get_TWinControlHandle_Address中的第一个CALL,即可得到GetHandle函数的地址
得到地……
[/Quote]
s11ss 2012-02-17
  • 打赏
  • 举报
回复
我先研究下9L的方法啊!
s11ss 2012-02-17
  • 打赏
  • 举报
回复
原来如此,我在CPU Window看汇编代码的时候就发现那个类所在单元的代码行的编号从几十直接跳到900多,我还以为在其他地方还有那个类的代码呢,原来根本就没编译进去![Quote=引用 14 楼 kiboisme 的回复:]
引用 11 楼 s11ss 的回复:
我先调用成员函数A,发现地址是1;然后我结束程序,修改源码调用成员函数B,发现地址还是1!

给你解释一下为什么.

首先你调用函数A的时候,由于函数B根本没被调用,因此,函数B压根就没编译到Exe中,而你改成调用B时,A又没有被编译进来,不过地址是同一个地址属于巧合,如果在编译函数前,有编译代码长度发生改变,那么函数地址会跟着改变.
[/Quote]
蓝色光芒 2012-02-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 s11ss 的回复:]
我先调用成员函数A,发现地址是1;然后我结束程序,修改源码调用成员函数B,发现地址还是1!
[/Quote]
给你解释一下为什么.

首先你调用函数A的时候,由于函数B根本没被调用,因此,函数B压根就没编译到Exe中,而你改成调用B时,A又没有被编译进来,不过地址是同一个地址属于巧合,如果在编译函数前,有编译代码长度发生改变,那么函数地址会跟着改变.
蓝色光芒 2012-02-17
  • 打赏
  • 举报
回复
确实想知道函数地址,参考第个回复.我是通过这个方法来获取私有函数地址的,用的是hde32分解汇编子句,也可以用Dede的反编译代码部分(已经开源),不过得修改一下,这个反汇编有错误.特殊字句翻译上出现大问题,导致后面的反汇编全部不正确.
s11ss 2012-02-17
  • 打赏
  • 举报
回复
不过数据成员的偏移量应当是固定的,但是成员函数的偏移量就不知道了!
s11ss 2012-02-17
  • 打赏
  • 举报
回复
这个方法我也知道,但是遇到一个情况。我发现在调用我的一个自定义的类的不同的两个成员函数时,地址居然是一样的。就是说,我先调用成员函数A,发现地址是1;然后我结束程序,修改源码调用成员函数B,发现地址还是1![Quote=引用 8 楼 kiboisme 的回复:]
Delphi7下,

Delphi(Pascal) code


procedure TForm1.Button1Click(Sender: TObject);
var
H , H1 : THandle;
begin
H := Self.Handle;
H1 := 0;
asm
MOV EAX , Self;
MOV EAX , [EA……
[/Quote]
s11ss 2012-02-17
  • 打赏
  • 举报
回复
如果非得再写个函数的话,那我不如直接这样了:
function GetTheHandle(Sender: TObject): HWND;
begin
Result := TWinControl(Sender).Handle
end;
以后basm就直接call 它就行了。。。我的本意就是不想再单写函数,定义常量的话是能“忍”的,呵呵

[Quote=引用 9 楼 kiboisme 的回复:]
如果只是想调用非Pushished属性的Get方法,如GetHandle
还可以这样
procedure Get_TWinControlHandle_Address;
begin
TWinControl(NIL).Handle;
end;

然后分析 函数@Get_TWinControlHandle_Address中的第一个CALL,即可得到GetHandle函数的地址
得到地……
[/Quote]
erhan 2012-02-16
  • 打赏
  • 举报
回复
http://blog.csdn.net/jian704/article/details/1767628

看看这个
s11ss 2012-02-16
  • 打赏
  • 举报
回复
不是!请看1L![Quote=引用 5 楼 lzg827 的回复:]
是不是不能直接Call??

楼主参考这个
http://zhidao.baidu.com/question/321081854.html

asm
mov edx, str
call MyShowMessage
end;
[/Quote]
蓝色光芒 2012-02-16
  • 打赏
  • 举报
回复
如果只是想调用非Pushished属性的Get方法,如GetHandle
还可以这样
procedure Get_TWinControlHandle_Address;
begin
TWinControl(NIL).Handle;
end;

然后分析 函数@Get_TWinControlHandle_Address中的第一个CALL,即可得到GetHandle函数的地址
得到地址后,就可以构造类方法来任意调用了,这里得用到反编译或者,根据情况直接访问@Get_TWinControlHandle_Address的地址字节来获取,后着需要根据情况来分析.
蓝色光芒 2012-02-16
  • 打赏
  • 举报
回复
Delphi7下,

procedure TForm1.Button1Click(Sender: TObject);
var
H , H1 : THandle;
begin
H := Self.Handle;
H1 := 0;
asm
MOV EAX , Self;
MOV EAX , [EAX + $180]
MOV H1 , EAX;
end;
if H<>H1 then
Caption := '失败';
end;

D2010中,$180则要改成$258
至于$180,$258怎么来的,既然研究BASM,就自然得研究一下偏移量了.
其他版本没作研究.
lzg827 2012-02-15
  • 打赏
  • 举报
回复
是不是不能直接Call??

楼主参考这个
http://zhidao.baidu.com/question/321081854.html

asm
mov edx, str
call MyShowMessage
end;
lzg827 2012-02-15
  • 打赏
  • 举报
回复
汗。。。看到了,在下面
“只是想获得窗体的句柄”
lzg827 2012-02-15
  • 打赏
  • 举报
回复
先帮顶了。楼主能说下要实现的功能吗?
可能是我对这一块太不了解,这两行代码没看明白。。。 见笑了。。。
加载更多回复(1)

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧