本帖最后由 hotpower 于 2012-11-1 22:40 编辑
下面的主函数里用8种不同的方法来调用某C函数,分别提供了C语句和
Keil正确运行后的跟踪反汇编代码。
方法有人们常用的函数调用和函数指针。还有被圈圈同学称之为“变态的方法”,再就是利用COM接口技术的调用。
从8种方法可以看出,COM接口技术的调用方法非常灵活。
当“变态”(俺称之为“红杏”)和COM结合对提高软件的抗击反汇编的能力
可大为提高。(若再加入“汇编数组”技术,就更可想而知了)
真8种方法都会出现在即将出世的HotTask51中,估计俺会在里面大肆变态地
利用“汇编数组”及COM接口技术~~~
void main()
{
/*------------------------------------------------------
方法1.函数指针数组调用函数(C语言) (20个字节)
-------------------------------------------------------*/
pHotTaskTable[0]();//TaskInit
pHotTaskTable[1]();//Task1
pHotTaskTable[2]();//Task2
pHotTaskTable[3]();//Task3
/*------------------------------------------------------
方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)
-------------------------------------------------------*/
_icall_((void *)TaskInit);//TaskInit
_icall_((void *)Task1);//Task1
_icall_((void *)Task2);//Task2
_icall_((void *)Task3);//Task3
/*------------------------------------------------------
方法3.间接地址调用函数(见菜农的HotIns.h/c) (11个字节)
-------------------------------------------------------*/
_intjmp_(TaskInit);//TaskInit
_intjmp_(Task1);//Task1
_intjmp_(Task2);//Task2
_intjmp_(Task3);//Task3
/*------------------------------------------------------
方法4.函数名调用函数(C语言) (3个字节)
-------------------------------------------------------*/
TaskInit();//TaskInit
Task1();//Task1
Task2();//Task2
Task3();//Task3
/*------------------------------------------------------
方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)
-------------------------------------------------------*/
_icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit
_icall_((void *)iHotTaskTable.pVtbl[1]);//Task1
_icall_((void *)iHotTaskTable.pVtbl[2]);//Task2
_icall_((void *)iHotTaskTable.pVtbl[3]);//Task3
/*------------------------------------------------------
方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
-------------------------------------------------------*/
_intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit
_intjmp_((unsigned int)iHotTaskTable.pVtbl[1]);//Task1
_intjmp_((unsigned int)iHotTaskTable.pVtbl[2]);//Task2
_intjmp_((unsigned int)iHotTaskTable.pVtbl[3]);//Task3
/*------------------------------------------------------
方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
-------------------------------------------------------*/
iHotTaskTable.pVtbl[0]();//TaskInit
iHotTaskTable.pVtbl[1]();//Task1
iHotTaskTable.pVtbl[2]();//Task2
iHotTaskTable.pVtbl[3]();//Task3
/*------------------------------------------------------
方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
-------------------------------------------------------*/
iHotTaskTable.lpVtbl.TaskInit();//TaskInit
iHotTaskTable.lpVtbl.Task1();//Task1
iHotTaskTable.lpVtbl.Task2();//Task2
iHotTaskTable.lpVtbl.Task3();//Task3
HotTaskStart(TaskInit);//装载根任务
}
下面给出软件仿真跟踪的Keil反汇编代码粘贴:
12: /*------------------------------------------------------
13: 方法1.函数指针数组调用函数(C语言)(20个字节)
14: -------------------------------------------------------*/
15: pHotTaskTable[0]();//TaskInit
C:0x002E 9004E6 MOV DPTR,#pHotTaskTable(0x04E6)
C:0x0031 7401 MOV A,#0x01
C:0x0033 93 MOVC A,@A+DPTR
C:0x0034 FA MOV R2,A
C:0x0035 7402 MOV A,#0x02
C:0x0037 93 MOVC A,@A+DPTR
C:0x0038 F9 MOV R1,A
C:0x0039 1204FA LCALL C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA 8A83 MOV DPH(0x83),R2
C:0x04FC 8982 MOV DPTR(0x82),R1
C?ICALL2:
C:0x04FE E4 CLR A
C:0x04FF 73 JMP @A+DPTR
19: /*------------------------------------------------------
20: 方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)
21: -------------------------------------------------------*/
22: _icall_((void *)TaskInit);//TaskInit
C:0x0067 1202DB LCALL TaskInit(C:02DB)
26: /*------------------------------------------------------
27: 方法3.间接地址调用函数(见菜农的HotIns.h/c)(11个字节)
28: -------------------------------------------------------*/
29: _intjmp_(TaskInit);//TaskInit
C:0x0073 9002DB MOV DPTR,#TaskInit(0x02DB)
C:0x0076 1203F3 LCALL _reset_code__(C:03F3)
--------------------------------------------------------------------
_reset_code__:
C:0x03F3 C082 PUSH DPTR(0x82)
C:0x03F5 C083 PUSH DPH(0x83)
C:0x03F7 32 RETI
33: /*------------------------------------------------------
34: 方法4.函数名调用函数(C语言) (3个字节)
35: -------------------------------------------------------*/
36: TaskInit();//TaskInit
C:0x008B 1202DB LCALL TaskInit(C:02DB)
40: /*------------------------------------------------------
41: 方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)
42: -------------------------------------------------------*/
43: _icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit
C:0x0097 AB3F MOV R3,iHotTaskTable(0x3F)
C:0x0099 AA40 MOV R2,0x40
C:0x009B A941 MOV R1,0x41
C:0x009D 1204FA LCALL C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA 8A83 MOV DPH(0x83),R2
C:0x04FC 8982 MOV DPTR(0x82),R1
C?ICALL2:
C:0x04FE E4 CLR A
C:0x04FF 73 JMP @A+DPTR
47: /*------------------------------------------------------
48: 方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
49: -------------------------------------------------------*/
50: _intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit
C:0x00BB AB3F MOV R3,iHotTaskTable(0x3F)
C:0x00BD AA40 MOV R2,0x40
C:0x00BF A941 MOV R1,0x41
C:0x00C1 AE02 MOV R6,0x02
C:0x00C3 AF01 MOV R7,0x01
C:0x00C5 8E83 MOV DPH(0x83),R6
C:0x00C7 8F82 MOV DPTR(0x82),R7
C:0x00C9 1203F3 LCALL _reset_code__(C:03F3)
--------------------------------------------------------------------
_reset_code__:
C:0x03F3 C082 PUSH DPTR(0x82)
C:0x03F5 C083 PUSH DPH(0x83)
C:0x03F7 32 RETI
54: /*------------------------------------------------------
55: 方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
56: -------------------------------------------------------*/
57: iHotTaskTable.pVtbl[0]();//TaskInit
C:0x00FF AB3F MOV R3,iHotTaskTable(0x3F)
C:0x0101 AA40 MOV R2,0x40
C:0x0103 A941 MOV R1,0x41
C:0x0105 1204FA LCALL C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA 8A83 MOV DPH(0x83),R2
C:0x04FC 8982 MOV DPTR(0x82),R1
C?ICALL2:
C:0x04FE E4 CLR A
C:0x04FF 73 JMP @A+DPTR
61: /*------------------------------------------------------
62: 方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
63: -------------------------------------------------------*/
64: iHotTaskTable.lpVtbl.TaskInit();//TaskInit
C:0x0123 AB3F MOV R3,iHotTaskTable(0x3F)
C:0x0125 AA40 MOV R2,0x40
C:0x0127 A941 MOV R1,0x41
C:0x0129 1204FA LCALL C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA 8A83 MOV DPH(0x83),R2
C:0x04FC 8982 MOV DPTR(0x82),R1
C?ICALL2:
C:0x04FE E4 CLR A
C:0x04FF 73 JMP @A+DPTR
菜农HotPower@126.com 2009.2.17 4:10 于菜地成功移植COM接口到51后 |