第九课 回顾以上本地注册机制的重要部分,并为下半部分的网络验证机制做出讲解

          回顾以上本地注册机制的重要部分,并为下半部分的网络验证机制做出讲解
 
以上课程中,主要提及到的指令分别是
 
MOV 赋值
 
CMP 比较
 
TEST 比较
 
JMP 无限跳
 
NOP 空指令
 
对于部分程序,我们课程中更多是运用寄存器去破解
 
这里给大家一个简单的总结
 
对于C++ VC8 MFC DELPHI 以及易语言
通常是针对EAX的值进行比较判断,所以在我们跟踪过程中,需要更多的去关注EAX
 
00401510  |.  E8 02030000   call 小生我怕.00401817
00401515  |.  8945 F8       mov [local.2],eax
 
00401518  |.  8B45 F8       mov eax,[local.2]                        ;  kernel32.7C817000
0040151B  |.  E9 00000000   jmp 小生我怕.00401520
 
 
 
就列入以上代码他是通过CALL,传递出来的信息放入EAX,那么也就是说,CALL就是关键,我们需要寻找他多处调用的地方时,也可以给CALL内的EAX采取赋值
 
 
那么以上几种语言,通常采用0或者1作为核心的判断
 
这是系统默认的,所以当编程出来之后,通常未做修饰判断的代码,都默认为1和0比较
 
极少数程序,会采用其他的进行比较,但是这种比较,通常都是在寄存器的各种转换中完成的
 
然后VB的程序,主要是以 -1 和 1进行比较
 
十六进制的-1也就是FFFF 如果有不知道的朋友可以采用计算器换算
 
 
 
 
 
 
 
 
我们还学到了
 
利用所有常量, 所有命令,以及所有模块间的调用
 
这些是针对部分程序,常量值,我们归纳为以下
 
00401534  |.  E8 759C0000   call 小生我怕.0040B1AE
 
这里CALL 0040B1AE
 
这个0040B1AE也就是我们的常量,也就是不变数
 
当他运行起来之后,都不做变化的地址就称之为常量
 
004019BA  |.  8B1D FCD24C00 |mov ebx,dword ptr ds:[0x4CD2FC]
 
004CD2FC也称之为常量
 
004019F2    895D F8         mov dword ptr ss:[ebp-0x8],ebx
004019F5    FF75 FC         push dword ptr ss:[ebp-0x4]
 
而这种则不是常量类型,他是寄存器的内存换算
 
当我们发现这种指令时,可以忽略之
 
 
所有命令,是针对一部分程序,他调用的,不论是内存计算常数还是常量
他都可以通过查找所有命令去搜索得到,也就和我们记事本的查找重复命令是一会事的
 
所有模块间调用,是便于锁定到某种API指令的作用以及调用
 
对于未知且可疑的API大家可以百度百科
 
API不一定要记牢,我们不是编程,需要时可以百度
 
当然日常所用的API,我们可以记个大概
 
 
advapi32.RegOpenKeyExA
 
advapi32.RegCloseKey
 
user32.MessageBoxA
 
点击窗口中的目标文件,即可把他分类派别
 
 
另外需要提出一点就是我们下断点时,下BPX就是把所有调用那个API的地址上全部下上断点
 
我们下BP时,只是针对系统领域去下,届时还需AIT+F9返回到用户代码
 
方可继续进行调试
 
我们学到的调试技巧,还有回嗍
 
另外还有死码特征定位
 
 
 
 
33 C0 C3 90 85 DB 75 03 33 C9 C3 8B 0B 83 C3 04 85 C9 74 0F 8B 03 83 C3 04 49 74 05 0F AF 03 EB
F5 8B C8 C3
 
 
这样的一串就叫死码特征
 
 
00401006   /75 03           jnz short 小生我怕.0040100B
 
列入这一句,他是不计算在死码特征内的,但是他只是一个小跳转,所以他的机器码,不管是怎么修改地址,他都只是75 03
 
超出3个字节的代码,都不列入死码特征之内
 
还有针对部分会改变的地址,为了方便,我们可以根据他对应的机器码
 
004010C6    51              push ecx
 
8D 3C 24 ??????????????8D 75 08 8B 1E 83 C6 04 51
 
每两个问号代表一个字节,我们也可以通过问号去代表会改变的数值,也可以通过问号去代表着寄存器换算的数值,只需要前后左右,照顾周全就OK,PUSH 是不会改变的,但是他也会因为PUSH的值不同而有所改变,所以,我们要根据实际的情况
 
CALL 他的机器码就是FF 15
 
或者E9 E8
 
JMP FF25
 
 
稍后我会给大家补上,这个汇编机器码转换对应的工具,利用于查找死码特征
 
另外我们还学到了解码时机问题
 
每一个程序,被压缩后的代码,都是不清晰的,调试程序时的代码,可以看出来是有规律的
 
而乱码大家是看得很明白的,如果不懂的,可以先把程序运行起来之后,记住需要观察解码的
 
前面一到两句代码,当出现了那一到两句代码时,也就是 解码完毕
 
SEND 发包
 
RECV 收包
 
WSAsend发包
 
 
CONNECT 这个是取IP地址
 
对于我们本地验证时,非常重要,可以通过此API对IP进行转向
 
还有就是网络验证的程序,通常都采用加密封包的形式去进行验证,并且也有时间效应,不是
 
那么本地到的,需要了解算法之后,去猜解他
 
转向IP的方法大致分以下几种
 
改HOST
 
改HOST对于现在的网络验证已经OUT啦
 
 
改本地IP
 
改本地IP对于路由器和网吧是行不通滴
 
路由器的话需要添加虚拟网卡
 
网吧直接蛋疼
 
 
所以这里就需要相应的编程基础,采用HOOK
 
我们可以通过HOOK CONNECT 使IP得以转向
 
所以在我们破解过程中,以上三个函数,都被多数程序用到
 
 
 
 
拦截的函数  socket ,bind ,listen ,accept ,AcceptEx ,WSAAccept ,connect ,send ,WSASend ,recv ,WSARecv ,WSARecvEx ,closesocket
 
想快速找到验证,以上的API是最好的断点,当然也可以采用我们第八课所说的获取硬件特征的方法去锁定他
 
 
 
 
 
针对部分加密封包,还可以通过HOOK住参与加密的字串进行修改
 
针对于目前的 网络验证趋势,我们可以根据他的验证类型,首先去找一份无壳版的,然后根据对应的特征去修改,也就是获取死码查找法
 
 
 

猜你喜欢

转载自blog.csdn.net/zang141588761/article/details/81043013