关心反跟踪的朋友,可进来看一篇不错的文章.

LWH006 2003-12-01 09:16:54
我想在自己的C++加入这些代码,但不知道如何把它整理成完整的片断,请高手帮忙,谢谢!
如果能用C++改写就再好不过了!
也欢迎有相同需求的网友共同探讨。



以下是原文:
--------------------------------------------------------------------------------
Crunch v1.1中的一段有趣的反跟踪代码

【声明】
我写文章以交流为主,希望大家在转载时能保持文章的完整性。

【前言】
这是在对Crunch.EXE脱壳时发现的一点有趣的东西,就写了出来。其中利用一种特殊的方法---修改LDT表来进入Ring0级,
然后在Ring0级检测Test_Debug_Installed标志来判断当前是否有调试器跟踪,这种反跟踪方法不用区别调试器的类型。
SoftICE、TRW2000、天意都可以检测到,怎么样?有点意思吧。不过如果你要对付这种外壳加密软件的话,就要小心一点
了,别被当得死死的哦。:-)

作者: ljttt
写作日期: 2000-10-02

1、前面的大部分分析过程同《对Crunch v1.1加壳程序的手动脱壳及反跟踪代码的一点分析》一文中所述,这里就不多说了。

2、跟踪到如下代码处,我们的目标开始了!
015F:0066C266 53 PUSH EBX
015F:0066C267 E8C9100000 CALL 0066D335
015F:0066C26C 5B POP EBX
015F:0066C26D 899D683C0000 MOV [EBP+00003C68],EBX
015F:0066C273 BB76060000 MOV EBX,00000676
015F:0066C278 03DD ADD EBX,EBP
015F:0066C27A 899D643C0000 MOV [EBP+00003C64],EBX
015F:0066C280 BB050A0000 MOV EBX,00000A05
015F:0066C285 03DD ADD EBX,EBP
015F:0066C287 FFD3 CALL EBX <--内有反跟踪代码
015F:0066C289 90 NOP
015F:0066C28A 60 PUSHAD
015F:0066C28B BB85230000 MOV EBX,00002385
015F:0066C290 03DD ADD EBX,EBP
015F:0066C292 53 PUSH EBX
015F:0066C293 FF950A210000 CALL [EBP+0000210A]
015F:0066C299 8985F6160000 MOV [EBP+000016F6],EAX

