主页
Top.Mail.Ru Yandeks.Metrika
论坛:“抢”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

向下

从自身确定程序的地址 找到类似的分支


MBo   (2002-03-18 16:13) [0]

在Borland会议上,有一个问题(实际上,在我看来,很荒谬),归结为如何定义Subj。
我是这样做的:
过程TForm1.Button1Click(Sender:TObject);
var p:pbyte;
function DummyFunc:Pointer;
ASM
xor eax,eax
结束;
开始
p:= @ DummyFunc;
inc(p,4);
label3.caption:= classname +“。”+ methodname(p);
结束;
但是,调用此过程外部的函数会更为激进。

功能ACaller:指针;
ASM
mov eax,[esp]
结束;

procedure TForm1.CheckBox1Click(Sender:TObject);
var p,p1:pbyte;
开始
p1:= ACaller;
dec(p1,53); //幻数
p:= methodaddress(“CheckBox1Click”); //用于控制
label3.caption:= inttohex(cardinal(p),8);
label4.caption:= inttohex(cardinal(p1),8);
label2.caption:= classname +“。”+ methodname(p1);
结束;

这有效,但魔术数字当然取决于此程序的序言,可能会有所不同。 我想你可以找到subj的方法(当然除了methodaddress和@procname)。 有什么想法?



VuDZ   (2002-03-18 16:28) [1]

即 在这段代码的记忆中的位置?



VuDZ   (2002-03-18 16:35) [2]

顺便说一句,为什么不模塑 - 这里是应用程序:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

typedef INT (proc)(VOID);

int main(){
void *v = &main;
proc *p = (proc*)v;
try{
(*p)();
}
catch (...) {
printf("Fucked stack :<\n");
}

return 0;
}

简单而有品味:>



MBo   (2002-03-18 16:37) [3]

入口点(在示例中,您可以找到方法的名称)。
即 先推送ebp地址
取决于过程中的内容(例如,字符串)
给ACaller打电话(当我能抓到esp时)不同的距离



MBo   (2002-03-18 16:41) [4]

in-in,只有我想知道没有空虚* v =&main - 即 明确的指示



VuDZ   (2002-03-18 16:51) [5]

你在这里:

int main(){
_asm{
call next;
next:
pop eax;
sub eax, 0x1d;
call eax;

}
return 0;
}



MBo   (2002-03-18 16:58) [6]

在我的第一个例子中这样的东西,只有没有Stack OverFlow;)



VuDZ   (2002-03-18 17:06) [7]

这是我最喜欢的:>
还有别的什么呢? 我不得不使用这些技巧,但为什么呢?



MBo   (2002-03-18 17:11) [8]

只是感兴趣;)



VuDZ   (2002-03-18 17:15) [9]

并且弱化这样的特征:
CLASSA
member int foo();
member float doo():

CLASSB
bool foo();
int doo();

classA A;
a-> doo();

?
刚才有兴趣......



MBo   (2002-03-18 17:20) [10]

声明与成员之间有什么区别?



VuDZ   (2002-03-18 17:23) [11]

好吧,从某种意义上说,你有一个指向一个类的指针,但你需要调用另一个类的方法:
事实上,我不记得它听起来是怎么回事,但它是通过与vtpr调情完成的,而且非常好:>
现在再试一次



VuDZ   (2002-03-18 17:30) [12]

这是一个例子,虽然他不是那样的:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

typedef INT (proc)(VOID);

class A{
public:
int foo() { printf("A::foo()\n"); return 1; }
float doo(){ printf("A::doo()\n"); return 1.0; }
};

class B{
public:
bool foo(){ printf("B::foo()\n"); return false; }
float doo(){ printf("B::doo()\n"); return 0.0; }
};

int main(){
A a;
a.foo();
a.doo();

B * t = reinterpret_cast<B*>(&a);
t->doo();
return getch();
}

结果:
B :: doo()!!! 虽然取自A:>



MBo   (2002-03-18 17:56) [13]

功能TB.Foo:整数;
开始
结果:= 1;
结束;

函数TA.Foo:整数;
开始
结果:= 2;
结束;

过程TForm1.Button1Click(Sender:TObject);
var a:ta; b:tb;
pa,pb:^指针;
开始
a:= ta.create;
b:= tb.create;
pa:= ta.methodaddress(“Foo”);
pb:= tb.methodaddress(“Foo”);
label1.caption:= inttostr(a.foo);
pa ^:= pb ^;
label2.caption:= inttostr(a.foo);
1显示在第一个标签中,2显示在第二个标签中
可以通过vmtMethodTable进行



VuDZ   (2002-03-19 01:51) [14]

它不是......
在这里,这是一个例子,只是不要笑:

class A{
public:
A(int n){
m_nVal = n;
}
int foo(int);
int m_nVal;
void doo(){
printf("doo\n");
printf("m_nVal = %i\n", m_nVal);
}
};

int A::foo(int n){
printf("foo called\n");
printf("%i\n", n);
doo();
return 0;
}

class B{
public:
int i1, i2, i3, i4;
B(){
i1 = 1;
i2 = 0x2;
i3 = 0x3;
i4 = 0x4;
}

void bInit(){
i1 = 1;
i2 = 0x2;
i3 = 0x3;
i4 = 0x4;
}
double foo(){
printf("B::foo()\n");
printf("%i = i1\n", i1);
return 0.0;
}

void v(){
printf("B::v\n");
printf("%i = i2\n", i2);
}

void doo(){
printf("B::doo()\n");
printf("%i = i3\n", i3);
}

void doo2(){
printf("B::doo2()\n");
printf("%i = i4\n", i4);
}
};

class Stub{
};

int main(){
int k = 666;

B b = *reinterpret_cast<B*>(&k); // !!! from integer to class
b.bInit(); // only for variables initialization, nothing more

b.foo();
b.v();
b.doo();
b.doo2();

A n = (A)*(reinterpret_cast<A*>(&b));
n.A(1234);
n.doo();
n.foo(777);

printf("%i\n", k);
return getch();
}


PS因为nA(1234);一个显式构造函数调用,并非所有编译器都会收集它,MS VC ++发送给我一个脚色情旅程,激励它以至于它想要删除它。

关键是,我认为很清楚 - int - > B - > A,一切正常,只需要初始化变量,否则可能会出现故障。 虽然那里没什么特别的。

要控制输出:
B :: foo()
1 = i1
B :: v
2 = i2
B :: doo()
3 = i3
B :: doo2()
4 = i4

m_nVal = 1234
foo叫
777

m_nVal = 1234
666

SYA



Страницы: 1 整个分支

论坛:“抢”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

楼上





内存:0.6 MB
时间:0.025 c
4-81118
SerVS - S.
2002-01-29 14:13
2002.04.25
如何使用API​​禁用ActiveDesktop


4-81108
弗拉基米尔·博洛廷
2002-01-10 20:33
2002.04.25
win2k的透明度


1-80878
恶魔
2002-04-14 10:47
2002.04.25
帮助!!! JPEG到BMP


3-80747
kvcomp
2002-03-31 12:21
2002.04.25
帮助-ee !!!


1-80897
新______
2002-04-14 23:50
2002.04.25
给我可以下载RX库的链接!





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский