首页
社区
课程
招聘
[求助,急]关于万能脱壳机的制做
发表于: 2005-6-13 15:36 9893

[求助,急]关于万能脱壳机的制做

2005-6-13 15:36
9893
最近看到了以前的一篇精华中的<<注入法脱壳>>,感觉可以用来做一个万能脱壳机,但其中用到了Hook技术,并且跟一般的盗号用的实现起来有点不同(难就难在这)。
如果用注入函数法来实现,在注入的函数中一旦引用到某个地址时就会出错,因为注入后的起始地址不是0x400000,我开始用LCC编译的,那个死东西用了一个跳转表来调用API,靠,一个API都不能用。后来改VC,可是也不行(好像函数间调用是通过一个中间的JMP,也需要用到地址。
于是换用DLL注入,可是由于CreateRemoteThread的时候主线和是挂起的,Kernel32.dll没有被映射到内存中,所以无法使用任何API?!
费解昏迷中......

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
2
最初由 cleverboy 发布
最近看到了以前的一篇精华中的<<注入法脱壳>>,感觉可以用来做一个万能脱壳机,但其中用到了Hook技术,并且跟一般的盗号用的实现起来有点不同(难就难在这)。
如果用注入函数法来实现,在注入的函数中一旦引用到某个地址时就会出错,因为注入后的起始地址不是0x400000,我开始用LCC编译的,那个死东西用了一个跳转表来调用API,靠,一个API都不能用。后来改VC,可是也不行(好像函数间调用是通过一个中间的JMP,也需要用到地址。
于是换用DLL注入,可是由于CreateRemoteThread的时候主线和是挂起的,Kernel32.dll没有被映射到内存中,所以无法使用任何API?!
费解昏迷中......

我已经用这种技术来写通用的IAT修复工具拉。不过由于某些原应,没有放出来。关于你说的遇到的一些问题。我可以给你解决方法。
你可以通过修改IAT注入dll或者其他方法,然后暂停当前程序主线程,当然这个工作是在你创见的线程来完成,然后获取每个模块的IAT表,然后我们装入一个这个模块的副本也就是更名,但是不能hook副本的地址,我们修改原来的模块的IAT表,等我们处理后就跳到副本的相应地址,因为2个dll完全相同,所以一般不会出错,当然也有些函数会出错,这个时候就看你怎么处理拉。你可以一直暂停主线程,然后在你自己的线程里做需要的工作,也可以恢复主线程,当然要保证程序不崩溃,难度很高。
这是一种方法,另外的方法就是先修改iat地址表,然后处理完后恢复,再次跳到函数开始,当然,缺点很明显。
如果不想装如dll副本,就建立一个很大的数组,储存你修改了的代码,然后到时候取出来恢复,反正难度不是很大。

BTW:题目好象不合适,因为每种壳方式都不同,比如遇到模拟API什么的,需要特别处理,不能达到完全统一的。但是我们可以尽量的让工具来完成多的工作。
IAT通用修复工具在我回乐山之后放出,同时放出我以前写的一个壳的代码(delphi),虽然思路和sf3一样不过我很快抛弃了这种思路,从新找到了另外一种更好的思路,到时候我放壳的代码,当然能编译,但是不放出加壳程序,代码就给大家研究算拉,同时会发布我的壳Cmprotector 1.0,我现在在另外一个城市,什么都没有,我要看看自己能独立生活多久。
2005-6-14 18:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢啦,回去试试看!
2005-6-15 16:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
又遇到了一点问题:在API重定向过程中,我用到了WriteProcessMemory,而且这个函数间接调用了另外一些函数,所以在重定向这几个函数时会出错。
另:有几个函数并没有包含在kernel32的引出表中,所以可能导致相邻的函数重定向出错
求教解决方法
2005-6-25 17:12
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
5
最初由 cleverboy 发布
又遇到了一点问题:在API重定向过程中,我用到了WriteProcessMemory,而且这个函数间接调用了另外一些函数,所以在重定向这几个函数时会出错。
另:有几个函数并没有包含在kernel32的引出表中,所以可能导致相邻的函数重定向出错
求教解决方法

在被hook后的函数中间尽量少用api,不是说不用.如果用到,就要注意保证堆栈平衡,而且有些函数需要特别处理.另外,有些时候不一定专门用一种hook方法,比如你可以申请一片空间,把函数头代码放进去,然后设置跳转.
2005-6-25 17:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用的是加载副本(听你的建议),然后修改原函数的头,使其跳转到副本,结果发现有些函数总是出错,而且由于有的函数本身太短,所以写入长度要与后面的做差来决定,但是由于部分api不在引出表里,所以在写前面的函数时会覆盖后面的函数头,导致不可预料的奇怪错误。我的dll只用了WriteProcessMemory和fopen/fwrite/fclose,但是要记录所有的kernel32.dll的837个api总是出错,所以我现在只记录LoadLibraryEx/VirtualAlloc/VirtualFree/GetProcAddress,运行正常,但是记录的多了就不行,像HeapAlloc/HeapFree死活过不去。
2005-6-27 13:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顺便问一下:in 2E是干什么的?我的程序有一个错误出现在这,但是,开始所有寄存器的直和原程序是一样的,但执行到此被调试的程序就挂起了
2005-6-27 13:38
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
8
int 2E是win2k/xp的系统调用。netsowell好强,你“独立生活”是给人家公司打工还是自己做生意呢?
2005-6-30 11:33
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
9
最初由 nbw 发布
int 2E是win2k/xp的系统调用。netsowell好强,你“独立生活”是给人家公司打工还是自己做生意呢?

什么也没做,就是每天写写程序,学学东西就行了.无业流民.
2005-7-1 02:07
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
10
最初由 cleverboy 发布
我用的是加载副本(听你的建议),然后修改原函数的头,使其跳转到副本,结果发现有些函数总是出错,而且由于有的函数本身太短,所以写入长度要与后面的做差来决定,但是由于部分api不在引出表里,所以在写前面的函数时会覆盖后面的函数头,导致不可预料的奇怪错误。我的dll只用了WriteProcessMemory和fopen/fwrite/fclose,但是要记录所有的kernel32.dll的837个api总是出错,所以我现在只记录LoadLibraryEx/VirtualAlloc/VirtualFree/GetProcAddress,运行正常,但是记录的多了就不行,像HeapAlloc/HeapFree死活过不去。

对于其他出错的函数我们可以考虑其他hooK方法,比如申请一段内存空间,然后分别存放每个函数的头几个字节,不过要处理好重定位和指令长度关系.
2005-7-1 02:14
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
11
最初由 netsowell 发布

什么也没做,就是每天写写程序,学学东西就行了.无业流民.


那怎么吃饭呢?我想学学,以后好活路。。。。
2005-7-1 11:03
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
12
最初由 nbw 发布



那怎么吃饭呢?我想学学,以后好活路。。。。

每个人都有不同的方法,看自己了.
2005-7-2 14:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最新动态:现在我改进了一下,把获取函数地址和写函数开头分开,可以去掉很多错误,同时大大提高了可以HOOK的函数数量!
2005-7-4 09:43
0
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
14
最初由 cleverboy 发布
最新动态:现在我改进了一下,把获取函数地址和写函数开头分开,可以去掉很多错误,同时大大提高了可以HOOK的函数数量!

恭喜恭喜.继续努力哈.
2005-7-4 15:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
今天我的目标是HOOK过程中和HOOK以后程序自身不使用任何API,顺利实现!(用映射),可是新的问题又出来了:无耻的kernel32输出了13个不属于自己的函数,经确认是NTDLL的,重定向的时候我为了省事直接用等差平稳法算出所有函数副本的地址,所以出错。不过现在我的程序自身应该没有任何问题了,因为HOOK任何DLL中的函数(除了kernel32)都可以正常运行输出调用表,对付kernel中的几个关键函数也没问题,但是全部都HOOK就不行,而且出错在NTDLL中的RtlEnterCriticalSection,现在正在查错,大家有什么建议都来说一下!谢谢啦!
2005-7-5 10:29
0
雪    币: 153
活跃值: (401)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 netsowell 发布

每个人都有不同的方法,看自己了.

生日 February 4, 1988  版主:真是年少有为!我啊
2005-7-25 15:18
0
雪    币: 302
活跃值: (410)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
17
最初由 cleverboy 发布
今天我的目标是HOOK过程中和HOOK以后程序自身不使用任何API,顺利实现!(用映射),可是新的问题又出来了:无耻的kernel32输出了13个不属于自己的函数,经确认是NTDLL的,重定向的时候我为了省事直接用等差平稳法算出所有函数副本的地址,所以出错。不过现在我的程序自身应该没有任何问题了,因为HOOK任何DLL中的函数(除了kernel32)都可以正常运行输出调用表,对付kernel中的几个关键函数也没问题,但是全部都HOOK就不行,而且出错在NTDLL中的RtlEnterCriticalSection,现在正在查错,大家有什么建议都来说一下!谢谢啦!


   这个问题是因为主程序要首先加载msvcrtd.dll,Hook前要确保已经装入了msvcrtd.dll这个东西。另外,我想你hook的这个主程序是debug版本的,否则可能没有msvctrd.dll。
2005-7-28 05:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
哈哈,程序已经出来了,效果还不错,测试中!!
2005-7-29 13:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
有好东东做好了,就放出来用啊。
2005-12-30 00:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
有好东东做好了,就放出来用啊。
2005-12-30 22:33
0
雪    币: 224
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 cleverboy 发布
今天我的目标是HOOK过程中和HOOK以后程序自身不使用任何API,顺利实现!(用映射),可是新的问题又出来了:无耻的kernel32输出了13个不属于自己的函数,经确认是NTDLL的,重定向的时候我为了省事直接用等差平稳法算出所有函数副本的地址,所以出错。不过现在我的程序自身应该没有任何问题了,因为HOOK任何DLL中的函数(除了kernel32)都可以正常运行输出调用表,对付kernel中的几个关键函数也没问题,但是全部都HOOK就不行,而且出错在NTDLL中的RtlEnterCriticalSection,现在正在查错,大家有什么建议都来说一下!谢谢啦!


是有这个问题,RORDbg里makepe的时候也遇到了这个问题,我彻底解决了.
2006-1-9 20:24
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wyx
22
继续学习中。
目前来看,有点深奥
2006-1-11 11:36
0
游客
登录 | 注册 方可回帖
返回
//