大概就写这么点吧。对于一些新手已经够了。其他比较深的我如果来讲的话可能讲的不是很好也不是很正确。。多看一些别人的教程吧。估计,看完这些东西一般的crackerme和软件应该就是手到擒来了。因此,我就不多写了 给论坛节省资源。
顺便晒下偶像。Cracker中偶像是fly 传闻抱得美人归后就隐退了。。Cracker界的一个损失
Hacker小榕。在我看来小榕是一个比较纯粹的Hacker 没有转型商业性质的。传闻在上海开了一家房地产公司 06年的事情了 如今如何 我就不得而知了 如果 有知道的请告知我哈。。也是与小鸟一起隐退的。
求加精被H牛否了。。。喂喂喂。好歹我不是搬运工。。。 好多也是自己写的。。。

这不科学.H牛那天路过海淀一定要M你 让你请我吃饭

谢谢 我是分期写 请不要回复 不然会造成阅读不方便。谢谢大家(如果想跟帖请按点评 字节不要太多。会看不到。。)
首先,要学习cracker。假如你要深入的学习请按照我说的步骤。假如只是要学习爆破什么的。请按右上角。。因为,别的文章比我字数更少更简洁
我只是说我学习的方法,如有不对的地方请指教。 我会在文章中插一些我认为很好的文章希望大家可以阅读下。比我这种半路出家的写的要好。欢迎指点。
我最早接触的cracker教程是黑基2005年左右做的一个汇编教学。以下是总结的一些东西。以后你会遇到。方便学习深入分析算法和分析行为。先说下各个操作指令。
[AppleScript] 纯文本查看 复制代码
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
|
8080汇编手册数据传输指令──────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。1。 通用数据传送指令。MOV 传送字或字节。MOVSX 先符号扩展,再传送。MOVZX 先零扩展,再传送。PUSH 把字压入堆栈。POP 把字弹出堆栈。PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈。POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈。PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈。POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈。BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节。( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数。( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加。( 结果在第一个操作数里 )XLAT 字节查表转换。── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即0-FFH); 返回 AL 为查表结果。 ( [BX+AL]->AL )2。 输入输出端口传送指令。IN I/O端口输入。 ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出。 ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535。3。 目的地址传送指令。LEA 装入有效地址。例: LEA DX,string ;把偏移地址存到DX。LDS 传送目标指针,把指针内容装入DS。例: LDS SI,string ;把段地址:偏移地址存到DS:SI。LES 传送目标指针,把指针内容装入ES。例: LES DI,string ;把段地址:偏移地址存到ES:DI。LFS 传送目标指针,把指针内容装入FS。例: LFS DI,string ;把段地址:偏移地址存到FS:DI。LGS 传送目标指针,把指针内容装入GS。例: LGS DI,string ;把段地址:偏移地址存到GS:DI。LSS 传送目标指针,把指针内容装入SS。例: LSS DI,string ;把段地址:偏移地址存到SS:DI。4。 标志传送指令。LAHF 标志寄存器传送,把标志装入AH。SAHF 标志寄存器传送,把AH内容装入标志寄存器。PUSHF 标志入栈。POPF 标志出栈。PUSHD 32位标志入栈。POPD 32位标志出栈。二、算术运算指令──────────────────────────────ADD 加法。ADC 带进位加法。INC 加 1。AAA 加法的ASCII码调整。DAA 加法的十进制调整。SUB 减法。SBB 带借位减法。DEC 减 1。NEC 求反(以 0 减之)。CMP 比较。(两操作数作减法,仅修改标志位,不回送结果)。AAS 减法的ASCII码调整。DAS 减法的十进制调整。MUL 无符号乘法。IMUL 整数乘法。以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整。DIV 无符号除法。IDIV 整数除法。以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算)。AAD 除法的ASCII码调整。CBW 字节转换为字。 (把AL中字节的符号扩展到AH中去)CWD 字转换为双字。 (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字。 (把AX中的字符号扩展到EAX中去)CDQ 双字扩展。 (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令────────────────────────────AND 与运算。OR 或运算。XOR 异或运算。NOT 取反。TEST 测试。(两操作数作与运算,仅修改标志位,不回送结果)。SHL 逻辑左移。SAL 算术左移。(=SHL)SHR 逻辑右移。SAR 算术右移。(=SHR)ROL 循环左移。ROR 循环右移。RCL 通过进位的循环左移。RCR 通过进位的循环右移。以上八种移位指令,其移位次数可达255次。移位一次时, 可直接用操作码。 如 SHL AX,1。移位>1次时, 则由寄存器CL给出移位次数。如 MOV CL,04SHL AX,CL四、串指令───────────────────────────DS:SI 源串段寄存器 :源串变址。ES:DI 目标串段寄存器:目标串变址。CX 重复次数计数器。AL/AX 扫描值。D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量。Z标志 用来控制扫描或比较操作的结束。MOVS 串传送。( MOVSB 传送字符。 MOVSW 传送字。 MOVSD 传送双字。 )CMPS 串比较。( CMPSB 比较字符。 CMPSW 比较字。 )SCAS 串扫描。把AL或AX的内容与目标串作比较,比较结果反映在标志位。LODS 装入串。把源串中的元素(字或字节)逐一装入AL或AX中。( LODSB 传送字符。 LODSW 传送字。 LODSD 传送双字。 )STOS 保存串。是LODS的逆过程。REP 当CX/ECX<>0时重复。REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复。REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复。REPC 当CF=1且CX/ECX<>0时重复。REPNC 当CF=0且CX/ECX<>0时重复。五、程序转移指令──────────────────────────1>无条件转移指令 (长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回。2>条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移。JAE/JNB 大于或等于转移。JB/JNAE 小于转移。JBE/JNA 小于或等于转移。以上四条,测试无符号整数运算的结果(标志C和Z)。JG/JNLE 大于转移。JGE/JNL 大于或等于转移。JL/JNGE 小于转移。JLE/JNG 小于或等于转移。以上四条,测试带符号整数运算的结果(标志S,O和Z)。JE/JZ 等于转移。JNE/JNZ 不等于时转移。JC 有进位时转移。JNC 无进位时转移。JNO 不溢出时转移。JNP/JPO 奇偶性为奇数时转移。JNS 符号位为 "0" 时转移。JO 溢出转移。JP/JPE 奇偶性为偶数时转移。JS 符号位为 "1" 时转移。3>循环控制指令(短转移)LOOP CX不为零时循环。LOOPE/LOOPZ CX不为零且标志Z=1时循环。LOOPNE/LOOPNZ CX不为零且标志Z=0时循环。JCXZ CX为零时转移。JECXZ ECX为零时转移。4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续。WAIT 当芯片引线TEST为高电平时使CPU进入等待状态。ESC 转换到外处理器。LOCK 封锁总线。NOP 空操作。STC 置进位标志位。CLC 清进位标志位。CMC 进位标志取反。STD 置方向标志位。CLD 清方向标志位。STI 置中断允许位。CLI 清中断允许位。六、伪指令───────────────────────────DW 定义字(2字节)。PROC 定义过程。ENDP 过程结束。SEGMENT 定义段。ASSUME 建立段寄存器寻址。ENDS 段结束。END 程序结束。一.机械码,又称机器码.ultraedit打开,编辑exe文件时你会看到许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码就是机器码.修改程序时必须通过修改机器码来修改exe文件.二.需要熟练掌握的全部汇编知识(只有这么多)不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)call 调用子程序je 或jz 若相等则跳(机器码74 或0F84)jne或jnz 若不相等则跳(机器码75或0F85)jmp 无条件跳(机器码EB)jb 若小于则跳ja 若大于则跳jg 若大于则跳jge 若大于等于则跳jl 若小于则跳jle 若小于等于则跳pop 出栈push 压栈三.常见修改(机器码)74=>75 74=>90 74=>EB75=>74 75=>90 75=>EBjnz->nop75->90(相应的机器码修改)jnz -> jmp75 -> EB(相应的机器码修改)jnz -> jz75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)四.两种不同情况的不同修改方法1.修改为jmpje(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)。。。。。。xxxxxxxxxxxx 正确路线所在2.修改为nopje(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)。。。。。。xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换. ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ESI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FSI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GSI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SSI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈. POPF 标志出栈. PUSHD 32位标志入栈. POPD 32位标志出栈. 二、算术运算指令 ─────────────────────────────────────── ADD 加法. ADC 带进位加法. INC 加 1.AAA 加法的ASCII码调整. DAA 加法的十进制调整. SUB 减法. SBB 带借位减法. DEC 减 1.NEC 求反(以 0 减之). CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整. DAS 减法的十进制调整. MUL 无符号乘法. IMUL 整数乘法. 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整. DIV 无符号除法. IDIV 整数除法. 以上两条,结果回送:商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算). AAD 除法的ASCII码调整. CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令 ─────────────────────────────────────── AND 与运算. OR 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL)SHR 逻辑右移. SAR 算术右移.(=SHR)ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数. 如 MOV CL,04SHL AX,CL 四、串指令 ─────────────────────────────────────── DS:SI 源串段寄存器 :源串变址. ESI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较. ( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描. 把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串. 是LODS的逆过程. REP 当CX/ECX<>0时重复. REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复. REPC 当CF=1且CX/ECX<>0时重复. REPNC 当CF=0且CX/ECX<>0时重复. 五、程序转移指令 ─────────────────────────────────────── 1>无条件转移指令 (长转移)JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2>条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移. JAE/JNB 大于或等于转移. JB/JNAE 小于转移. JBE/JNA 小于或等于转移. 以上四条,测试无符号整数运算的结果(标志C和Z). JG/JNLE 大于转移. JGE/JNL 大于或等于转移. JL/JNGE 小于转移. JLE/JNG 小于或等于转移. 以上四条,测试带符号整数运算的结果(标志S,O和Z). JE/JZ 等于转移. JNE/JNZ 不等于时转移. JC 有进位时转移. JNC 无进位时转移. JNO 不溢出时转移. JNP/JPO 奇偶性为奇数时转移. JNS 符号位为 "0" 时转移. JO 溢出转移. JP/JPE 奇偶性为偶数时转移. JS 符号位为 "1" 时转移. 3>循环控制指令(短转移)LOOP CX不为零时循环. LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ ECX为零时转移. 4>中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5>处理器控制指令 HLT 处理器暂停, 直到出现中断或复位信号才继续. WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器. LOCK 封锁总线. NOP 空操作. STC 置进位标志位. CLC 清进位标志位. CMC 进位标志取反. STD 置方向标志位. CLD 清方向标志位. STI 置中断允许位. CLI 清中断允许位. 六、伪指令 ─────────────────────────────────────── DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束 |
本人当时打印了7页去背。。。貌似现在都忘记了。。
如果只是想大致的学习一下的话那么就直接背跳转和修改方法吧。没多少、、、
当我背完以上的东西的时候。已经可以爆破一些简单的验证了。(@bambooqj【1】 ‘这只是个表情我会在文章最后打包一些程序。) 你也可以下载一些简单的crackerme去分析。
当然关于简单的爆破可能有的朋友会说。不知道按钮事件和关键字如何能爆破。那么下面就是我要说的了。
首先,什么是爆破?爆破就是爆力破解,在破解软件的时候直接跳过软件的注册入口点。。然后,修改算法或直接jmp亦或是nop算法call,之后不论输入什么注册信息都会注册成功!
文章有些可能是我从网上摘抄来的希望作者看到不会骂我。哈,但是,我学习就是这么来的。。。。。。如果,有侵权行为我会立马删掉文章并道歉。
下面介绍一些找爆破点的方法。
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
先介绍简单的就是有消息框的。1.函数断点法如直接OD下断点 bp MessageBoxA 当然这个只是一个函数。举个例子而已。后边会有一个专门的总结方便下断点。2.F12堆栈回溯法(F12暂停法)(1)F12堆栈回溯法当出现提示框时在OD按下F12暂停程序。然后点击工具栏的 “K” 或者 查看---调用堆栈---找到最接近入口的地址如401C22回车找到该代码“push ebp” 十六进制“55”(2)F12暂停法【这个才是真正地F12暂停法】1 od 下运行程序,F12 暂停;2 View菜单中选击Windows项,在打开的窗口中可以从Title栏看到目标按钮,从而找到它的Handle(xxxxxxxx) ;对不同平台生成的程序,分别处理:一、VB, Delphi, CBuilder 程序:3 在CallWindowProcA入口下条件断点: [esp+8]==xxxxxxxx && [esp+0c]==202;4 F9继续程序,点击目标按钮,程序中断;5 Alt+F4,在代码段(.text)上下访问断点;6 F9执行程序,程序中断, 1). VB程序中断在下面代码 PUSH DWORD PTR DS:[EAX+EBX] ; yyyyyyy 上面[EAX+EBX]的值(yyyyyy)就是我们要找的位置。 2). Delphi, CBuilder 的程序 程序直接断在我们要找的位置。借moon一句,这姑妄称作CallWindowProcA条件断点加上code段内存断点法吧。 二、VC程序又分MFC和Win32两种情况,二者相同之处:3 在IsDialogMessageW入口下条件断点: [[esp+8]]==xxxxxxxx && [[esp+8]+4]==2024 F9继续程序,点击目标按钮,程序中断;5 Alt+F4,在代码段上下访问断点;6 F9执行程序,程序中断, 注意这里虽然中断在code段,但却不是处理Button点击事件的代码处 这时: 对Win32程序,只需要按几下F7,当回到User32.dll领空后再重复一次第 5、6步就可以了; 而对于MFC程序,我们不得不多次重复这样的操作:单步回到MFC领空,再第 5、6步。好在已经看到大陆啦!类比,这就叫IsDialogMessageW条件断点加上code段内存断点法了3.关键字符串法无插件(反汇编窗口右键---查找---所有参考字符串文本【可能翻译不一样大概就是这样吧】)有插件(插件---中文搜索---查找U码【unicode】(查找A码【ascii】)然后ctrl+f 查找你要的关键字 然后回车 找到“push ebp” 也就是十六进制的“55” 事件头下断点4.按钮事件法要熟悉各个语言的按钮事件以下是我总结的(1)Delphi和BC++程序OD载入后,CTRL+G,转到00401000处 然后就CTRL+B,查找特征码740E8BD38B83????????FF93????????然后就在下面的CALL处下断吧. 下面的工作就是不断的CTRL+L继续查找和F2下断了.(2)VB程序OD载入后,CTRL+B,816C24然后,就在下面的JMP处F2下断,下完后CTRL+L,如果还有,就继续下断点. 下完断点后,运行程序,点击相应的按纽,OD就会断下来了(3)易语言【1.老版本的易语言】OD载入后,就F9运行程序吧,当程序运行后,ALT+E 选中易语言的核心库krnln,双击进去 然后CTRL+B,查找FF 55 FC【2.新版本的易语言】OD载入后,CTRL+G,转到00401000处 然后就CTRL+B,查找特征码:FF 55 FC 5F 5E 89 5D F4 |
可能不太全有时间补齐吧。顺便推荐两篇我初学时候的文章 有些东西就是从这里复制的
http://hi.baidu.com/taoist/item/a35e20320922d6c91b9696d8 ‘按钮事件查找与应用
http://www.52pojie.cn/forum.php?mod=viewthread&tid=125362 ’黑鹰基地教程的总结 可以先看这个。比我讲的要系统。我毕竟怎么学的都忘得差不多了。文章先后可能有点问题写完后我再修改
http://hi.baidu.com/bambooqj/item/3e589cdc8504cd10d78ed0bb ‘天草还是黑鹰的忘记了 也是一个总结
关于壳。这个章节我可能会写的比较多。可乐说我算违规了。。求不删帖计次违规。。
首先讲下
一、壳的工作原理与脱壳的大致过程
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
1)Entry Point (入口点)PE格式的可执行文件的执行时的入口点,即是PE格式中的Entry Point。用PEditor或者LordPE之类的PE查看工具看看NotePad.exe,你就会看到Entry Point的值。也就是说NotePad.exe在执行时的第一行代码的地址应该就是这个值。(当然应该加上基地址)2)Section (节区)PE格式文件是按节区进行规划组织的,不同的节区一般保存的数据的作用也不相同。通常使用缺省方式编译的程序文件,有CODE/DATA/TLS/.text/.data/.tls/.rsrc/.rdata/.edata/.reloc等不同的名称,有的用于保存程序代码,如CODE和.text节区,有的用于保存程序中的变量的,如DATA/.data节区,有的保存重定位信息,如.reloc,有的用于保存资源数据,如.rsrc。等等等等,当然这是缺省情况下编译器产生的结构。而节区名称和节区中的数据其实没有必然的联系,节区中保存的数据也没有什么硬性的限制。所以你可以在编译时用开关参数改变这些情况。3)ImageBase (基地址)不仅程序文件按节区规划,而且程序文件在运行时Windows系统也是按节区加载的。那么每一块的节区的顺序如何?起始的地址是什么呢?这就由基地址决定。在程序的文件头部保存了每个节区的描述信息,比如有前面提到的节区名称,还有节区的大小,以及节区的相对虚拟地址(RVA)。如果我们把节区的相对虚拟地址(RVA)加上基地址(ImageBase)就可以知道节区在内存中的虚拟地址(VA)了。Windows系统就是按照这个要求来加载各个节区的。这样Windows系统依次把各个节区放到了它相应的虚拟地址空间。所以如果我们把相对虚拟地址(RVA)看成是坐标的偏移量的话,那么ImageBase就是原点了。有了这个原点,一切都简单了。好了有了简要的介绍,我们来看看壳的加载过程吧。注意这里说的是一般情况,不特指某个壳,如果那样的话,我想那大概是洋洋洒洒几万字的了,好象我没有写过这么长的。虽然我的五笔练得还不错。1)获取壳自己所需要使用的API地址如果你用PE查看工具看看加壳后的程序文件,会发现未加壳的程序文件和加壳后的程序文件的Import Table不太一样,加壳后的Import Table一般所引入的DLL和API很少,甚至只有Kernel32.dll以及GetProcAddress这个API。我想你不会认为壳只用这个API就可以做所有的事吧。壳还需要很多其他的API来完成它的工作。当然他并不想让你知道他想用哪个API,所以一般他只是在壳的代码中动态加载这些API,而只把一些你嗅不过什么味道的几个API放在Import Table中。当然这其中壳可能会用到一些Anti技术,不过这和本文主旨无关,所以就不说了。2)解密原程序的各个节区(Section)的数据壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个节区。既然是加密保存,那么在程序执行时你总不能也保持加密状态吧,所以解密是壳必做的工作之一。一般壳按节区加密的,那么在解密时也按节区解密,并且把解密的节区数据按照节区的定义放在合适的内存位置。如果加壳时用到了压缩技术,那么在解密之前还有一道工序,当然是解压缩。这也是一些壳的特色之一,比如说原来的程序文件未加壳时1-2M大小,加壳后反而只有几百K,这种瘦身技术当然会吸引了不少眼球。3)重定位前面我们提到了ImageBase,即程序的基地址,当然这只是程序文件中声明的,程序运行时能够保证系统一定满足你的要求吗?对于EXE的程序文件来说,Windows系统会尽量满足你的要求。比如一般EXE文件的基地址为0x400000,而运行时Windows系统提供给程序的基地址也同样是0x400000。在这种情况下就不需要进行地址"重定位"了。由于不需要对EXE文件进行"重定位",所以很多壳在加壳时把原程序文件中用于保存重定位信息的节区干脆也去掉了,这样使得加壳后的文件更加小巧。有些工具提供Wipe Reloc的功能,其实就是这个作用。不过对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。这样"重定位"就很重要了。此时壳中也需要提供进行"重定位"的代码,否则原程序中的代码是无法正常运行起来的。从这点来说,加壳的DLL比加壳的EXE更难修正。4)HOOK-API我们知道程序文件中的Import Table的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。而壳一般都修改了原程序文件的Import Table,那么原程序文件的Import Table由谁来处理呢?这当然由壳来自己处理了,因此壳不得不模仿Windows系统的工作来填充Import Table中相关的数据。Import Table结构中与实际运行相关的主要是IAT结构,这个结构中用于保存API的实际地址,因此壳所需要的就是填充这个结构中的数据。不过壳不是填充这些实际的API地址,而是填充壳中用来HOOK-API的代码的地址。这样壳中的代码一旦完成了加载工作,在进入原程序的代码之后,仍然能够间接地获得程序的控制权。因为程序总是需要与系统打交道,与系统交道的途径是API,而API的地址已经替换成了壳的HOOK-API的地址,那么每一次程序与系统打交道,都会让壳的代码获得一次控制权,一来壳可以进行反跟踪继续保护软件,二来可以完成某些特殊的任务。其实这就是所谓HOOK技术。5)最后当然是跳转到程序原入口点这个大家比较熟悉,找的就是它。脱壳时大多数也是在这个时候。从这个时候起壳要把控制权交还给原程序了。以上是一个简单的总结。这代表了大多数壳的加载过程,不过特殊的不包括在内,介绍一下让大家了解一些。当然还有一些壳充分利用了PE结构的特点,比如利用TLS加载的特点也挺有趣。一点经验手动脱壳不一定要在程序原入口点。没有人规定你一定要在那里动手。只要你能保证脱壳后程序正常执行就行了。当然我们必需得知道这个原入口点的值,否则我们无法修复程序文件中的Entry Point的值了。那么手动脱壳还有比较常用的地方吗?有就是前面所提到的第2步完成后。此时Section数据已经解密,而且壳还没有来得及进行Hook-Api,很多壳图简单没有把原程序的Import Table破坏掉,这个时候正是我们下手的好时机。要发现这个地方也很容易,一般重定位代码的特征是很明显的。特别是有些壳有压缩功能的时候,更是容易发现。这个时候脱出来的文件组织一下可以达到和原程序几乎相同的大小。而不是通常的内存映象大小。 |
二、 如何分辨加密壳和压缩壳
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
如何分辨加密壳和压缩壳,通用特点,Od载入时有入口警告或询问是压缩程序吗?普通压缩壳Od调试时候没有异常,加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常。找OEP的一般思路如下: 先看壳是加密壳还是压缩壳,压缩壳相对来说容易些,一般是没有异常。外壳解压代码起始点如果是pushfd pushad跟踪时如果有发现popad popfd对应有些壳只有pushad和popad相对应附近还有retnjmp等指令,发生跨断跳跃一般就到了OEP处。当然也有其他的,如 je OEP等等,一般都是段之间的大跳转,OD的反汇编窗口里都是同一个段的内容,所以更好区别是否是段间跳转。找Oep时注意两点。 1、单步往前走,不要回头。2、观察。注意poshad、poshfd,popad、popfd等,和外壳代码处对应,注意地址发生大的变化。单步跟踪什 么时候F8走,F7,F4步过?这里我说说关于F8(Step Over)和F7(Step in)的一般方法,粗跟的时候一般都是常用F8走,但是有些call是变形的Jmp,此时就需要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走。对于Call的距离很远,可以放心用F8步过,如果你再用F7步过,只是浪费时间而已。F8步过对压缩壳用的很多,F7步过加密壳用的很多,如果用F8一不小心就跑飞(程序运行),跟踪失败。加密壳找Oep对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾。有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。单步异常是防止我们一步步跟踪程序,即F8,F7,F4等,Int3中断是检测调试器用的,仅在Win9x系统中有效,2000/XP就会出现断点异常,其它的异常主要是干扰调试。这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点。确定从所有Seh异常中走出来,如果前面有大量循环,逐段解压。 |
三、一般加密壳的脱壳步骤
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
一.如何分辨加密壳:壳分为加密壳和压缩壳,压缩壳目的是减少软件的体积便于在网上传播,而加密壳目的是防止软件被脱壳和破解,所以加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常.也就是说在跟踪过程中很容易导致程序运行,使你无法跟踪分析.而压缩壳相对比较容易,脱壳也比较简单,一般没异常出现.二.脱加密壳的相关知识要点:在加密壳中,变形CALL比较多,遇到变形call要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走。对于Call的距离很远,可以放心用F8步过.加密壳中F7用的比较多,压缩壳中一般用F8单步跟踪就可以搞定.脱加密壳,用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾.数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD.单步异常是防止我们一步步跟踪程序,这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点.三.加密壳的一般脱壳步骤:介绍:这种方法一般用于加密壳,这是脱加密壳的一种通用方法.第一步:用OD打开程序,点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序.第二步:接着我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数n.第三步:重载程序,再按SHIFT+F9,这次按的次数为上次让程序运行时的次数的n-1次.第四步:此时观察OD的右下角有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!来到这个地址.第五步:在这里,按F2下断点!然后按SHIFT+F9来到断点处!第六步:这时候我们已经跳过了所有异常,然后去掉断点,按F8慢慢向下跟踪很快就到达OEP了.修复----重建PE |
四、脱壳的八种方法
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
一、 概论 壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。当然加密壳的保护能力要强得多!二、常见脱壳方法预备知识1.PUSHAD (压栈) 代表程序的入口点,2.POPAD (出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。 方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP!方法二:ESP定律法ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!3.选中下断的地址,断点--->硬件访-àWORD断点。4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。方法三:内存镜像法1:用OD打开软件!2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到.rsrc.上面的CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!方法四:一步到达OEP1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPX,ASPACK壳),然后按下F2,F9运行到此处2.来到大跳转处,点下F8,到达OEP!方法五:最后一次异常法1:用OD打开软件2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m!4:CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!6:按F2下断点!然后按SHIFT+F9来到断点处!7:去掉断点,按F8慢慢向下走!8:到达程序的OEP!方法六:模拟跟踪法1:先试运行,跟踪一下程序,看有没有SEH暗桩之类2:ALT+M打开内存镜像,找到(包含=SFX,imports,relocations)内存镜像,项目 30地址=0054B000大小=00002000 (8192.)Owner=check 00400000区段=.aspack包含=SFX,imports,relocations类型=Imag 01001002访问=R初始访问=RWE 3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪ing。。Btw:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用方法七:“SFX”法1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾2:切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。3:重载程序(如果跳出是否“压缩代码?”选择“否”,OD直接到达OEP)Btw:这种方法不要滥用得好,锻炼能力为妙。‘当然只是对付一些压缩壳。加密壳的话并不是这个样子的。方法八、堆栈回溯法直接运行程序 OD窗口---堆栈窗口(拉到最底下)---第一返回最接近基址的地方(此方法并不是一定的也可能在第三或第N个。) |
既然知道了壳怎么脱。那么如何确定是否是OEP呢。就要看入口特征了。以下是一些程序的入口特征。比较老的版本了会在别的帖子更新最新的入口特征。以后会添加到这个帖子中。。
五、几种编程语言的OEP入口特征
[AppleScript] 纯文本查看 复制代码
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
Microsoft Visual C++ 6.000496EB8 >/$ 55 PUSH EBP ; (初始 cpu 选择)00496EB9 |. 8BEC MOV EBP,ESP00496EBB |. 6A FF PUSH -100496EBD |. 68 40375600 PUSH Screensh.0056374000496EC2 |. 68 8CC74900 PUSH Screensh.0049C78C ; SE 处理程序安装00496EC7 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]00496ECD |. 50 PUSH EAX00496ECE |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP00496ED5 |. 83EC 58 SUB ESP,58---------------------------------------------------------------------------------------Microsoft Visual Basic 5.0 / 6.000401166 - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain0040116C > 68 147C4000 PUSH PACKME.00407C1400401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>00401176 0000 ADD BYTE PTR DS:[EAX],AL00401178 0000 ADD BYTE PTR DS:[EAX],AL0040117A 0000 ADD BYTE PTR DS:[EAX],AL0040117C 3000 XOR BYTE PTR DS:[EAX],AL或省略第一行的JMP00401FBC > 68 D0D44000 push dumped_.0040D4D000401FC1 E8 EEFFFFFF call <jmp.&msvbvm60.ThunRTMain>00401FC6 0000 add byte ptr ds:[eax],al00401FC8 0000 add byte ptr ds:[eax],al00401FCA 0000 add byte ptr ds:[eax],al00401FCC 3000 xor byte ptr ds:[eax],al00401FCE 0000 add byte ptr ds:[eax],al----------------------------------------------------------------------BC++0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E0040163E |66 DB 66 ; CHAR 'f'0040163F |62 DB 62 ; CHAR 'b'00401640 |3A DB 3A ; CHAR ':'00401641 |43 DB 43 ; CHAR 'C'00401642 |2B DB 2B ; CHAR '+'00401643 |2B DB 2B ; CHAR '+'00401644 |48 DB 48 ; CHAR 'H'00401645 |4F DB 4F ; CHAR 'O'00401646 |4F DB 4F ; CHAR 'O'00401647 |4B DB 4B ; CHAR 'K'00401648 |90 NOP00401649 |E9 DB E90040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]00401653 . C1E0 02 SHL EAX,200401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX0040165B . 52 PUSH EDX0040165C . 6A 00 PUSH 0 ; /pModule = NULL0040165E . E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA00401663 . 8BD0 MOV EDX,EAX-----------------------------------------------------------------------------------------------Borland Delphi 6.0 - 7.000509CB0 > $ 55 PUSH EBP00509CB1 . 8BEC MOV EBP,ESP00509CB3 . 83C4 EC ADD ESP,-1400509CB6 . 53 PUSH EBX00509CB7 . 56 PUSH ESI00509CB8 . 57 PUSH EDI00509CB9 . 33C0 XOR EAX,EAX00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX00509CBE . B8 20975000 MOV EAX,unpack.0050972000509CC3 . E8 84CCEFFF CALL unpack.0040694C-----------------------------------------------------------------------------------------------易语言入口00401000 > E8 06000000 call dump_.0040100B00401005 50 push eax00401006 E8 BB010000 call <jmp.&KERNEL32.ExitProcess>0040100B 55 push ebp0040100C 8BEC mov ebp,esp0040100E 81C4 F0FEFFFF add esp,-11000401014 E9 83000000 jmp dump_.0040109C00401019 6B72 6E 6C imul esi,dword ptr ds:[edx+6E],6C0040101D 6E outs dx,byte ptr es:[edi]也可能是这样的入口Microsoft Visual C++ 6.0 [Overlay] E语言00403831 >/$ 55 PUSH EBP00403832 |. 8BEC MOV EBP,ESP00403834 |. 6A FF PUSH -100403836 |. 68 F0624000 PUSH Nisy521.004062F00040383B |. 68 A44C4000 PUSH Nisy521.00404CA4 ; SE 处理程序安装00403840 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]00403846 |. 50 PUSH EAX00403847 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP-------------------------------------------------------------------MASM32 / TASM32入口00401258 >/$ 6A 00 push 0 ; /pModule = NULL0040125A |. E8 47000000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA0040125F |. A3 00304000 mov dword ptr ds:[403000],eax00401264 |. 6A 00 push 0 ; /lParam = NULL00401266 |. 68 DF104000 push dump.004010DF ; |DlgProc = dump.004010DF0040126B |. 6A 00 push 0 ; |hOwner = NULL0040126D |. 6A 65 push 65 ; |pTemplate = 650040126F |. FF35 00304000 push dword ptr ds:[403000] ; |hInst = NULL00401275 |. E8 56000000 call <jmp.&user32.DialogBoxParamA> ; \DialogBoxParamA-------------------------------------------------------------------------- 汇编00401000 汇> 6A 00 push 000401002 E8 C50A0000 call <jmp.&KERNEL32.GetModuleHandleA>00401007 A3 0C354000 mov dword ptr ds:[40350C],eax0040100C E8 B50A0000 call <jmp.&KERNEL32.GetCommandLineA>00401011 A3 10354000 mov dword ptr ds:[403510],eax00401016 6A 0A push 0A00401018 FF35 10354000 push dword ptr ds:[403510]0040101E 6A 00 push 000401020 FF35 0C354000 push dword ptr ds:[40350C]00401026 E8 06000000 call 汇编.004010310040102B 50 push eax0040102C E8 8F0A0000 call <jmp.&KERNEL32.ExitProcess>00401031 55 push ebp00401032 8BEC mov ebp,esp00401034 83C4 B0 add esp,-5000401037 C745 D0 30000000 mov dword ptr ss:[ebp-30],300040103E C745 D4 0B000000 mov dword ptr ss:[ebp-2C],0B00401045 C745 D8 37114000 mov dword ptr ss:[ebp-28],汇编.00401137-------------------------------------------------------------------------------------------------VC8入口特征00403A30 > $ E8 6E270000 call VC8.004061A300403A35 .^ E9 79FEFFFF jmp VC8.004038B300403A3A /$ 55 push ebp00403A3B |. 8BEC mov ebp,esp00403A3D |. 83EC 08 sub esp,0x800403A40 |. 897D FC mov [local.1],edi ; ntdll.7C93022800403A43 |. 8975 F8 mov [local.2],esi00403A46 |. 8B75 0C mov esi,[arg.2]00403A49 |. 8B7D 08 mov edi,[arg.1] ; VC8.<ModuleEntryPoint>00403A4C |. 8B4D 10 mov ecx,[arg.3]00403A4F |. C1E9 07 shr ecx,0x7---------------------------------------------------------------------------------------------------------------------------- |
以上五步都看完了的话一般的压缩壳就手到擒来了。。。加密壳每个的方法都不一样 还原也不一样。修复IAT指针什么的就是日后讲PE结构等东西时候的事情了
今天就到这里吧 日后有时间补齐。。 睡觉了先。。。 快12点了。。。
先给楼上两位大哥跪一个。。。。。
壳的这章大概就是这个样子了。加密壳的话方法都是不同的。如果写出来容易误导大家。只能是大家以后自己去学习【就好像VMP每个大版本都是不一样的。每个的修复方法也是有差异的。】
下面就是介绍一些断点和API了。此章可背可不背。。。用的时候直接查看下就好。其实,有插件我的话完全多此一举。。。(@Bambooqj【2】)此为插件内容
[AppleScript] 纯文本查看 复制代码
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
|
拦截窗口:bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框:bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 拦截警告声:bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)拦截对话框:bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表:bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健bp RegQueryValue(A) 查找子健bp RegQueryValueEx 查找子健bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健功能限制拦截断点:bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 拦截时间:bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数拦截文件: bp CreateFileA 创建或打开文件 (32位)bp OpenFile 打开文件 (32位)bp ReadFile 读文件 (32位)bp WriteFile 写文件 (32位)拦截驱动器: bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径 ★★VB程序专用断点★★bp __vbaStrCmp 比较字符串是否相等 bp __vbaStrComp 比较字符串是否相等 bp __vbaVarTstNe 比较变量是否不相等 bp __vbaVarTstEq 比较变量是否相等 bp __vbaStrCopy 复制字符串 bp __vbaStrMove 移动字符串 bp MultiByteToWideChar ANSI字符串转换成Unicode字符串 bp WideCharToMultiByte Unicode字符串转换成ANSI字符串 常见断点设置字符串bp GetDlgItemTextA(W) ****bp GetDlgItemIntbp GetWindowTextA(W) ****bp GetWindowWordbmsg XXXX wm_gettext对话框bp MessageBeepbp MessageBoxA(W) ****bp MessageBoxExA(W)bp DialogBoxParamA(W)bp GreateWindowExA(W)bp ShowWindowbp UpdateWindowbmsg XXXX wm_command对于VB的程序用bp MessageBoxA是无法断下来的,bp rtcMsgBox注册表相关bp RegCreateKeyA(W)bp RegDeleteKeyA(W)bp RegQueryValueA(W)bp RegCloseKeybp RegOpenKeyA(W) ****时间相关bp GetLocalTimebp GetFileTimebp GetSystemtimeCD-ROM或磁盘相关bp GetFileAttributesA(W)bp GetFileSizebp GetDriveTypebp GetLastErrorbp ReadFilebpio -h (CD-ROM端口地址) R软件狗bpio -h 278Rbpio -h 378RINI初始化文件相关bp GetPrivateProfileStringA ****bp GetPrivateProfileIntbp WritePrivateProfileStringbp WritePrivateProfileInt文件访问相关bp ReadFilebp WriteFilebp CreateFileA ****bp SetFilePointerbp GetSystemDirectory访问注册表类常用APIbp RegOpenKeyA 打开一个现有的注册表项 ****bp RegOpenKeyExA 打开一个现有的注册表项 ****bp RegCreateKeyA 在指定的项下创建或打开一个项 bp RegCreateKeyExA 在指定项下创建新项的更复杂的方式 bp RegDeleteKeyA 删除现有项下方一个指定的子项 bp RegDeleteValueA 删除指定项下方的一个值 bp RegQueryValueA 获取一个项的设置值 bp RegQueryValueExA 获取一个项的设置值 bp RegSetValueA 设置指定项或子项的值 bp RegSetValueExA 设置指定项的值 bp RegCloseKey 关闭系统注册表中的一个项(或键) 访问文件类常用APIbp CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 ****bp OpenFile 这个函数能执行大量不同的文件操作 bp ReadFile 从文件中读出数据 bp ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的1、限制程序功能函数EnableMenuItem 允许、禁止或变灰指定的菜单条目EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)2、对话框函数CreateDialog 从资源模板建立一非模态对话窗CreateDialogParam 从资源模板建立一非模态对话窗CreateDialogIndirect 从内存模板建立一非模态对话窗CreateDialogIndirectParam 从内存模板建立一非模态对话窗DialogBox 从资源模板建立一模态对话窗DialogBoxParam 从资源模板建立一模态对话窗DialogBoxIndirect 从内存模板建立一模态对话窗DialogBoxIndirectParam 从内存模板建立一模态对话窗EndDialog 结束一模态对话窗MessageBox 显示一信息对话框MessageBoxAMessageBoxEx 显示一信息对话框MessageBoxIndirect 显示一定制信息对话框GetDlgItemInt 得指定输入框整数值GetDlgItemText 得指定输入框输入字符串GetDlgItemTextA 得指定输入框输入字符串Hmemcpy 内存复制 (非应用程序直接调用)3、磁盘处理函数GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息GetDriveTypeA 判断一个磁盘驱动器的类型GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母GetFullPathNameA 获取指定文件的详细路径GetVolumeInformationA 获取与一个磁盘卷有关的信息GetWindowsDirectoryA 获取Windows目录的完整路径名GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名4、文件处理函数CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台OpenFile 这个函数能执行大量不同的文件操作ReadFile 从文件中读出数据ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调WriteFile 将数据写入一个文件WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调SetFilePointer 在一个文件中设置当前的读写位置SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等_lcreat 创建一个文件_lopen 以二进制模式打开指定的文件_lread 将文件中的数据读入内存缓冲区_lwrite 将数据从内存缓冲区写入一个文件_llseek 设置文件中进行读写的当前位置_lclose 关闭指定的文件_hread 将文件中的数据读入内存缓冲区_hwrite 将数据从内存缓冲区写入一个文件OpenFileMappingA 打开一个现成的文件映射对象CreateFileMappingA 创建一个新的文件映射对象MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间MapViewOfFileEx (内容同上)CreateDirectoryA 创建一个新目录CreateDirectoryExA 创建一个新目录RemoveDirectoryA 删除指定目录SetCurrentDirectoryA 设置当前目录MoveFileA 移动文件DeleteFileA 删除指定文件CopyFileA 复制文件CompareFileTime 对比两个文件的时间SetFileAttributesA 设置文件属性SetFileTime 设置文件的创建、访问及上次修改时间FindFirstFileA 根据文件名查找文件FindNextFileA 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件FindClose 关闭由FindFirstFile函数创建的一个搜索句柄SearchPathA 查找指定文件GetBinaryTypeA 判断文件是否可以执行GetFileAttributesA 判断指定文件的属性GetFileSize 判断文件长度GetFileTime 取得指定文件的时间信息GetFileType 在给出文件句柄的前提下,判断文件类型5、注册表处理函数RegOpenKeyA 打开一个现有的注册表项RegOpenKeyExA 打开一个现有的注册表项RegCreateKeyA 在指定的项下创建或打开一个项RegCreateKeyExA 在指定项下创建新项的更复杂的方式RegDeleteKeyA 删除现有项下方一个指定的子项RegDeleteValueA 删除指定项下方的一个值RegQueryValueA 获取一个项的设置值RegQueryValueExA 获取一个项的设置值RegSetValueA 设置指定项或子项的值RegSetValueExA 设置指定项的值RegCloseKey 关闭系统注册表中的一个项(或键)6、时间处理函数CompareFileTime 比较两文件时间GetFileTime 得文件建立,最后访问,修改时间GetLocalTime 得当前本地时间GetSystemTime 得当前系统时间GetTickCount 得windows启动至现时毫秒SetFileTime 设置文件时间SetLocalTime 设置本地时间SetSystemTime 设置系统时间7、进程函数CreateProcessA 创建一个新进程ExitProcess 以干净的方式关闭一个进程FindExecutableA 查找与一个指定文件关联在一起的程序的文件名FreeLibray 释放指定的动态链库GetCurrentProcess 获取当前进程的一个伪句柄GetCurrentProcessId 获取当前进程一个唯一的标识符GetCurrentThread 获取当前线程的一个伪句柄GetExitCodeProces 获取一个已结束进程的退出代码GetExitCodeThread 获取一个已结束线程的退出代码GetModuleHandleA 获取一个应用程序或动态链接库的模块句柄GetPriorityClassA 获取特定进程的优先级别LoadLibraryA 载入指定的动态链接库,并将它映射到当前进程使用的地址空间LoadLibraryExA 装载指定的动态链接库,并为当前进程把它映射到地址空间LoadModule 载入一个windows应用程序,并在指定的环境中运行TerminateProcess 结束一个进程-----------------------------------------------------------------------8、断点设置列表一般处理bpx hmemcpybpx MessageBoxbpx MessageBoxExAbpx MessageBeepbpx SendMessagebpx GetDlgItemTextbpx GetDlgItemIntbpx GetWindowTextbpx GetWindowWordbpx GetWindowIntbpx DialogBoxParamAbpx CreateWindowbpx CreateWindowExbpx ShowWindowbpx UpdateWindowbmsg xxxx wm_movebmsg xxxx wm_gettextbmsg xxxx wm_commandbmsg xxxx wm_activate时间相关bpint 21 if ah==2A (DOS)bpx GetLocalTimebpx GetFileTimebpx GetSystemtimeCD-ROM 或 磁盘相关bpint 13 if ah==2 (DOS)bpint 13 if ah==3 (DOS)bpint 13 if ah==4 (DOS)bpx GetFileAttributesAbpx GetFileSizebpx GetDriveTypebpx GetLastErrorbpx ReadFilebpio -h (Your CD-ROM Port Address) R软件狗相关bpio -h 278 Rbpio -h 378 RDeviceIoControl键盘输入相关bpint 16 if ah==0 (DOS)bpint 21 if ah==0xA (DOS)文件访问相关bpint 21 if ah==3dh (DOS)bpint 31 if ah==3fh (DOS)bpint 21 if ah==3dh (DOS)bpx ReadFilebpx WriteFilebpx CreateFilebpx SetFilePointerbpx GetSystemDirectoryINI 初始化文件相关bpx GetPrivateProfileStringbpx GetPrivateProfileIntbpx WritePrivateProfileStringbpx WritePrivateProfileInt注册表相关bpx RegCreateKeybpx RegDeleteKeybpx RegQueryValuebpx RegCloseKeybpx RegOpenKey注册标志相关bpx cs:eip if EAX==0内存标准相关bpmb cs:eip rw if 0x30:0x45AA==0显示相关bpx 0x30:0x45AA do "d 0x30:0x44BB"bpx CS:0x66CC do "? EAX" |
以下是一片关于断点应用的文章可能有点杂乱甚至跟上边的文章有重复的地方。请见谅我忘记是我从网上摘抄还是自己写的了。。。。。
[AppleScript] 纯文本查看 复制代码
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
|
拦截窗口:bp CreateWindow 创建窗口bp CreateWindowEx(A) 创建窗口bp ShowWindow 显示窗口bp UpdateWindow 更新窗口bp GetWindowText(A) 获取窗口文本拦截消息框:bp MessageBox(A) 创建消息框bp MessageBoxExA 创建消息框bp MessageBoxIndirect(A) 创建定制消息框拦截警告声:bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)拦截对话框:bp DialogBox 创建模态对话框bp DialogBoxParam(A) 创建模态对话框bp DialogBoxIndirect 创建模态对话框bp DialogBoxIndirectParam(A) 创建模态对话框bp CreateDialog 创建非模态对话框bp CreateDialogParam(A) 创建非模态对话框bp CreateDialogIndirect 创建非模态对话框bp CreateDialogIndirectParam(A) 创建非模态对话框bp GetDlgItemText(A) 获取对话框文本bp GetDlgItemInt 获取对话框整数值拦截剪贴板:bp GetClipboardData 获取剪贴板数据拦截注册表:bp RegOpenKey(A) 打开子健bp RegOpenKeyEx 打开子健bp RegQueryValue(A) 查找子健bp RegQueryValueEx 查找子健bp RegSetValue(A) 设置子健bp RegSetValueEx(A) 设置子健功能限制拦截断点:bp EnableMenuItem 禁止或允许菜单项bp EnableWindow 禁止或允许窗口拦截时间:bp GetLocalTime 获取本地时间bp GetSystemTime 获取系统时间bp GetFileTime 获取文件时间bp GetTickCount 获得自系统成功启动以来所经历的毫秒数bp GetCurrentTime 获取当前时间(16位)bp SetTimer 创建定时器bp TimerProc 定时器超时回调函数拦截文件:bp CreateFileA 创建或打开文件 (32位)bp OpenFile 打开文件 (32位)bp ReadFile 读文件 (32位)bp WriteFile 写文件 (32位)bp GetPrivateProfileStringA (ini文件)拦截驱动器:bp GetDriveTypeA 获取磁盘驱动器类型bp GetLogicalDrives 获取逻辑驱动器符号bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径★★VB程序专用断点★★bp __vbaStrCmp 比较字符串是否相等bp __vbaStrComp 比较字符串是否相等bp __vbaVarTstNe 比较变量是否不相等bp __vbaVarTstEq 比较变量是否相等bp __vbaStrCopy 复制字符串bp __vbaStrMove 移动字符串bp MultiByteToWideChar ANSI字符串转换成Unicode字符串bp WideCharToMultiByte Unicode字符串转换成ANSI字符串解自校验bpx CreateFileAbpx GetFileSizebpx SetFilePointerbpx ExitProcessF12堆栈调用破解思路C类Point-H法bp GetDlgItem(断输入框)bp MessageBoxA(断对话框)字符串法F12堆栈调用B、D类DEDE、PE Explorer作为强有力的辅助工具关键还是找按妞事件Point-H法bp GetDlgItem(断输入框)bp MessageBoxA(断对话框)字符串法F12堆栈调用V类VBExplorer、GetVBRes、SmatCheck作为强有力的辅助工具关键还是找按妞事件bp rtcMsgBox(断对话框)*********************************如果是重启验证就使用最开始的那些断点C类语言破解1、bp MessageBoxA(W)(断对话框)—Ctrl+N2、Point-H法3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框)4、字符串法—插件/搜索所有参考文本Delphi/BC++语言破解1、DEDE结合PE Explorer找按妞事件2、Point-H法3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框)4、bp MessageBoxA(W)(断对话框)—Ctrl+N5、字符串法—插件/搜索所有参考文本6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样,可以通过DEDE查找FormCreate/FormShow,找到关键标志位VB语言破解1、VBExplorer查找按钮事件2、有提示框则 bp rtcMsgBox(断对话框)3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq4、万能断点法(816C24法)5、字符串法—插件/搜索所有参考文本易语言破解1、借助E-Code Explorer查找按钮事件2、下消息断点,查看堆栈再返回3、eCode法–断按钮事件4、字符串法—插件/搜索所有参考文本按钮事件固定模式:0040EC78 837D F4 00 cmp dword ptr ss:[ebp-C],0 ;关键判断0040EC7C 0F84 3B000000 je dcse.0040ECBD ;关键跳0040EC82 68 04000080 push 800000040040EC87 6A 00 push 00040EC89 68 EC904000 push dcse.004090EC0040EC8E 68 01030080 push 800003010040EC93 6A 00 push 000 40EC95 68 00000000 push 00040EC9A 68 04000080 push 800000040040EC9F 6A 00 push 00040ECA1 68 F1904000 push dcse.004090F10040ECA6 68 03000000 push 30040ECAB BB 00030000 mov ebx,3000040ECB0 E8 92000000 call dcse.0040ED470040ECB5 83C4 28 add esp,280040ECB8 E9 36000000 jmp dcse.0040ECF30040ECBD 68 04000080 push 800000040040ECC2 6A 00 push 00040ECC4 68 CC904000 push dcse.004090CC0040ECC9 68 01030080 push 800003010040ECCE 6A 00 push 00040ECD0 68 00000000 push 00040ECD5 68 04000080 push 800000040040ECDA 6A 00 push 00040ECDC 68 02914000 push dcse.004091020040ECE1 68 03000000 push 30040ECE6 BB 00030000 mov ebx,3000040ECEB E8 57000000 call dcse.0040ED470040ECF0 83C4 28 add esp,280040ECF3 8BE5 mov esp,ebp0040ECF5 5D pop ebp0040ECF6 C3 retn******************************************************************************************************************************************按钮事件1、有注册错误/正确提示bp MessageBoxAbp rtcMsgBox如果事先找不到按钮事件,可以通过下消息断点,返回后回溯即可找到按钮事件起始位置2、无任何提示bp GetDlgItem可以通过bp GetDlgItem获取按钮事件代码3、未注册一启动或者关闭就跳出个注册框或者提示框bp RegOpenKey(A)bp CreateFileAbp GetPrivateProfileStringA文件: reg/ini/dll/其他至于保存到什么文件,可以使用以下方法1、查找字符串,看是否有可疑文件名或者注册表键名2、猜。。。下断点观察3、按钮事件跟踪4、未注册一启动或者关闭就打开网页链接bp ShellExecuteA类似的组合Cmp/test/其他判断Je/jne/jne/jz XXXXXXXX软件启动—>判断是否注册—>是否Open断下后回溯代码即可找到关键点,常用的方法,转存跟踪法5、未注册就功能使用限制判断是否注册—>某种功能是否让你使用,如果不能够用,一定会有提示的,或是错误提示或是弹出注册框等,那么从提示入手即可找到解除限制的关键不完美破解:解除功能限制6、未注册就日期限制bp GetLocalTime 获取本地时间bp GetSystemTime 获取系统时间bp GetFileTime 获取文件时间一般下这几个断点比较难分析关键捷径:查找字符串–找可疑文件–一般以DLL多见只要不让它读取到这个DLL即可解除限制7、Demo(演示试用版)–功能残缺这个和上面的功能限制不一样功能限制是软件本身就有这个功能,对程序而言,相对应的功能代码也存在Demo即是没这个功能,空架子一个而已一句话:破解也无用!8、网络验证无法登陆有错误提示者:下消息断点回溯代码,找按钮事件,从头来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了无法登陆自动退出者:下bp ExitProcess断下(一般可以断下)回溯代码,找按钮事件,从来来过,从按钮事件开始跟踪,找网络验证CALL(所需要登陆的地址在这个CALL里面),接下来就是分析返回值或者改登陆地址为本地(127.0.0.1),再后面就需要改某些跳转了9、狗加密一般狗加密软件,一启动就会检测所需要的狗文件,若没有狗文件,提示错误这里我们有两个入手点1、“一启动就会检测所需要的狗文件”,下bp CreateFileA等断点,断下后,回溯2、“若没有狗文件,提示错误”,下bp MessageBoxA,断下后,回溯总结:从上面的介绍说明可以看出,有这么一个共同点—按钮事件,可以这么说,按钮事件是我们的思路之门按钮事件可以这样得来:1、通过下相应断点,回溯代码2、通过辅助工具快捷的得到(VBExplorer、DEDE)******************************************************************************************************************************************重启验证80%-90%的软件基本都是重启验证类型1、注册表类型Bpx RegOpenKeyA(W)Bpx RegOpenKeyExA(W)2、ini文件类型(*.reg/*.ini)Bpx GetPrivateProfileStringA3、其他文件类型(*.dat/*.lic…)Bpx CreateFileA(W)Bpx ReadFile4、DLL文件操作类型如果没有什么有效的拦截函数,不妨试一下Bpx CreateFileA(W).余下的就是通过你的经验去判断了(例如:35课)注意:建议使用Bpx断点,这样,比较快捷、准确。尚若Bpx失效,再尝试bp方便断点设置的有以下3个断点插件,APIBreak中国版(不带Point-H),APIBreak英文版(带Point-H)、+BP-Olly******************************************************************************************************************************************去nag框的方法1、若是Delphi&BCB程序,可以通过FormCreate法查找到FormCreate,再单步跟踪,找到窗口的调用CALL,一般它的具体形式是call dword ptr ds:[edx+E8]2、OD载入程序后,单步跟踪,找到窗口的调用CALL注意看第37课******************************************************************************************************************************************两种经典方法1、Point-H法此法类似下断点bp GetWindowText(A/W),但是,在某些Point-H断不下来的情况下,bp GetWindowText(A/W)却可以断下来。Point-H能够断下来的,bp GetWindowTextA基本上都可以顺利断下2、转存跟踪法到底是byte/word/Dword断点,一般情况下是byte,其他特殊情况大家临场判断******************************************************************************************************************************************一些常规断点拦截窗口:bp CreateWindow 创建窗口bp CreateWindowEx(A/W) 创建窗口bp ShowWindow 显示窗口bp UpdateWindow 更新窗口bp GetWindowText(A/W) 获取窗口文本拦截消息框:bp MessageBox(A/W) 创建消息框bp MessageBoxExA 创建消息框bp MessageBoxIndirect(A/W) 创建定制消息框拦截警告声:bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)拦截对话框:bp DialogBox 创建模态对话框bp DialogBoxParam(A/W) 创建模态对话框bp DialogBoxIndirect 创建模态对话框bp DialogBoxIndirectParam(A/W) 创建模态对话框bp CreateDialog 创建非模态对话框bp CreateDialogParam(A) 创建非模态对话框bp CreateDialogIndirect 创建非模态对话框bp CreateDialogIndirectParam(A/W) 创建非模态对话框bp GetDlgItemText(A) 获取对话框文本bp GetDlgItemInt 获取对话框整数值拦截剪贴板:bp GetClipboardData 获取剪贴板数据拦截注册表:bp RegOpenKey(A/W) 打开子健bp RegOpenKeyEx(A/W) 打开子健bp RegQueryValue(A/W) 查找子健bp RegSetValue(A/W) 设置子健bp RegSetValueEx(A/W) 设置子健功能限制拦截断点:bp EnableMenuItem 禁止或允许菜单项bp EnableWindow 禁止或允许窗口拦截时间:bp GetLocalTime 获取本地时间bp GetSystemTime 获取系统时间bp GetFileTime 获取文件时间bp GetTickCount 获得自系统成功启动以来所经历的毫秒数bp GetCurrentTime 获取当前时间(16位)bp SetTimer 创建定时器bp TimerProc 定时器超时回调函数拦截文件:bp CreateFileA 创建或打开文件 (32位)bp OpenFile 打开文件 (32位)bp ReadFile 读文件 (32位)bp WriteFile 写文件 (32位)bp GetPrivateProfileStringA (ini文件)拦截驱动器:bp GetDriveTypeA 获取磁盘驱动器类型bp GetLogicalDrives 获取逻辑驱动器符号bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径★★VB程序专用断点★★bp __vbaStrCmp 比较字符串是否相等bp __vbaStrComp 比较字符串是否相等bp __vbaVarTstNe 比较变量是否不相等bp __vbaVarTstEq 比较变量是否相等bp __vbaStrCopy 复制字符串bp __vbaStrMove 移动字符串bp MultiByteToWideChar ANSI字符串转换成Unicode字符串bp WideCharToMultiByte Unicode字符串转换成ANSI字符串******************************************************************************************************************************************灰色按钮有两种情况:通过代码和控件属性VB语言:代码:ctrl+b查找 816C24,在JMP下断,然后F2运行程序,把 push ebp 改为 retn,或者把这些代码全NOP掉控件属性:VBExplorer 辅助工具改属性Delphi/BC++语言:代码:通过DEDE找FormCreate,记下地址,改 retn控件属性:相关辅助工具改属性易语言代码:bp EnableWindow,断下后返回,把 push ebp 改为 retn控件属性:用十六进制工具查找 BOB4C5A5 ,把它后面的 07 改 05破解时常用断点:VB MASM32 VC BCB 易语言 DelphiVB破解1、VBExplorer查找按钮事件2、有提示框则bp rtcMsgBox3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEqbp __vbaStrCmpbp __vbaStrComp4、万能断点法(816C24法)注册验证程序可以用这个断点下断,一般离程序访问注册表很近:bp __vbaStrToAnsi5.F12堆栈调用总结:VB程序破解的关键跳转,一般与其它语言的不同,没有JPM XXXXXXX一般以 JE/JNE XXXXXXXXX 跳转记录一般不会很远(虽然是短距离跳转,但是关键就在这里,可以设置大量的信息) 。如果发现False/True 可能是关键点VB:XXXXXXX JE/JNE XXXXX设置信息设置信息Delphi BC++ 易语言 VC++ 汇编:XXXXXXX JE/JNE XXXXX设置信息设置信息XXXXXXX JMP XXXXX设置信息设置信息VC++ 汇编(有的 一段,一段的):XXXXXXX JE/JNE XXXXX设置信息设置信息retnpush xx设置信息设置信息retnpush xx设置信息设置信息retn易语言易语言破解思路:1. 信息框法 bp MessageBoxA(断对话框)2.字符串法查看易语言文本信息:bp GetProcessHeap F9运行4次,取消断点 执行ALT+F9 用户代码 F8单步走或者在区段为”.data”/”.ecode”下断,运行3.窗口标题法 bp SetWindowTextA4.F12堆栈调用0040C0CB=易语言.0040C0CB (ASCII “shaonanshaonvluntan”)DELPHI破解:1、DEDE、PE Explorer ResScope作为强有力的辅助工具找按妞事件2、Point-H法3、bp GetDlgItem/GetDlgItemTextA(断输入框)4、bp MessageBoxA(W)(断对话框)—Ctrl+N5、字符串法—插件/搜索所有参考文本6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样的可以通过查找FormCreate/FormShow—-DEDE,找到关键标志位!来判断程序怎么样的判断是否注册或者用户类型7. 窗口标题法 bp SetWindowTextA8.F12堆栈调用注册表:bpx RegCreateKeyExA 对于Delphi程序程序来说,用这个断点比较合适bp RegCreateKeyExA 对于加了壳的程序注册码:Rc1-420+用户名(不能为整数,)+C00LC+破解C类Point-H法bp GetDlgItem(断按下按钮)bp MessageBoxA(断对话框)字符串法F12堆栈调用窗口标题法 bp SetWindowTextA★★C+程序专用断点★★bp lstrcmpA (KERNEL32.lstrcmpA) 比较用法bp _mbscmp //比较C类程序的经典断点:bp GetWindowTextA(断按下按钮) //也是适用于其它语言bp GetWindowTextLengthA(断按下按钮) //也是适用于其它语言bp GetDlgItem(断按下按钮) //也是适用于其它语言bp GetDlgItemTextAds:[004021C8]=77C01881 (msvcrt._mbscmp)BC++破解1、DEDE、PE Explorer作为强有力的辅助工具找按妞事件2、Point-H法3、bp GetDlgItem/GetDlgItemTextA(断输入框)4、bp MessageBoxA(W)(断对话框)—Ctrl+N5、字符串法—插件/搜索所有参考文本6、如果程序界面标题有[未注册/注册/VIP版/标准版/钻石版] 之类字样的可以通过查找FormCreate/FormShow—-DEDE,找到关键标志位!来判断程序怎么样的判断是否注册或者用户类型7.窗口标题法 bp SetWindowTextA8.F12堆栈调用bpx RegCreateKeyExA 对于Delphi程序程序来说,用这个断点比较合适bp RegCreateKeyExA 对于加了壳的程序MASM32 / TASM32破解入口点 :004011C7 6A 00 push 0004011C9 E8 5E070000 call 0040192C004011CE A3 70614000 mov dword ptr ds:[406170],eax004011D3 6A 00 push 0004011D5 68 EE114000 push MASM32.004011EE004011DA 6A 00 push 0004011DC 68 C8000000 push 0C8Point-H法bp GetDlgItem(断按下按钮)bp MessageBoxA(断对话框)字符串法F12堆栈调用窗口标题法 bp SetWindowTextAOD常用断点1、限制程序功能函数EnableMenuItem 允许、禁止或变灰指定的菜单条目EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)2、对话框函数CreateDialog 从资源模板建立一非模态对话窗CreateDialogParam 从资源模板建立一非模态对话窗CreateDialogIndirect 从内存模板建立一非模态对话窗CreateDialogIndirectParam 从内存模板建立一非模态对话窗DialogBox 从资源模板建立一模态对话窗DialogBoxParam 从资源模板建立一模态对话窗DialogBoxIndirect 从内存模板建立一模态对话窗DialogBoxIndirectParam 从内存模板建立一模态对话窗EndDialog 结束一模态对话窗MessageBox 显示一信息对话框MessageBoxEx 显示一信息对话框MessageBoxIndirect 显示一定制信息对话框GetDlgItemInt 得指定输入框整数值GetDlgItemText 得指定输入框输入字符串GetDlgItemTextA 得指定输入框输入字符串Hmemcpy 内存复制 (非应用程序直接调用)3、磁盘处理函数1273?GAMEHK所有–admin?11326GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息GetDriveTypeA 判断一个磁盘驱动器的类型GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母GetFullPathNameA 获取指定文件的详细路径GetVolumeInformationA 获取与一个磁盘卷有关的信息GetWindowsDirectoryA 获取Windows目录的完整路径名GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名4、文件处理函数CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台OpenFile 这个函数能执行大量不同的文件操作ReadFile 从文件中读出数据ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调WriteFile 将数据写入一个文件WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调SetFilePointer 在一个文件中设置当前的读写位置SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等_lcreat 创建一个文件_lopen 以二进制模式打开指定的文件_lread 将文件中的数据读入内存缓冲区_lwrite 将数据从内存缓冲区写入一个文件_llseek 设置文件中进行读写的当前位置_lclose 关闭指定的文件_hread 将文件中的数据读入内存缓冲区_hwrite 将数据从内存缓冲区写入一个文件OpenFileMappingA 打开一个现成的文件映射对象CreateFileMappingA 创建一个新的文件映射对象MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间MapViewOfFileEx (内容同上)CreateDirectoryA 创建一个新目录CreateDirectoryExA 创建一个新目录RemoveDirectoryA 删除指定目录SetCurrentDirectoryA 设置当前目录MoveFileA 移动文件DeleteFileA 删除指定文件CopyFileA 复制文件CompareFileTime 对比两个文件的时间SetFileAttributesA 设置文件属性SetFileTime 设置文件的创建、访问及上次修改时间FindFirstFileA 根据文件名查找文件FindNextFileA 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件FindClose 关闭由FindFirstFile函数创建的一个搜索句柄SearchPathA 查找指定文件GetBinaryTypeA 判断文件是否可以执行GetFileAttributesA 判断指定文件的属性GetFileSize 判断文件长度GetFileTime 取得指定文件的时间信息GetFileType 在给出文件句柄的前提下,判断文件类型5、注册表处理函数RegOpenKeyA 打开一个现有的注册表项RegOpenKeyExA 打开一个现有的注册表项RegCreateKeyA 在指定的项下创建或打开一个项RegCreateKeyExA 在指定项下创建新项的更复杂的方式RegDeleteKeyA 删除现有项下方一个指定的子项RegDeleteValueA 删除指定项下方的一个值RegQueryValueA 获取一个项的设置值RegQueryValueExA 获取一个项的设置值RegSetValueA 设置指定项或子项的值RegSetValueExA 设置指定项的值RegCloseKey 关闭系统注册表中的一个项(或键)6、时间处理函数CompareFileTime 比较两文件时间GetFileTime 得文件建立,最后访问,修改时间GetLocalTime 得当前本地时间GetSystemTime 得当前系统时间GetTickCount 得windows启动至现时毫秒SetFileTime 设置文件时间SetLocalTime 设置本地时间SetSystemTime 设置系统时间7、进程函数CreateProcessA 创建一个新进程ExitProcess 以干净的方式关闭一个进程FindExecutableA 查找与一个指定文件关联在一起的程序的文件名FreeLibray 释放指定的动态链库GetCurrentProcess 获取当前进程的一个伪句柄GetCurrentProcessId 获取当前进程一个唯一的标识符GetCurrentThread 获取当前线程的一个伪句柄GetExitCodeProces 获取一个已结束进程的退出代码GetExitCodeThread 获取一个已结束线程的退出代码GetModuleHandleA 获取一个应用程序或动态链接库的模块句柄GetPriorityClassA 获取特定进程的优先级别LoadLibraryA 载入指定的动态链接库,并将它映射到当前进程使用的地址空间LoadLibraryExA 装载指定的动态链接库,并为当前进程把它映射到地址空间LoadModule 载入一个windows应用程序,并在指定的环境中运行TerminateProcess 结束一个进程 |
文章大概就到这里了。。。初级部分已经写完了。资源什么的在楼下我会共享。插件我是打包的我自己的插件包。。而不是一个插件。。比较大。。。
浙公网安备 33010602011771号