首页
社区
课程
招聘
[讨论]星际2的防调试手段。
发表于: 2010-3-4 05:28 27119

[讨论]星际2的防调试手段。

2010-3-4 05:28
27119

星际2在启动的时候,会创建2个exe进程。
这两个互相监视,关闭某一个,另外一个都会关掉。并且2个都无法用od附加。

我对比了进城里的那两个exe,虽然都来自一个sc2.exe,但是明显不是一个文件。

首先我先hook了WriteProcessMemory

BOOL __stdcall Dbg::WriteProcessMemory_Hook(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten)
{
	char szBuffer[1024] = "";

	sprintf_s(szBuffer, sizeof(szBuffer), "Process: %x\nBaseAddr: %x\nBuffer: %x\nSize: %x",  hProcess, lpBaseAddress, lpBuffer, nSize);
	MessageBox(0, szBuffer,0 ,0);

	IMAGE_DOS_HEADER* pDos = (IMAGE_DOS_HEADER*)lpBuffer;

	if(pDos->e_magic == 0x5A4D)
	{
		DWORD dwWritten;
		HANDLE hFile = CreateFileA( "C:\\CHNHack.exe", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, NULL, 0);
		WriteFile(hFile, lpBuffer, 0x400 * 8, &dwWritten, NULL);
		CloseHandle(hFile);
	}

	return WriteProcessMemory( hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten );
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (52)
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
星际2爱好者关注中

我转一段话过来,我也看不懂,不知道对你有没有帮助

粗略的看过一下,有一些技术很熟悉,大概就是CreateDebugProcess,
WriteProcessMemory,
Run,
再反过来A到父进程,这样就形成互相调试的进程了,不管是字进程还是父进程都无法带调试器。
想调试也很简单,由于相互调试,异常不会太复杂,模拟子进程很容易。
或者使用某个xxx调试器就可以直接调试了,貌似以前的LifeOdbg处理下也可调试,实在没能力破解,只能等补丁
星际争霸2文件都是没壳的,不过花指令特别多,尤其是b*n.dll。
2010-3-4 06:39
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我已经吧他的子进程dump出来了……
就是CHNHack.exe这个。
他的子进程啥都不是。纯粹就是用来打开的。
我用notepad也是一回事。
我琢磨着老外的模拟器也是卡在这步了,都是卡在了登陆大厅这里了。
那里我hook connect,死活改不掉他的relam的ip.登陆服务器已经搞定了。老外貌似和我一样。
连上relam就挂掉程序。
2010-3-4 07:36
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
他纯粹就是以DEBUG_PROCESS方式加载子程序,然后挂起。子程序屁都没有干,不知道怎么又把自己给DEBUG_PROCESS了。
2010-3-4 07:39
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
至于WriteProcessMemory,只是修改sc2.exe然后重新map加载,就是我dump出来的那个。我吧WriteProcessMemory hook了 return true.也不行。
至于Hook了CreateProcessW DEBUG_PROCESS只要不传,程序就跑不起来,他随便CreateProcessW啥都可以,会挂住子程序,也会挂住自己。
2010-3-4 07:43
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵,希望大家能多多帮助楼主啊

我就纯顶了
2010-3-4 07:43
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
关键就是sc2.exe和子程序不是互相调试
而是sc2.exe不知道为什么要去调试自己创建的一个子程序。然后莫名其妙的吧自己给调试了。
2010-3-4 07:46
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
现在可以确定这么几个东西
1.在子程序没启动前,sc2.exe是可以附加的,没被调试
2.子程序启动后,执行过xxx行f8,sc2.exe就不能附加了,但是子程序屁都没干(非常肯定)
3.如何在一个程序启动后又挂住自己的啊?是啥api?可以取消掉他挂住吗?或者下断nop掉。
2010-3-4 07:52
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
反过来A到父进程,可以这样吗。如果可以就hook函数CreateDebugProcess试试
2010-3-4 09:31
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
老外不是出了个破解 已经过了反调试的 你看看他杂过的
2010-3-4 10:30
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果一个进程已经被调试了,OD貌似就无法再附加了。
你去掉他的DEBUG权限试试。
2010-3-4 13:37
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
9喽:CreateDebugProcess是干嘛的?以前没注意到过这个api...是说DEBUG_PROCESS吧?
DEBUG_PROCESS标志只要不加,星际2就会自动关闭,他这是怎么处理的?有什么思路吗?

10楼:你说的老外破解的那个。我分析过他的了。他是直接在CreateProcessW里调用ExitThread(0);
这样就可以附加调试了。但是不能联网,只要一联网,立马自动关闭。也就是说如果要联网,必须要有一个被调试的子进程

11喽:如何去掉?另,如果B被A调试,B不能被附加我知道,这无所谓,毕竟SC2.exe创建的子程序毛都没干,我直接让他启动notepad.exe游戏也可以正常运行,关键是如果B被A调试,那么A也不能附加?还是做了什么手段?(B被挂起,不可能去调试A,我都用notepad.exe就更不可能了)
2010-3-4 14:08
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
试试拿Ring0的调试器,直接调它,比如说Softice,比如说Syser。当然要注意它有没有用Anti手段。

我觉得只要你调试了一个子进程,Ring3的调试器就不能附加了,不然调试Debug API还不得死锁啊?
2010-3-4 15:10
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
星际2什么时候出来啦?好久没关注了。。。
2010-3-4 15:25
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
回13楼:A调试B,应该是B不能附加吧,A是可以附加的啊。而且B是挂住的,不可能去调试A(因为B用notepad跑结果也是一样),那么A是怎么把自己挂住的呢。我对创建的子进程没一点兴趣,这个完全是暴雪创建出来迷惑他人的,他不能调试就不能调试吧,毕竟他没有一点作用,关键就是如何调试A(SC2.exe)

回14楼:没几天……老外比我早一天发布了单机补丁。心疼啊。他们目前状态和我差不多,只能在不联网的情况下调试,但是这个单机补丁只能和机器人玩,要P V P,只能模拟战网,但是目前的情况下只要附加了调试,一旦联网,程序就挂掉了。

我很不理解这是为什么,
1.在A CreateProcessW B的时候,我附加上了A,这个时候,是可以附加的,但是不能联网,一旦联网,od就卡在某句话了(不是跑飞)。
2.在A CreateProcessW B的时候,返回Null,这个时候,是可以附加的,但是也不能联网,一旦联网,od就卡在某句话了(不是跑飞),不调试只要联网程序也会挂掉,因为他有判断子进程是否还在。

那么,在联网的时候,他应该有判断创建的B是否还存在(这个好解决)以及自己的程序是被自己挂住了还是别的调试器挂住了????(啥思路?)
而且,在联网前他就完成了对自己的挂钩。因为直接让程序跑完A B都不能附加(联网前,bp CreateProcessW之后的xxx行F8都可以 附加,所以也没办法单跟到底是哪句挂住了自己),
2010-3-4 15:38
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
另外有几个比较郁闷的地方:
使用hosts文件修改服务器ip到127,本地127做个socket链接到官方socket,接到啥包都返回回去,客户端在接到第一个包就客户端提示错误了,什么错误的服务器链接,估计有判断是否为正确的ip.

那么我使用ws2_32.dll劫持connect
__asm{
push eax
mov eax,ptr[esp+4]
mov eax,ptr[eax+4]
判断是否为需要跳转的ip
mov ……
pop eax
}

这样转到本地来,然后本地创建一个socket,这个socket链接到官方socket,接到啥包都返回回去
这样就可以模拟了,可是在连接第二个Rleam服务器的时候,程序自动关闭了……

我不服气,我使用动态注入hook connect.
这样程序就不会自动关闭了。可是。连接第二个Rleam服务器,这个ip死活没有被我if到……
我的天网上显示的就是SC2.exe在和服务器进行连接。使用抓包软件也看不到这个链接的存在。。。
要知道,子进程是被挂住的,而且在我使用notepad的情况下,是不可能和服务器进行交互的。那么……?
难不成搞个全局钩子,挂住connect?
2010-3-4 16:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
Lazytown单机可以了,要联网肯定不行,要验证Key的
以前的SC,WC3等都没有破解上BN的
2010-3-4 16:23
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
以前的sc是因为单机本身可以pvp了,所以不需要破解。
我在战网上碰到了Lazytown的人了。
他和我说。dont attack me.大致就是让我挂在那,他在调试。
和他互相交换了一下进度,大家都差不多……

sc2不破解战网不行,不破解就没办法进行p v p……
要知道,大菠萝就有模拟器,wow也有模拟器,他们都是基于battle.net的 至于星际和wc3 完全没必要模拟了……

至于楼上说验证key的问题不大。模拟器就是来做这个工作的,还好我手上有两个实在为数不多的key…… 两个啊。卖掉都值不少钱了
2010-3-4 16:30
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看来是我错了,不过用Ring0的调试器直接进行调试你试过了吗?

另外如果是控制台的程序,它貌似调试会被输入输出阻塞。系统在这方面的处理貌似和Win32规则不同?
你可以调试cmd.exe看看能不能找到在按下键盘的时候,断点中断。没记错的话,应该是不可以的。
2010-3-4 17:36
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
子程序虽然是控制台的,但是被挂住了,而且换成notepad也不影响使用,所以说子程序完全不影响主程序的使用,简直是莫名其妙。
至于ring0…… 我下班回家晚上装个softice试试。说实话。比较害怕,我对softice没什么信心。。。不是很熟……
2010-3-4 17:38
0
雪    币: 205
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
A 创建 调试 B进程,
B虽然无功能,随便换个NOTEPAD也可以
估计A里面还有几个调试的线程,一直在运行时候判断调试的B是否正确
但是为什么B也无法被附加,搂主可以写个这样的程序试试
2010-3-4 19:11
0
雪    币: 205
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
刚说错了
A 创建 调试 B进程,
B虽然无功能,随便换个NOTEPAD也可以
估计A里面还有几个调试的线程,一直在运行时候判断调试的B是否正确

A是不是后来还创建了一个远程线程之类的东西在B里面,动态更改了B的执行代码,然后在B里面调试A?
2010-3-4 19:19
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
回22:我一开始也是这么想的,可是后来我干脆hook了WriteProcessMemory,直接return true了……
B不能附加无所谓的,关键是他自己怎么也无法附加了,很纳闷
2010-3-4 20:17
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
条件1:只要CreateProcessW我直接ExitThread(0),那么,A是可以附加的,不过联网后会报错。
条件2:B程序是挂着的,并且我hook了WriteProcessMemory,直接返回true.所以不可能是B来调试的A

也就是说那么,也就是在CreateProcessW这个线程里,A吧自己给调试了……

有谁知道这样做的做法是如何做到的吗?该怎么下断?
他这种做法还真值得学习,虽然没有壳,更胜一层壳
2010-3-4 20:20
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
25
我原本也很热血冲动地想搞个这,但冥冥之中想起来了两个字:老外。只要有老外在,你就不用搞了,把自己累死也搞不过他们,因为他们天天没事专搞这个,搞出来还要开源满世界发满世界改,所以搞不过他们的,因此,送兄弟两句话:珍爱生命,远离老外。

另外问一下,你们搞这个是为啥?学生没事干还是什么组织内的爱好或者啥别的什么的?
2010-3-4 21:36
0
游客
登录 | 注册 方可回帖
返回
//