user-0 提问: C 求助 有关函数相互调用 改变顺序

回复:
user: user-1
content: 引用 17 楼 iamkconghua 的回复:那应该是对你的环境而言，OFFSET的值要变化一下。你如果换成Release版本，还根本运行不了呢。代码都有了，自己搞清楚思想就OK了。 嘿嘿！多谢指点

user: user-2
content: //环境: XP + VC6.0 + Debug/Release模式下通过 #pragma comment(linker, "/SECTION:.text,RW") #ifdef _DEBUG 	#define OFFSET 0x1E #else 	#define OFFSET 0x05 #endif  #include <stdio.h>  void func1(); void func2(); void func3();  int main() { 	func1(); 	printf("\n"); 	return 0; }  void func1() { 	func2(); 	printf("aaa "); }  void func2() { 	func3(); 	printf("bbb "); }  void func3() { 	//int x; 	// your code here 	char *fAddr1 = (char *)func1;	//fAddr1为func1实际代码的首地址 	if (*((char*)func1) == (char)0xE9) 		fAddr1 = (char *)((int)func1 + *((int *)((char *)func1 + 1)) + 5);  	char *fAddr2 = (char *)func2; 	if (*((char*)func2) == (char)0xE9) 		fAddr2 = (char *)((int)func2 + *((int *)((char *)func2 + 1)) + 5);  //	printf("func1	IAT地址: %08x	实际地址: %08x\n", func1, fAddr1); //	printf("func2	IAT地址: %08x	实际地址: %08x\n", func2, fAddr2); //	printf("\n");  	int *pa1 = (int *)(fAddr1 + OFFSET);	//"aaa "的地址 	char *ps1 = (char *)(*pa1);  	int *pa2 = (int *)(fAddr2 + OFFSET);	//"bbb "的地址 	char *ps2 = (char *)(*pa2);  	//交换"aaa "与"bbb "的地址 	*pa1 = int(ps2); 	*pa2 = int(ps1); }

user: user-1
content: 引用 13 楼 iamkconghua 的回复: //环境: XP + VC6.0 + Debug模式下通过 #pragma comment(linker, "/SECTION:.text,RW") #ifdef _DEBUG #define OFFSET1 0x0236 #define OFFSET2 0x028B #endif  #include <stdio.h>  void func1(); void func2(); void func3();  int main() { 	func1(); 	printf("\n"); 	return 0; }  void func1()	//0x00401028 { 	func2(); 	printf("aaa ");	//0040125D+1 }  void func2()	//0x00401023 { 	func3(); 	printf("bbb ");	//004012AD+1 }  void func3() { 	//int x; 	// your code here  	int *pa1 = (int *)((char *)func1 + OFFSET1); 	char *ps1 = (char *)(*pa1);  	int *pa2 = (int *)((char *)func2 + OFFSET2); 	char *ps2 = (char *)(*pa2);  	*pa1 = int(ps2); 	*pa2 = int(ps1); }  顺便向赵大侠致敬. 不是吧，我怎么看到运行结果还是这种情况——

user: user-2
content: 很多代码都是和编译环境有关的，不同的环境，即使代码完全一样，结果也可能不同。例如：以下代码在VC6.0的Debug模式和Relase模式以及VS2008下的结果都有所不同。  #include <stdio.h> void main() { 	int n = 0; 	printf("%d %d %d\n", ++(++n), ++(++n), ++(++n)); }

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3

user: user-2
content: //环境: XP + VC6.0 + Debug模式下通过 #pragma comment(linker, "/SECTION:.text,RW") #ifdef _DEBUG #define OFFSET1 0x0236 #define OFFSET2 0x028B #endif  #include <stdio.h>  void func1(); void func2(); void func3();  int main() { 	func1(); 	printf("\n"); 	return 0; }  void func1()	//0x00401028 { 	func2(); 	printf("aaa ");	//0040125D+1 }  void func2()	//0x00401023 { 	func3(); 	printf("bbb ");	//004012AD+1 }  void func3() { 	//int x; 	// your code here  	int *pa1 = (int *)((char *)func1 + OFFSET1); 	char *ps1 = (char *)(*pa1);  	int *pa2 = (int *)((char *)func2 + OFFSET2); 	char *ps2 = (char *)(*pa2);  	*pa1 = int(ps2); 	*pa2 = int(ps1); }  顺便向赵大侠致敬.

user: user-4

user: user-2
content: 那应该是对你的环境而言，OFFSET的值要变化一下。你如果换成Release版本，还根本运行不了呢。代码都有了，自己搞清楚思想就OK了。

user: user-2
content: 引用 11 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390627329 V5

user: user-0
content: 用macro有可能实现吗

user: user-1
content: 唉，惭愧，想了好久就是没想出来，看楼下有人知道不？

user: user-5
content: 无聊................................................................................................................................

user: user-0
content: 不能用任何输出语句！

user: user-2
content: 那就用puts了。但我估计lz本意不是这样的。   void func3()  {   int x;   puts("aaabbb");  exit(0); }

user: user-6
content: 可以啊，怎么不可以

user: user-2
content: puts行不？

user: user-0
content: bu neng you printf ya...

user: user-7
content: 楼主说不能出现printf。。。

user: user-8
content: void func3()  {   int x;   printf("aaabbb");  exit(0); }  这个？