-
-
[旧帖] [原创]C++写壳初学笔记之输入表的处理--疑问 0.00雪花
-
发表于: 2014-9-7 17:20 1134
-
看《加密与解密》,书中所说对输入表的处理一般分两步,第一步是加密时转存输入表,第二步是外壳对源程序初始化时不把真正的函数地址入口写回输入表,写回的是外壳程序中的一段程序的入口,通过那段程序的变换后再转到正确的函数入口去执行。
现在的问题是,明白第一步,不明白第二步,书中例子只有第一步的,谁能提供有关第二步的例子吗?
虽然不太明白第二步,但还是说一下自己的理解好了:
首先看一下输入表是怎样被使用的
MessageBox(NULL,text,title,MB_OK);
ExitProcess(NULL);
反汇编
00401000 push 00000000
00401002 push 00403000
00401007 push 0040300F
0040100C push 00000000
0040100E call 0040101A
00401013 push 00000000
00401015 call 00401020
0040101A jmp dword ptr [00402008] ;00402008指向输入表中的A项。
00401020 jmp dword ptr [00402000] ;00402000指向输入表中的B项。
如果把A和B项的值都改为外壳程序中的一段代码入口地址,外壳程序如何才能知道接下来要执行的函数是MessageBox还是ExitProcess?
我的理解是根据栈中call入栈的程序计数器PC的内容,找到jmp dword ptr [XXXXXXXX] ,然后根据XXXXXXXX在转存的输入表中找到DLL名和函数名或序号就可以在加入一些Anti代码后调用了。不过这好像只能用汇编了,C++不能对程序栈操作啊。不明太是不是这回事?
这张图是加密与解密中对输入表处理的描述、
现在的问题是,明白第一步,不明白第二步,书中例子只有第一步的,谁能提供有关第二步的例子吗?
虽然不太明白第二步,但还是说一下自己的理解好了:
首先看一下输入表是怎样被使用的
MessageBox(NULL,text,title,MB_OK);
ExitProcess(NULL);
反汇编
00401000 push 00000000
00401002 push 00403000
00401007 push 0040300F
0040100C push 00000000
0040100E call 0040101A
00401013 push 00000000
00401015 call 00401020
0040101A jmp dword ptr [00402008] ;00402008指向输入表中的A项。
00401020 jmp dword ptr [00402000] ;00402000指向输入表中的B项。
如果把A和B项的值都改为外壳程序中的一段代码入口地址,外壳程序如何才能知道接下来要执行的函数是MessageBox还是ExitProcess?
我的理解是根据栈中call入栈的程序计数器PC的内容,找到jmp dword ptr [XXXXXXXX] ,然后根据XXXXXXXX在转存的输入表中找到DLL名和函数名或序号就可以在加入一些Anti代码后调用了。不过这好像只能用汇编了,C++不能对程序栈操作啊。不明太是不是这回事?
这张图是加密与解密中对输入表处理的描述、
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: