Profil de Jian&Ray 's tim...Jian&Ray 's timesPhotosBlogListes Outils Aide

Blog


23 mars

[分享]我们的程序1.0正式版终于出炉了

经过几天的努力,正式版终于出炉了。
 
由于前台和后台调用和参数传递问题,所以有所延误。
 
不过最后还是聪明滴解决了,通过反向调用参数传递,和空方法返回值函数成功解决。偶也!
 
最后说下看了一点《命令与征服-十年》,TNND怀念啊,太经典了,一定要把红警1任务玩通。。。。。尤其是有一关,就给几条狗,要干掉对方几个工程师那个怎么过啊???我还记得最后那几个工程师有好多机枪兵保护,根本冲不进去。。。。
20 mars

关于Coursework

分别说一下要主意的部分,主要是大家衔接的部分,为了便于以后整合:
1.界面部分可以采用直接读取textfield的方式读取明文,key是固定的,所以不用那么复杂。不过有几个地方要注意:
key是64bit,但是不能直接用ABCD。。。。因为那个就变成字符了,所以存储的时候可以采用0x开头存储。这样就需要一个转换,读入String,然后存到一个一维char数组,然后转换为对应的数字。比如“ABCD”转为‘A’‘B’‘C’‘D’,之后再对char处理,‘A’在char中数字是65(?具体是多少记不清楚了,举个例子),那么对应的key的第一个就应该是65-55=10也就是Hex中的A,以此类推A-F。如果有小写呢?所以首先要把所有转换成大写,就在从String->char的过程做。另外就是数字了,仍然是字符(第二个有个5)对应的ASCII也做同样的处理转换为正确的值。这样就完成了key的处理。一劳永逸的事,反正只做一次。对于明文的输入,采用同样的方法,因为明文也很短。(如果打算从文件读取,那么只要增加文件读取模块就可以了,改动也很小,如果有时间再做)
 
×我听说有做的答案不对,那么很有可能事明文搞错了,因为明文的A不是ASCII,而是0x0A,也就是二进制的1010,即4bit表示。
==============================
2.转置矩阵和流程编写部分
可以直接使用界面编写部分输出的明文16进制数组。置换选择部分只需要少量的计算,应该没问题,关键要仔细,尤其是矩阵别搞错了。
这个部分会用到我编写的sbox部分的结果f(A,Ki),结果是一个32位的整数数组,每4bit一个,一共8个。
 
===============================
3.Sbox部分
我会编写一个方法在sbox的类中,完成32bit输入后处理后输出。
 
===============================
4.key的部分
sbox的部分,我会用到48bit子密钥Ki,可以存成一个二维数组K[16][48],一共16组subkey,每组48bit。
 
=================
编写过程一定要做标记,哪个是测试用的数据,哪个是要用到别人interface的部分。我们的数据交换基本上是通过一个整形的数组,比如初始的明文可以用plainText[]表示等等。置换选择举例(除了界面部分,其他都有):比如要求用原文A中的14个bit作为输出B中的第6个bit,那么就应该是A[14/4]这个数组元素,这个元素应该有4bit,应该选取的算法就是,方法比较笨,但是还算清晰。。。。。-_-!
       int EPosition1;  //the location of element in the array
       int EPosition2;  // the location of such bit in a certain array element
       for(int i=0;i<48;i++)
       {
           EPosition1 = EBS[i]/4;
           if(EBS[i]%4 = 0)
           {
               EPosition1 = EBS[i]/4 - 1; //when EBS[i]=4,8,12,16 the ends should be changed
               EPosition2 = 4;
           }
           else if(EBS[i]%4 = 1)
           {
               EPosition2 = 1;
           }
           else if(EBS[i]%4 = 2)
           {
               EPosition2 = 2;
           }
           else //if(EBS[i]%4 =3)
           {
               EPosition2 = 4;
           }
          
           EOutput_48[i] = EOutput_48[i] + input[EPosition1]&EPosition2;
上面是我这部分的第一个置换选择,其他的可以类推。
 
这样就完成了一个bit位的选择置换,这个方法可以用在以上三个部分
不懂的留言或者msn上说。对于其他小组,欢迎参与讨论。 
 
 
 
18 mars

[转贴]反NP监视原理

觉得很有意思,所以专贴一个。送给那些对破解NP系统感兴趣的Programmer
 
NP=nProtect GameGuard(如果你不知道这是什么,请不要往下看)1K?{Av1e+? WJ\
*******************************************
标题:【原创】反NP监视原理 
作者:堕落天才 
日期:2007年1月3号
版权声明:请保存文章的完整,转载请注明出处[v,Pf        {/U
*******************************************
一、NP用户层监视原理
NP启动后通过WriteProcessMemory跟CreateRemoteThread向所有进程注入代码(除了系统进程smss.exe),代码通过np自己的LoadLibrary向目标进程加载npggNT.des。npggNT.des一旦加载就马上开始干“坏事”,挂钩(HOOK)系统关键函数如OpenProcess,ReadProcessMemory,WriteProcessMemory,PostMessage等等。挂钩方法是通过改写系统函数头,在函数开始JMP到npggNT.des中的替换函数。用户调用相应的系统函数时,会首先进入到npggNT.des模块等待NP的检查,如果发现是想对其保护的游戏进行不轨操作的话,就进行拦截,否则就调用原来的系统函数,让用户继续。bbs.766.com[v4b~wCK{xx7y
    下面是NP启动前user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
8BFF            MOV EDI,EDI
    55              PUSH EBP齐乐乐社区zDe5c[g+j        tX
{3F

    8BEC            MOV EBP,ESP
    56              PUSH ESIlWG%V/MD A4|y8R
    57              PUSH EDI
   8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]|g        Kk(sG
    8BC7            MOV EAX,EDI
   2D 45010000     SUB EAX,145qN,u6KL3xc(g
    74 42           JE SHORT USER32.77D1CBDA
    83E8 48        SUB EAX,48
    74 3D           JE SHORT USER32.77D1CBDA0Q$J/x8gc}u
    2D A6000000     SUB EAX,0A6
    0F84 D4530200   JE USER32.77D41F7C
    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10])~m!|bW
    8B0D 8000D777   MOV ECX,DWORD PTR DS:[77D70080]
    F641 02 04      TEST BYTE PTR DS:[ECX+2],4;W2M1I-al
    0F85 03540200   JNZ USER32.77D41FBE
   
8D45 10         LEA EAX,DWORD PTR SS:[EBP+10]u GB p
    50              PUSH EAX
    57              PUSH EDI齐乐乐社区.m ^ SU/N+^
    E8 FBFEFFFF     CALL USER32.77D1CAC08M Eq*_ f$^
    FF75 14         PUSH DWORD PTR SS:[EBP+14]
    FF75 10         PUSH DWORD PTR SS:[EBP+10]
    57              PUSH EDI
    FF75 08         PUSH DWORD PTR SS:[EBP+8]Q.Y)?&@O1r%M
    E8 ACBFFFFF     CALL USER32.77D18B80
M5Py]i|

    5F              POP EDI
    5E              POP ESI
    5D              POP EBP
    C2 1000         RETN 10
-Z0F/
    而下面是NP启动后user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)bbs.766.com8T^6Rp-W6{ @P
    E9 A69AB8CD     JMP npggNT.458A6630
    56              PUSH ESI齐乐乐社区9lN;z
P7{F1k2B.j-CR$d

    57              PUSH EDI齐乐乐社区W$[ H'Su/j
~@

    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]N/CK X
a

    8BC7            MOV EAX,EDI
   2D 45010000     SUB EAX,145D2]W2i9G$S
    74 42           JE SHORT USER32.77D1CBDA5Z^5{'g5MX.EDV
    83E8 48         SUB EAX,48
    74 3D           JE SHORT USER32.77D1CBDA5@z4x%Z|9l6b
    2D A6000000     SUB EAX,0A6
    0F84 D4530200   JE USER32.77D41F7C        }N2B&Y2UVX7A        f9Wa
    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
    8B0D 8000D777   MOV ECX,DWORD PTR DS:[77D70080]c$dw3b:G.C'}d]#?
    F641 02 04      TEST BYTE PTR DS:[ECX+2],4vEelo
    0F85 03540200   JNZ USER32.77D41FBE
    8D45 10         LEA EAX,DWORD PTR SS:[EBP+10]
    50              PUSH EAX
    57              PUSH EDI
    E8 FBFEFFFF     CALL USER32.77D1CAC0
    FF75 14         PUSH DWORD PTR SS:[EBP+14]D p,{4?%G/unE+u6k_
    FF75 10         PUSH DWORD PTR SS:[EBP+10]
    57              PUSH EDIM,Jg~-c:fd
    FF75 08         PUSH DWORD PTR SS:[EBP+8]"P4Wre"Q2f+Q
    E8 ACBFFFFF     CALL USER32.77D18B80c"|ER/W(iq[%U        e
    5F              POP EDIWDW"h8exP
    5E              POP ESI'b8[zsm7V
    5D              POP EBP:J2t\z%W+Le
    C2 1000         RETN 10齐乐乐社区TO on6D
^o

   
    通过对比我们可以发现,NP把PostMessageA函数头原来的8BFF558BEC五个字节改为了E9A69AB8CD,即将MOV EDI,EDI  PUSH EBP MOV EBP,ESP 三条指令改为了JMP npggNT.458A6630。所以用户一旦调用PostMessageA的话,就会跳转到npggNT.des中的458A6630中去。
二、用户层反NP监视方法
1,把被NP修改了的函数头改回去4T(\C+Z's/J$H`5q
       上面知道NP是通过在关键系统函数头写了一个JMP来进行挂钩的,因此,在理论上我们可以通过把函数头写回去来进行调用。在实际操作的时候,这种方法并不理想。因为npggNT.des也挂钩了把函数头改写回去的所有函数,还有它的监视线程也会进行检校判断它挂钩了的函数是不是被修改回去。因此实现起来很困难,随时都会死程序。
2,构建自己的系统函数(感谢JTR提供)G6y%Ci6k2d0X
       这种方法适用于代码比较简单的系统函数。下面我们看看keybd_event的函数源码1O[0g+x;i;RXj
    8BFF            MOV EDI,EDI                              ; USER32.keybd_event}Zu E(Lzk}wR
    55              PUSH EBP-f
X&Z)O8L'e

    8BEC            MOV EBP,ESP
    83EC 1C         SUB ESP,1C
    8B4D 10         MOV ECX,DWORD PTR SS:[EBP+10]齐乐乐社区.LE        @l ~v
    8365 F0 00      AND DWORD PTR SS:[EBP-10],0/ks+K8A3j        s
    894D EC         MOV DWORD PTR SS:[EBP-14],ECX6W.Tt4CpO;h
    66:0FB64D 08    MOVZX CX,BYTE PTR SS:[EBP+8]
    66:894D E8      MOV WORD PTR SS:[EBP-18],CX
    66:0FB64D 0C    MOVZX CX,BYTE PTR SS:[EBP+C]FLa6S7} ~vP
    66:894D EA      MOV WORD PTR SS:[EBP-16],CX
    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]齐乐乐社区)e(HuuQZ7o
    894D F4         MOV DWORD PTR SS:[EBP-C],ECX7LA9K)h%J1_
    6A 1C           PUSH 1C齐乐乐社区#bz(|%B5WL
    33C0            XOR EAX,EAX
    8D4D E4         LEA ECX,DWORD PTR SS:[EBP-1C]
    40              INC EAX
    51              PUSH ECX
   50              PUSH EAX
    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
    E8 9B8DFCFF     CALL USER32.SendInput$]g
|i&bX(z

    C9              LEAVE
    C2 1000         RETN 10齐乐乐社区.V%JH5U6n#fpE%o

    由上面我们看到keybd_event进行了一些参数的处理最后还是调用了user32.dll中的SendInput函数。而下面是SendInput的源代码;},Z{RD)j;C
    B8 F6110000     MOV EAX,11F66w6f*c4K {
XE

    BA 0003FE7F     MOV EDX,7FFE0300bbs.766.comv1Igt6R
I8u F1o*k M

    FF12            CALL DWORD PTR DS:[EDX]          ; ntdll.KiFastSystemCallbbs.766.com
Z*|o&iExvLPyR

    C2 0C00         RETN 0C
乐社区!y4p
][`p-c[ N6A

    SendInput代码比较简单吧?我们发现SendInput最终是调用了ntdll.dll中的KiFastSystemCall函数,我们再跟下去,KiFastSystemCall就是这个样子了齐乐乐社区]T2E2D2uB/F0W
[

    8BD4            MOV EDX,ESP        @
[]sC x+z6v

    0F34            SYSENTERbbs.766.com@VN$\1tD'[;l0O'k,i
    最终就是进入了SYSENTER。
  bbs.766.comg/cyI3l
    通过上面的代码我们发现一个keybd_event函数构建并不复杂因此我们完全可以把上面的代码COPY到自己的程序,用来替代原来的keybd_event。NP启动后依然会拦截原来的那个,但已经没关系啦,因为我们不需要用原来那个keybd_event了。Dy        v6wm Y
    这种方法适用于源代码比较简单的系统函数,复杂的话实现起来就比较麻烦了。我是没有信心去重新构建一个PostMessageA,因为其中涉及到N个jmp和Call,看起来头都大。 还有在VC6里嵌入汇编经常死VC(这种事太烦人了),我想不会是我用了盗版的原因吧?5c|/\Fa Vm
  c{o7dyZB
    3,进入ring0(感谢风景的驱动鼠标键盘模拟工具)+a6e
]m1O7^z

     由上面可以看到,NP用户层的监视不过是修改了一下系统的函数头,进行挂钩监视。因此,要反NP用户层监视的话,进入ring0的话很多问题就可以解决了。比如WinIO在驱动层进行键盘模拟,npggNT.des是拦截不到的。但是由于NP用了特征码技术,再加上WinIO名气太大了,所以WinIO在NP版本8××以后都不能用了。但是如果熟悉驱动开发的话,自己写一个也不是很困难的事。
     说了那么多看起来很“高深”的东西,现在说一些象我这样的菜鸟都能明白的东西,呵呵,因为这是菜鸟想出来的菜办法。        n)Q(b8YS
    4,断线程D'{:n_.P~V:D` nN
       我们知道NP是通过CreateRemoteThread在目标进程创建远程线程的,还有一点,很重要的一点就是:NP向目标进程调用了CreateRemoteThread后就什么都不管了,也就是说,凭本事可以对除游戏外的所有进程npggNT.des模块进行任何“处置”。这样我们可以用一个很简单的方法就是检查自己的线程,发现多余的话(没特别的事情就是NP远程创建的)就马上结束了它,这样NP就无法注入了。但是由于windows系统是多任务系统,而CreateRemoteThread的执行时间又极短,要在这么短的时间内发现并结束它的话是一件很困难的事。一旦CreateRemoteThread执行完毕而我们的监视线程还没有起作用的话,后果就惨重了,npggNT.des马上把程序“搞死”。因为我们一直试图关闭它的线程,而npggNT.des又拦截了TerminateThread,所以我们就只能不断地“重复重复再重复”去试图关闭npggNT.des的监视线程。如果我们很幸运地在其执行注入代码时就能断了它地线程地话,npggNT.des就无法注入了。这种方法在NP早期版本大概有百分之五十的成功率,现在能有百分之一的成功率都不错了。
5,断线程之线程陷阱$\        gO0n{(X2X[i
      我知道“线程陷阱”这个词肯定不是我首创,但用“陷阱”这种方法来对付NP之前在网上是找不到的。为什么要叫“线程陷阱”?因为这确确实实是一个陷阱,在npggNT.des肯定要经过的地方设置一个“陷阱”,等它来到之后,掉进去自动就死掉了。而搭建陷阱的方法简单得令你难以相信。bbs.766.com%^|g{Z5h ?2m_
       上面我们从npggNT.des的监视原理可以看到,npggNT.des要来挂钩(HOOK)我们的系统函数,这种的方法我们也会,是不是?哪想想,这种挂钩方法需要用到哪些系统函数呢? 打开进程OpenProcess或GetCurrentProcess(因为npggNT.des已经进入了目标进程,所以没有必要再调用OpenProcess,肯定是用后者)、找模块地址GetModelHandle、找函数地址GetProcAddress、改写函数头的内存属性VirtualQuery&VirtualProtect、写内存WriteProcessMemory。嘿嘿,在这些地方设置陷阱就八九不离十了,肯定是npggNT.des干那坏勾当要经过的地方。jk%N$Izf1[C$v
      怎么设陷阱呢?选一个上面说的函数(我没有一一尝试),先自己挂钩(嘿嘿,NP会我们也会)。等到有人调用的时候,先判断当前的的线程是不是我们程序的,不是的话,那就断了它吧(一个ExitThread就可以了)。大概就像下面这个样子
HANDLE WINAPI MyGetCurrentProcess(VOID)//替换掉原来的GetCurrentProcess
{
   DWORD dwThreadId=GetCurrentThreadId();//得到当前线程ID
   if(!IsMyThread(dwThreadId)){//不是我们要保护的线程u8H C!WbF4u
      ExitThread(0);//断了它吧         
 }
   UnhookGetCurrentProcess(); //是我们要保护的线程调用就恢复函数头
   HANDLE hProcess=GetCurrentProcess();//让它调用齐乐乐社区        Ed%s
j6z

   RehookGetCurrentProcess();//重新挂钩
pB6f}R

   return hProcess;   //返回调用结果齐乐乐社区b'Nk/Gq
}
      这种方法去掉npggNT.des的监视是完全能够实现的,但是这个函数IsMyThread(dwThreadId)非常关键,要考虑周全,不然断错线程的话,就“自杀”了。齐乐乐社区k8@)g
Py%?


6,更简单的陷阱?%M8bx:f
         原理跟上面一样,但是我们将替换函数写成这个样子齐乐乐社区ZK`Us%|3~~
HANDLE WINAPI MyGetCurrentProcess(VOID)//替换掉原来的GetCurrentProcess

   HMODLE hMod=GetModelHandle("npggNT.des");
   if(hMod!=NULL){bbs.766.comEmBxg^@$G;Wz2u
      FreeLibrary(hMod);      //直接Free掉它
   }r I7ipxP;_        a`(S
   UnhookGetCurrentProcess(); //是我们要保护的线程调用就恢复函数头
   HANDLE hProcess=GetCurrentProcess();//让它调用AzK:j/Wru
   RehookGetCurrentProcess();//重新挂钩bbs.766.comMS0HH
s2w{"I

   return hProcess;   //返回调用结果^Q8?!c+QVJb
}8]l^am/R7u3jU0^X
     这种方法就万无一失了,不用担心会“自杀”。?]|N)Nn){T
bbs.766.com2k4Hh
P6h

三、总结bbs.766.com EHy+u(s
    由上面可以看到在用户层上反NP监视是不是很简单的事?最简单有效的就是第六种方法,短短的几行代码就可以搞定了。但是不要指望去掉了npggNT.des就可以为所欲为了,还有NP还在驱动层做了很多手脚,比如WriteProcessMemory在用户层用没问题,但是过不了NP的驱动检查,对游戏完全没效果。要在NP下读写游戏内存,说起来又另一篇文章了《如何在NP下读写游戏内存》,请继续关注。齐乐乐社

[问题+解决]关于NOD32和冒险岛OL冲突的问题

严格来说算不上解决。。。。
问题描述如下:
杀毒为NOD32 版本2.70.32,游戏为盛大代理的冒险岛OL,每次启动游戏,一直到选择人物都正常,但是选完人物进入后,黑屏,有背景音乐。如果切到桌面,会看到一个小提示框:SDDynDll.dll文件不存在,请更新。但实际上,这个文件存在。
问题分析,可能是游戏本身有一个GameGuard。赛门铁克的“nProtect技术”,软件就是nProtect GameGuard了,原理就是利用nProtect监控主程序,防止被插入线程等不利于应用程序的操作,经常被用来防盗号,防外挂,防辅助工具等等。但是这个是不是导致冲突的一个原因呢?
换用了Kaspersky后,问题解决,但是,Kaspersky会提示有文件企图隐藏自己,那就是MapleStory.exe!这个是冒险岛客户端的主文件。
 
分析:NOD32 2.5X版通过设置网络就可以解决问题。但是2.70无论怎么设置甚至关掉都不行。因为NOD32在2.70以后新增加的功能中出了反流氓软件外,最让我喜欢的就是反rootkit功能。编写过木马的,或者用过灰鸽子的,或者中过灰鸽子的应该都直到rootkit。联系一下就可以想到,会不会是在程序运行的时候,那个DLL文件插入进程要隐藏主程序文件,原因是为了保护不被木马或者外挂破坏,但是反而被NOD32认为是可疑的木马行为直接封锁掉了。
 

[问题]能ping通但是不能浏览网页,以及不能使用MSN等软件

今天碰到一个比较麻烦的问题,问题描述如下,请高手回答:
1.家里NTL的cable网络,账号密码注册成功
2.modem连通后电脑不能浏览网页,不能使用QQ,MSN等软件。
3.能ping通DNS,也能ping通Google,但是就是不能打开网页
4.直接输入IP地址,仍然不能打开网页(比如google的)
5.Windows自动更新可以工作(不确定,开始调试的时候下载33%,过一会就已经准备就绪,可以更新了。。。。)
6.使用网上流传的Winsockfix不行。
7.驱动已经更新
8.这台电脑在别的地方连接正常
9.modem已经换过,问题依旧。
10.已经杀毒,没有问题,防火墙关闭后问题依旧
11.他们家也有人出了类似情况
 
初步怀疑是modem的问题,但是为什么可以ping通却不能打开网页呢?