Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1353084
  • 博文数量: 416
  • 博客积分: 13005
  • 博客等级: 上将
  • 技术积分: 3297
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 16:26
文章分类

全部博文(416)

文章存档

2014年(1)

2013年(4)

2012年(46)

2011年(64)

2010年(12)

2009年(4)

2008年(40)

2007年(187)

2006年(58)

分类:

2007-09-29 09:35:21

汇编(CRACK)FAQ

                                      

我觉得如果要学好破解,应当先学好以下东西:
1.计算机基本体系结构
2.在1的基础上学好一种汇编语言(主要是Intel x86 CPU的),以及一门高级语言(如C,C++)
3.在2的基础上学习一种平台的API编程(主要是指Windows平台上的API编程以及驱动程序编写)
4.在3的基础上深入学习一种平台(例如看看Undocumented Windows NT)
5.学习破解吧,逆向工程也可以,两者是密不可分的.汇编语言和平台的API是关键的关键,只有学习好这两个东西才能在破解的学习中少走弯路


Q:
问个初级的,汇编指令...

0409F9C . 3C 39 cmp al,39
00409F9E . 77 39 ja short unpacked.00409FD9 ; 高于39,ret
00409FA0 . 69DB 0A000>imul ebx,ebx,0A
00409FA6 . 2C 30 sub al,30
00409FA8 . 0FB6C0 movzx eax,al

IMUL 整数乘法.不懂!

这里的imul是何意?结果有何变化?


A:
有符号数乘法指令IMUL(Signed Integer Multiply Instruction)

指令的格式: IMUL Reg/Mem
IMUL Reg, Imm ;80286+
IMUL Reg, Reg, Imm ;80286+
IMUL Reg, Reg/Mem ;80386+

受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)


Q:
求助

为什么有的VB程序用vbaStrCmp等就可以断下来~而有的就不行呢?
对于没有明显提示或找不到提示文字的CRACKME一般应怎样才能找到关键的地方呢?
请各位赐教