3、在 CALL EBX 处按F8键进入看看
015F:0066C9FF FFA56C3C0000 JMP [EBP+00003C6C]
015F:0066CA05 8CD8 MOV AX,DS
015F:0066CA07 A804 TEST AL,04
015F:0066CA09 740F JZ 0066CA1A
015F:0066CA0B 8DB51B0A0000 LEA ESI,[EBP+00000A1B] <--ESI=0066CA1B(这是检测程序入口的地址
015F:0066CA11 BB460A0000 MOV EBX,00000A46
015F:0066CA16 03DD ADD EBX,EBP <--EBX
015F:0066CA18 FFD3 CALL EBX <--还要继续深入
015F:0066CA1A C3 RET

4、在 CALL EBX 处我们继续按F8键进入看看,这样我们就到了关键处
015F:0066CA46 60 PUSHAD
015F:0066CA47 53 PUSH EBX <--这里实际上是为了留出空间保存GDTR的内容
015F:0066CA48 0F014424FE SGDT FWORD PTR [ESP-02] <--获取GDTR的内容(6个字节)
015F:0066CA4D 5B POP EBX <--EBX=GDTR的4个字节的内容,实际上就是GDT的基地址
015F:0066CA4E 33C0 XOR EAX,EAX <--EAX=0
015F:0066CA50 0F00C0 SLDT AX <--获取LDT表的选择器到 AX 中
015F:0066CA53 24F8 AND AL,F8 <--限定AL大小
015F:0066CA55 03D8 ADD EBX,EAX <--获取LDT表在GDT表中的偏移地址
015F:0066CA57 8A6B07 MOV CH,[EBX+07] <--获取第8个字节
015F:0066CA5A 8A4B04 MOV CL,[EBX+04] <--获取第5个字节
015F:0066CA5D C1E110 SHL ECX,10 <--移动到高位
015F:0066CA60 668B4B02 MOV CX,[EBX+02] <--获取第3-4两个字节,此时ECX组合成为LDT表的基地址
015F:0066CA64 8D7908 LEA EDI,[ECX+08] <--获取LDT表第9个字节偏移地址指针
015F:0066CA67 FC CLD
015F:0066CA68 8BC6 MOV EAX,ESI <--EAX=ESI=0066CA1B
015F:0066CA6A 66AB STOSW <--保存两个字节,即CA1B到EDI指向的地址
015F:0066CA6C B8280000EC MOV EAX,EC000028 <--EAX=EC000028
015F:0066CA71 AB STOSD <--保存四个字节,即EC000028到EDI+2指向的地址
015F:0066CA72 0FA4F010 SHLD EAX,ESI,10 <--把ESI=0066CA1B进行移位,得到0066
015F:0066CA76 66AB STOSW <--保存两个字节,即0066到EDI+6指向的地址
015F:0066CA78 61 POPAD <--以上这些指令为了形成LDTR,使之指向0066CA1B,为以下的调用作准备
015F:0066CA79 9A000000000F00 CALL 000F:00000000 <--该调用实际上指向的015F:0066CA1B处
015F:0066CA80 C3 RET

5、我们在 CALL 000F:00000000 处按F8键继续跟踪分析
015F:0066CA1B 60 PUSHAD
015F:0066CA1C 33C0 XOR EAX,EAX
015F:0066CA1E BF3B0A0000 MOV EDI,00000A3B
015F:0066CA23 03FD ADD EDI,EBP
015F:0066CA25 CD20 INT 20 VXDCall Get_DDB <--判断DDB
015F:0066CA2B 7502 JNZ 0066CA2F <--关键了!
015F:0066CA2D CD19 INT 19 <--超度
015F:0066CA2F CD20 INT 20 VXDCall Test_Debug_Installed <--判断是否安装了调试环境
015F:0066CA35 7402 JZ 0066CA39 <--关键了!
015F:0066CA37 CD19 INT 19
015F:0066CA39 61 POPAD
015F:0066CA3A CB RETF

【后记】
这种检测跟踪的方法比较新鲜(对我来说^_^)。我想这种方法可以检测调试环境,比单纯的检测SoftICE跟踪来得更有意思。
--------------------------------------------------------------------------------
...全文
183 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon_z 2003-12-06
  • 打赏
  • 举报
回复
to codewarrior(会思考的草)
有没有办法弄到 可以用的幻影加密系统
leon_z 2003-12-06
  • 打赏
  • 举报
回复
楼主,走自已的路,让别人说好了
leon_z 2003-12-06
  • 打赏
  • 举报
回复
支持 codewarrior(会思考的草)


UP一下
会思考的草 2003-12-06
  • 打赏
  • 举报
回复
加壳软件排行第一的当属AS系列,包括ASPack和ASProtect。可以看到,它们在反跟踪方面,较多地运用了各种加密算法,并且采用了变形引擎,这方面基本上是没有C++源码的,而且这些作者基本上都是使用汇编写程序。下面是caspr对它们的介绍:
ASPack是一个非常好的win32程序加壳程序,自从v2.11版本后ASPack一直使用Win95.Marburg的算法器。ASProtect是一个非常强劲的win32程序保护器,它包含了压缩、加密、反调试代码、反汇编、校验和检测、反dump等功能,它使用非常高效的加密算法如Blowfish,Twofish, TEA等等,并且使用著名的公开密钥算法RSA1024 - 一个世界上非常著名的公开密钥算法理论。算法作为产生注册号的手段,它通过API钩子包含输入表钩子和输出表钩子与应用程序进行通信。然而,自从v1.1版本后,ASProtect使用了Win95.Marburg的算法器,ASProtect V1.11c版加入了反API钩子代码和BPE32的算法器。
laomai 2003-12-06
  • 打赏
  • 举报
回复
支持楼主!可以交个朋友吗?我的QQ:29985091
LWH006 2003-12-06
  • 打赏
  • 举报
回复
再次謝謝各位的大力支持.
注冊算法方面,我用的是DES+RSA1024 .說到這RSA想多說兩句. 在看雪論壇上發現有一些號稱破解RSA的文章,嚇我一跳:那不是我的算法還得重新來過? 看到最后,原來作者使用的模數N太小,最多的一個才132bit,這都是目前電腦的計算能力之內的事,破解者借助一些rsa工具,用窮舉法一會儿就就把你的私鑰E算出來了.所以我覺得這就是軟件作者的失職,破了是活該.RSA依賴的就是大數質因素分解的難度,如果你給的數不夠大,那就失去了RSA本來的意義了.
本人有自知之明,就是缺少反跟蹤反調試代碼,一定要補上我才會放它出去.各位知道嗎,我曾看到一篇破解文章,破解完了后他罵軟件作者是"蠢豬",就因為算法太過簡單,自我保護不力.
我會用到加殼軟件,只是目前的那些好象都有脫殼工具,所以不能全依賴它,而且它的"反/防"代碼應該都在殼里頭,去了殼就什么也沒有了.如果能把反跟蹤代碼分散放在軟件主體中多處位置,使用多種"反"的方法混合,隨機調用檢測,破解的難度就大些.
破解者的几大步聚是:(1)運行被破解的軟件,(2)激活跟蹤調試工具,再下斷點什么的. 如果跟蹤調試工具運行不起來,或主體軟件檢測到有敵人存在就退出,那破解者也就無從下手了.特別是軟件在剛運行的初期就檢測是否在內存中埋伏有敵人,這個時候調試工具還未激活,任由你運行,不會有斷點攔截,所以是重中之重. ----這是本人的一點理解,還請各位指正.
前面codewarrior(会思考的草)已經歸納總結出了8種防跟蹤的方法,大家看這樣好不好:我們一起來努力,一個人主攻一種方法,看能否 寫出/找出 C++代碼的範例,都把代碼貼出來,然后這些代碼可以為大家所用,只是在引用時,要各自加入一些垃圾代碼(這也是反跟蹤所必須的),從而可以避免千篇一律.
第一種方法我先來嘗試,試好了之后我就發上來,估計最遲明天.大家覺得這樣好嗎? 如果同意的話,請認領上面剩下的7個之一,認領后也在此說一聲,以免多重認領.

laomai(老迈):很樂意和大家交朋友,遺憾的是我沒有QQ,我的Email是 :sinohero@szonline.net
感覺上,大家熱心關注我的問題,為此聚集到一起,我們已經是朋友了,謝謝各位!
syl5005 2003-12-05
  • 打赏
  • 举报
回复
好好好,菜鸟就要是这个样子,我赞成
LWH006 2003-12-05
  • 打赏
  • 举报
回复
谢谢楼上的每一位!
rior(会思考的草):您的解答简直就是反跟踪大全,非常有用!您指出的一些发帖子的注意事项,我已记住,谢谢您的提醒。
在此承蒙各位对此问题的关注,我把我目前遇到的问题向大家交个别底吧:
我用C++写了一个小软件,需要加密(不妨假设还值得去加密吧)。看了一些文章,按照文章中指出的自我保护要点,感觉就是反跟踪这一块缺失,根本没有相关的代码,而其它方面都基本有所注意了,比如注册码不要明码比较、不要用对称算法、要分阶段校验而不是一次完成、注册失败后或对非注册用户不要提示一些信息、可多几处校验、字串不用明文,文件也要压缩并自校验以防暴破,... 。不期望永远不被人破,但如果软件作者该做的事没做足,就是失职,破了活该,所以决心补一下这方面的代码。去看雪论坛上搜了些相关帖子,也下载了Crack5.zip来读,大多是讲如何破解的,当然也会触及一些软件的保护手段,但都只是些思想方法的文字说明,和零散的汇编代码段,却没有C++的,不能为我所用。上学时学过早期的8086宏汇编,以后没用过,要在短时期内恶补汇编知识达到可以把汇编改写为C++的水平,怕是没有可能。
另外也觉得,玩破解,和从正面写软件,根本就是两个行当。如果精于破解,再回头写程序保护软件,那是再好不过了。但估计有此能力的人只是少数,起码我在短期内做不到,所以就上这来求点现成的了。
目前大多数加壳压缩软件中,应该都含有反跟踪代码,但它在壳中,如果被脱壳呢?所以我想在主体中也加入一些,混合多种可能的方法。这就是我目前的想法,还请有源码的朋友伸出您的援手!当然我自己也会进一步地搜集整理。谢谢!
rior(会思考的草) 是位谦虚的人。
sunsys 2003-12-05
  • 打赏
  • 举报
回复
相互体谅一下,闻道有先后,术业有专攻。
不管一流、二流、三流,大家不都还是中国的程序员吗?都不容易!
xiaohedou 2003-12-05
  • 打赏
  • 举报
回复
同意codewarrior(会思考的草)!
会思考的草 2003-12-05
  • 打赏
  • 举报
回复
请看看雪论坛上关于“高手和摆架子”的声明:
不管什么时候,论坛上总是有那么几个人说--高手摆架子,高手不愿降低身份....其实,是这么一回事吗,人都是有感情的,这么说真的很伤人!
但是说实话,问问题的人有两种人才会这么说:
1.有些问题,回答了几十上百遍的,稍微看一看faq或者是查一下资料就能解决的,总是要搬到这里来问,自己说说这样合不合适!
比如说这两天的那个问winxp下hmemcpy不管用的那个问题吧,应该是尽人皆知了吧,我这总是看得都已经看烦了,多长时间的老问题了,还问,很多人都没有心情再回答了,难道这种问题的答案你真的找不到???如果找不到的话,奉劝一句,回家play game去吧,别crack了!

2.自己问了问题过了一段时间没有答复,就开始心里难受进而抨击.
比方说那个jinshen,20:17发的贴子,到21:08就自己回复了,就因为在这还不到一个小时的时间里没人回复,就说--"这么快就沉底了?没人回?不屑一复?高人对这种问题都是这种态度? "!!你自己说说这样说好吗?你就能保证这50分钟里夜月或者是其他的汇编高手就在,他们有24小时在线并随时刷新答复问题的义务吗!上论坛的总是每天抽一定的时间来大体浏览一下,有太多时间的应该很少!

所以说,遇到问题先自己查资料(查资料都不会的话还学什么pc啊!)
自己的贴子没有答复的时候,先看看自己的问题是不是具有一定的限制性,是不是只有一小部分人能回答的,如果是的话那就看看时间,总要留个充足的时间吧,如果贴子沉了就自己顶!如果问题得当,不会没人回答的!

希望以后不再看到这种话语,毕竟谁都没有回答你的问题的义务,谁上网不是自己花钱啊,谁的时间不是自己掌握非常宝贵啊,而且这种话语确实让人感到非常的不舒服!
会思考的草 2003-12-05
  • 打赏
  • 举报
回复
不过凡是方法,就有对策。就像矛和盾的关系,永远没有尽头的。所以不要期望能找到一劳永逸的反跟踪和反调试的方法。就算能禁用INT3,DRx,硬件实体模拟器一样可以调试。

另外二位不要吵得那么凶,谁不是从菜鸟一步一步过来的?并不是高手在摆架子,要知道每天要回答那么多很初级的问题很烦人。就好像CSDN前一段时间有N个人同时问句柄,回调函数这些东西一样。同时我作为个三流的程序员,也希望初学者能多自己独立思考,不要动不动就跑来问人,这种不思考的行为,不论是在一流程序员还是不入流的程序员看来,都是非常讨厌的事情。如果不思考,人还能做什么?
会思考的草 2003-12-05
  • 打赏
  • 举报
回复
目前检测调试器是否存在主要有一下几种方法:
1.MeltICE子类型
类型:检测SoftICE、TRW2000
平台:Windows9x、Windows NT
原理:用CreateFileA( )或_lopen( )函数试图获得SoftICE的驱动程序"\\.\SICE"(Windows9X版本)、"\\.\SIWDEBUG"、"\\.\NTICE"(Windows NT版本)、"\\.\SIWVID"等的句柄,如果成功则说明SoftICE驻留在内存中。

2.VWIN32_Int41Dispatch子类型
类型:检测SoftICE
平台:Windows9x
原理:VWIN32.VxD(其VxD ID为0x002A)提供一个名为VWIN32_Int41Dispatch的VxD service(其service ID为0x002A),系统内核使用此服务来与系统级调试器如WinDBG、SoftICE等进行通信。其中0x4F号子功能是用来查询调试器是否已经驻留内存并能否处理保护模式程序,如果是的话则调试器应返回0xF386。

3.给SoftICE发送命令
类型:检测SoftICE
平台:Windows9x、Windows NT
原理:通过调试中断int 3给SoftICE发送命令让其执行,其中SI和DI寄存器中放的分别是固定值0x4647("FG")和0x4A4D("JM")。AX中存放的是子功能号,值为0x0911则表示让SoftICE执行命令,此时DX指向一个命令字符串如"HBOOT"等。AX还可以为其它子功能号,比如让SoftICE修改断点设置等。

4、BoundsChecker后门
类型:检测SoftICE
平台:Windows9x、Windows NT
原理:这是SoftICE为BoundsChecker留的一个公开的接口,入口参数EBP = 0x4243484B(即"BCHK"),AL =4,如果SoftICE在内存中则应返回AL = 0。

这种方法一般也要结合SEH?(结构异常处理)来实现,否则当SoftICE不存在时就会引起非法操作。

5.ICECream子类型
类型:检测SoftICE、TRW2000
平台:Windows9x
原理:调试器驻留后修改INT 1和INT 3的入口,指向它自己的处理程序,所以入口高位偏移与其他中断不同。其他所有中断入口高位偏移都相同。

6.INT 68h子类型
类型:检测SoftICE
平台:Windows9x
原理:

MOV AH, 43h
INT 68h
CMP AX, 0F386h ;检测此处是否被调试器设置0F386h
JZ SoftICE_is_here

7.搜索特征串
类型:检测SoftICE
平台:Windows9x
原理:通过在内存中搜索SoftICE的特征串来发现SoftICE,这一般要结合SEH一起使用,以防止引起内存保护出错而使得程序被终止。这种方法在DOS下是可行的。由于Windows95之后的操作系统中的每个ring 3进程的地址空间是独立的,使得这种方法受到限制。比如在内存中搜索"WINICE.BR"。

8.IsDebuggerPresent子类型
类型:检测SoftICE
平台:Windows NT
原理:调用kernel32.dll输出的函数IsDebuggerPresent()来检测是否有调试器存在。这个函数只能检查使用Debug API来跟踪程序的调试器,无法检测SoftICE之类的系统级调试器。
LWH006 2003-12-04
  • 打赏
  • 举报
回复
v0v0v(太帅,所以怕给别人造成伤害):
你说得正确,谢谢。
不过你也抬举我了,我哪有二流的水准呢,自认为充其量在六流、五流的位置,因为我学这门语言的时间并不长。
  按照你的说法,来csdn谈技术的都是二流程序员,那不谈技术的人就是一流程序员了。这一流的人,也许可以分三类:A类只看不说,B类既看又为他人解答回答,C类在解问题的同时,末了还要扃一顿提问者。不对呀,这B类C类,归根到底还是在谈技术喔? ... 我都不知道该咋分了。分不下去,不分算了。
我看这cndn也没有开下去的必要了,这么多人在谈技术,都是些二流的家伙,还谈什么谈!
  古人云,闻道有先后。我要是早些年学习电脑(最好是1946年),也可以占个先机了,充当一回C类牛人。不过看样子还来得及,今天我被人扁,将来我扁人,抵销,哈哈,平了!没什么大不了的,只要我的问题有人答,心甘情愿被你扁。
请继续扁,一直扁下去,本二流(认了这个职称)在此再提一个问题:谁会写段比较通用的反跟踪C++代码,可同时在9x/2000下运行,即使用 if else 区分操作系统的类型分别写代码也行。本人确实水平菜得狠,目前这个问题又比较急点,只好象大家讨要现成的。拜托拜托!!!
kaguo 2003-12-04
  • 打赏
  • 举报
回复
??那一流的程序员去哪里?
wujinpinga 2003-12-03
  • 打赏
  • 举报
回复
我对这方面挺感兴趣的,可是水平太差了
v0v0v 2003-12-03
  • 打赏
  • 举报
回复
怪不得别人都说来来CSDN上谈技术的都是二流程序员,看来不假
v0v0v 2003-12-03
  • 打赏
  • 举报
回复
老大,2000下有VXD么,连这都不懂,我看你还是省省吧,一篇很一般的文章,你老还当找到反破解的法宝,别被人笑话了。
LWH006 2003-12-03
  • 打赏
  • 举报
回复
如果用正規的方法進入RANG0,再檢測 Test_Debug_Installed 是不是就很完美了呢? 9X/2000都照顧了 ?
会思考的草 2003-12-03
  • 打赏
  • 举报
回复
没有一点点用处,软件不可能只在9x平台上运行。2000下你再用这种修改IDT表的方法试试看,2000先叫你死得很难看。
要进入0环,还是正正归归写个驱动。彻底防调试的办法还是在int3,int1和DRx上做文章。目前已知的调试器不可能不用到这些东西。
加载更多回复(1)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