A:
vbaStrCmp不是万能的```可以尝试其它的```如
__vbaVarTstEq
__vbaVarMove
rtcMidCharVar
__vbaLenBstr
__vbaLenBstrB
当然这些也不是万能的```





Q:
“@”或“@@”是什么含义???

A:
@@:

Defines a code label recognizable only between label1 and label2, where label1 is either start of code or the previous @@: label, and label2 is either end of code or the next @@: label. See and .

Q:

@@:
特殊的地址标记.@F表示最接近的下一个@@地址.@B表示最接近的前一个@@地址

q:

1) SHL 逻辑左移.
2) ROL 循环左移.

就是这2个指令 不懂什么意思

A:
HL dest,count

Modifies flags: CF OF PF SF ZF (AF undefined)
.-. .---------------. .-.
|C|<----|7 <---------- 0|<----|0|
'-' '---------------' '-'
Shifts the destination left by "count" bits with zeroes shifted
in on right. The Carry Flag contains the last bit shifted out.

Usage: ROL dest,count
Modifies flags: CF OF
.-. .---------------.
|C|<-.--|7 <---------- 0|<-.
'-' | '---------------' |
'---------------------'
Rotates the bits in the destination to the left "count" times with
all data pushed out the left side re-entering on the right. The
Carry Flag will contain the value of the last bit rotated out.

SHL eax,10
翻译成C就是: eax <<= 0x10;

ROL有点麻烦:
ROL(a, b)是:
a = ((unsigned int)a << b) | ((unsigned int)a >> (32 - b))


Q:
只讨论Access的情况, 我觉得的从功能上说2者一样.
但对upx的壳(如upx 1.25w的主程序脱壳),
"esp定律"的硬件断点好用,而内存acess断点不好用?
这是为什么呢?
谢谢了

A:
硬件断点(hr)好像是使用Ollydbg后出现的术语,应该是用到调试寄存器的,不过,不知道它的内存断点什么原理?softice下没有这样的区分,bpm断点必定要用到调试寄存器。

内存断点是硬件断点应用的一种体现 硬件调试寄存器通过设置可以设置很多方式的断点

内存断点是利用“页异常”来处理,调试器将断点所在页标为"页不存在",
当访问该页时发生页不存在异常,调试器捕到异常后,取出发生异常的地址和断点比较,相等即表示触发了内存断点

如果是 win2k, xp下用 VirtualProtectEx ,把属性加上 PAGE_GUARD 也可

AGE_GUARD 只是操作系统设置的页属性,本质上讲其最后都转换为cpu真正支持的页不存在属性






QUOTE:
Originally posted by 333222 at 2004-6-9 07:05 PM:
请问:命令行下断点,在哪下断点,还bp GetWindowTextA是什么意思,在哪敲。
按F2下断点呀,断下之后用F7或F8热力追综,F7是进CALL,F8不进CALL




引用:
最初由 浪费吧 发布
exe文件都能调试吗,我试过一个自解压的EXE文件,查出是加了UPX的壳,很正常啊!为什么有的人说一定要用解压密码解压呢?有什么不同吗?


你所的UPX加的EXE程序是一自自解压的EXE文件,当UPX解压时是不用密码的,只有当UPX解压后执行自解压EXE文件时,如果该压缩包设有密码,则自解压EXE会提示要用解压密码解压,这个解压不能和UPX的解压混在一起。

引用:
最初由 smTing 发布
路过 顺便问一下
带壳破解和脱光破解有什么区别


带壳破解一般是壳比较厉害很难脱或软件有较多暗桩或自验效或该软件保护措施简单懒的脱壳才采取的一个破解方法。
脱光破解一般是壳比较好脱或软件没多少暗桩或算法保护比较厉害需要Patch采取的一个破解方法。
最后说一句,带壳破解和脱光破解在另一方面说来又没什么区别,什么方法好用就用什么方法破解。




Q:
自解压EXE会提示要用解压密码解压,这个密码可以调试出来吗

A:
基本不能,因为解压缩的密码不同于找注册码(软件的正确注册码会在某处出现),一般解压缩软件都是将你输入的密码作为解密用的Key来使用,所以在内存你只能找到你输入的Key,不会出现正确的Key给你找出来的。而如果你输入的Key不正确,解压出来的东西也不会正确。

引用:
最初由 小虾 发布
基本不能,因为解压缩的密码不同于找注册码(软件的正确注册码会在某处出现),一般解压缩软件都是将你输入的密码作为解密用的Key来使用,所以在内存你只能找到你输入的Key,不会出现正确的Key给你找出来的。而如果你输入的Key不正确,解压出来的东西也不会正确。

假如知道解压密码,可以把他DUMP出来,然后以后不输入密码直接运行吗?


引用:
最初由 4nil 发布

假如知道解压密码,可以把他DUMP出来,然后以后不输入密码直接运行吗?


如果文件可以单独运行我想是没问题的。


最初由 浪费吧 发布
自解压EXE会提示要用解压密码解压,这个密码可以调试出来吗


这需要研究一下自解压文件有密码和没密码时的结构,从中找出规律,ACCESS2000的MDB文件密码就是这样被人弄来的

PS:解压文件与调试是两回事


Q:
小弟在破解一软件时断点已找到可没有发现注册码:
0343527A 50 PUSH EAX----假注册码
0343527B FF15 88354403 CALL DWORD PTR DS:[<&MSVCRT.atol>] ; MSVCRT.atol
03435281 83C4 04 ADD ESP,4
03435284 83C0 7B ADD EAX,7B
03435287 8945 C8 MOV DWORD PTR SS:[EBP-38],EAX
0343528A C745 D8 B051C975 MOV DWORD PTR SS:[EBP-28],75C951B0
03435291 8B4D C8 MOV ECX,DWORD PTR SS:[EBP-38]
03435294 334D D8 XOR ECX,DWORD PTR SS:[EBP-28]
03435297 3B0D E8B64403 CMP ECX,DWORD PTR DS:[344B6E8]--比较
0343529D 74 20 JE SHORT dm.034352BF ---断点
其中的ecx的值不是假注册码有变化,DWORD PTR DS:[344B6E8]是什么意思,请哪位老大能指点一下


我在344b6e8中用d命令没有看到什么有用的东西,还有就是求异或和c语言是的有没有区别,能不能说的详细一点,先谢谢了,再帮小弟一下


A:
atol 函数功能(MSDN):
Convert strings to long

03435291 8B4D C8 MOV ECX,DWORD PTR SS:[EBP-38] ;参与计算的数
03435294 334D D8 XOR ECX,DWORD PTR SS:[EBP-28] ;假码与参与计算的数值异或
03435297 3B0D E8B64403 CMP ECX,DWORD PTR DS:[344B6E8]--比较

DWORD PTR DS:[344B6E8] 是指数据段 344B6E8 地址内的 DWORD 类型的值。例如你把“1234”放在地址 344B6E8 处,这里取的就是 “1234”。按这段代码应该是假码与参与计算的值异或后再与正确的注册码比较。你可以看一下地址 344B6E8 处的数据是什么,然后再与上面那个 EBP-38 地址处的数据异或,就应该可以得到正确的注册码了。


(真注册码+0x7b)^0x75C951B0==(344B6E8里面的值)
-->真注册码=(344B6E8里面的值)^0x75C951B0-0x7b


压缩壳寻找OEP快捷方法

压缩壳压缩代码后 用OD载入后,我们查字符串 一般是查不到什么的,但是等壳解压缩完成后我们可以查找到很多有用的信息,我们找压缩壳的OEP难找的时候,只要在我们认为是OEP的时候 查找下字符串 看出现的注释够不够多 就知道 OEP有没有过了,如果过了,就重新来过再找,不过记住上次的地址 下次在快到的时候再用同样的方法 收缩 OEP地址范围 在不久的将来OEP就会被你发现 ,然后就是DUMP修复。这样的方法我是屡试屡成。


Q:

怎么改下面的值?
如下代码:
0091F0F0 . /7F 0F JG SHORT UClientz.0091F101

0091F0F2 . |E8 E10C0000 CALL UClientz.0091FDD8 ;跟进去的话,太深了

0091F0F7 . |8B15 74FFB000 MOV EDX,DWORD PTR DS:[B0FF74] ; uz.00B0E91C(目前为0,为错误,应该改成5)

0091F0FD |8902 MOV DWORD PTR DS:[EDX],EAX

0091F0FF |EB 0B JMP SHORT uz.0091F10C

0091F101 \A1 74FFB000 MOV EAX,DWORD PTR DS:[B0FF74]

0091F106 . C700 FFFFFFFF MOV DWORD PTR DS:[EAX],-1

0091F10C > A1 74FFB000 MOV EAX,DWORD PTR DS:[B0FF74]

0091F111 8338 00 CMP DWORD PTR DS:[EAX],0 ;比较,DWORD PTR DS:[EAX]为零错误,6正确 ;

0091F114 . 7E 67 JLE SHORT uz.0091F17D ;走向错误,直接爆破,依然出错,固不可爆破,应对DWORD PTR DS:[EAX]里付值

0091F116 . A1 90FEB000 MOV EAX,DWORD PTR DS:[B0FE90]

请问应该怎么把0091F0F7 . |8B15 74FFB000 MOV EDX,DWORD PTR DS:[B0FF74]里面地址[B0FF74]里的值改成其他的数字?



A:

MOV DWORD PTR DS:[0B0FF74],5

d 0xB0FF74
然后在数据窗口里改
阅读(1157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~