-
Notifications
You must be signed in to change notification settings - Fork 2
/
atom.xml
618 lines (386 loc) · 220 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Summary's Blog</title>
<subtitle>壹百零壹分笑容</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://noblestaspiration.net/"/>
<updated>2019-04-13T09:07:25.363Z</updated>
<id>http://noblestaspiration.net/</id>
<author>
<name>Summary</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>CentOS安装</title>
<link href="http://noblestaspiration.net/2019/04/13/CentOS%E5%AE%89%E8%A3%85/"/>
<id>http://noblestaspiration.net/2019/04/13/CentOS安装/</id>
<published>2019-04-13T08:47:27.054Z</published>
<updated>2019-04-13T09:07:25.363Z</updated>
<content type="html"><![CDATA[<h2 id="CentOS系统安装"><a href="#CentOS系统安装" class="headerlink" title="CentOS系统安装"></a>CentOS系统安装</h2><p> 做好镜像之后,f2进入bios,修改启动项,然后重启,之后进入安装页面,先修改时区,然后最重要的就是分区,如果之前的硬盘上面有系统的话,要将其分区删除,然后重新划分分区,这样的话才能生效,而且在划分分区的时候一定要注意文件格式(很重要),然后安装就行(记得配图)</p><a id="more"></a><h2 id="进行系统配置:"><a href="#进行系统配置:" class="headerlink" title="进行系统配置:"></a>进行系统配置:</h2><p>1.配置物理网卡(修改物理网卡为ethX名字)</p><p> vi /etc/default/grub</p><p> 将“net.ifnames=0 biosdevname=0 ”写入到GRUBCMDLINELINUX:GRUB_CMDLINE_LINUX=”crashkernel=auto net.ifnames=0 biosdevname=0 rhgb quiet”</p><p>2.分情况执行相应命令,引导为Legacy或UEFI,在boot界面可查看引导方式:</p><p> Legacy:grub2-mkconfig -o /boot/grub2/grub.cfg </p><p> UEFI:grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg</p><p>3.然后将/etc/sysconfig/network-scripts/目录下的ifcfg-XXX xxx为原来的网卡名。像网卡名为ifcfg-en1s1pf0这样的,重命名为ifcfg-eth0。</p><p> mv ifcfg-en1s1pf0 ifcfg-eth0</p><p> ifcfg-en1s1pfX 重命名为ifcfg-ethX, X为数字。</p><p>修改这这些配置文件名,将里面旧网卡名改为ethX。然后重启服务器。</p><h2 id="修改IP"><a href="#修改IP" class="headerlink" title="修改IP"></a>修改IP</h2><p>centos默认的是没有自动开启网络,所以要配置IP地址,网关和DNS</p><p>cd /etc/sysconfig/network-scripts/</p><p>网线插在eth0上就修改ifcfg-eth0,vi ifcfg-eth0</p><p> TYPE=Ethernet</p><p> BOOTPROTO=static</p><p> IPADDR=172.20.16.17</p><p> NETMASK=255.255.0.0</p><p> NETWORK=172.20.0.0</p><p> GATEWAY=172.20.1.1</p><p> DEFROUTE=yes</p><p> PEERDNS=yes</p><p> PEERROUTES=yes</p><p> IPV4_FAILURE_FATAL=no</p><p> IPV6INIT=yes</p><p> IPV6_AUTOCONF=yes</p><p> IPV6_DEFROUTE=yes</p><p> IPV6_PEERDNS=yes</p><p> IPV6_PEERROUTES=yes</p><p> IPV6_FAILURE_FATAL=no</p><p> NAME=eth0</p><p> UUID=f91ff0db-7c64-4dae-b9d8-d54686af7cef</p><p> DEVICE=eth0</p><p> ONBOOT=yes</p><p> DNS1=180.76.76.76</p><p> DNS2=114.114.114.114</p><p>重启网络:systemctl restart network或者service network restart或者/etc/init.d/network restart</p><p>参考链接:<a href="https://www.osyunwei.com/archives/7829.html" target="_blank" rel="noopener">https://www.osyunwei.com/archives/7829.html</a></p><h2 id="关闭防火墙"><a href="#关闭防火墙" class="headerlink" title="关闭防火墙"></a>关闭防火墙</h2><p>连接Xshell:其实用XShell更好一点,可以开着虚拟机然后XShell连,更改sshd_config文件使得远程能连接上,PermitRootLogin yes那个选项把前面的/#号去掉</p><p>关闭防火墙:systemctl disable firewalld.service</p><h2 id="更新源"><a href="#更新源" class="headerlink" title="更新源"></a>更新源</h2><p>wget -O /etc/yum.repos.d/CentOS-Base.repo <a href="http://mirrors.aliyun.com/repo/Centos-7.repo" target="_blank" rel="noopener">http://mirrors.aliyun.com/repo/Centos-7.repo</a><br>wget -O /etc/yum.repos.d/epel.repo <a href="http://mirrors.aliyun.com/repo/epel-7.repo" target="_blank" rel="noopener">http://mirrors.aliyun.com/repo/epel-7.repo</a><br>然后yum update</p><h2 id="安装ifconfig"><a href="#安装ifconfig" class="headerlink" title="安装ifconfig"></a>安装ifconfig</h2><p>要想使用ifconfig和route可以通过两条指令<br>yum install net-tools#安装 infconfig<br>yum install traceroute#安装 traceroute</p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>安装:pip<br>pip不在centos的yum源里面,先安装epel源:<br>1.安装rpm包:yum -y install epel-release<br>2.查看并更新源:文件在/etc/yum.repos.d文件夹下面,两个repo文件<br>更新源:yum clean all && yum makecache<br>然后安装pip:yum install python-pip<br>另:查看防火墙的状态并关闭,centos7以上:firewall-cmd –state<br>或者用:systemctl status firewalld.service<br>关闭:systemctl stop firewalld.service<br>禁止开机启动:systemctl disable firewalld.service</p>]]></content>
<summary type="html">
<h2 id="CentOS系统安装"><a href="#CentOS系统安装" class="headerlink" title="CentOS系统安装"></a>CentOS系统安装</h2><p> 做好镜像之后,f2进入bios,修改启动项,然后重启,之后进入安装页面,先修改时区,然后最重要的就是分区,如果之前的硬盘上面有系统的话,要将其分区删除,然后重新划分分区,这样的话才能生效,而且在划分分区的时候一定要注意文件格式(很重要),然后安装就行(记得配图)</p>
</summary>
<category term="运维" scheme="http://noblestaspiration.net/categories/%E8%BF%90%E7%BB%B4/"/>
<category term="Linux" scheme="http://noblestaspiration.net/tags/Linux/"/>
<category term="CentOS" scheme="http://noblestaspiration.net/tags/CentOS/"/>
</entry>
<entry>
<title>gdb instruction</title>
<link href="http://noblestaspiration.net/2018/09/29/gdb-instruction/"/>
<id>http://noblestaspiration.net/2018/09/29/gdb-instruction/</id>
<published>2018-09-29T08:39:46.709Z</published>
<updated>2019-03-23T03:34:03.565Z</updated>
<content type="html"><![CDATA[<p>About GDB</p><blockquote><p>GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.</p></blockquote><a id="more"></a><p>g++相关:<a href="https://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html" target="_blank" rel="noopener">https://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html</a></p><p>基本指令:</p><table><thead><tr><th>list/l</th><th>列出源代码(十行)</th></tr></thead><tbody><tr><td>next/n</td><td>跳过直接执行不进入函数内部(像OD里面的F8)</td></tr><tr><td>step/s</td><td>进入函数体(像OD里面的F7)</td></tr><tr><td>si</td><td>一条一条指令单步的调试</td></tr><tr><td>backtrace/bt</td><td>查看函数调用的栈帧,可以看到栈帧号</td></tr><tr><td>info/i</td><td>查看函数局部变量值,一般可写i locals<br>也可以先bt然后再输入i locals<br>还可以f [栈帧号]然后i locals看这个函数里面的局部变量值</td></tr><tr><td>info registers</td><td>可以显示所有寄存器的当前值</td></tr><tr><td>frame/f [栈帧号]</td><td>可产看其他函数体的局部变量值,配合i locals使用</td></tr><tr><td>finish</td><td>结束</td></tr><tr><td>set $var</td><td>修改变量值</td></tr><tr><td>display $var</td><td>每次停下的时候显示var值,使用undisplay取消</td></tr><tr><td>break [行号]</td><td>在某行设置断点<br> i breakpoints 显示断点信息<br> delete breakpoints [号] 删除断点,不加断点号就是删除所有<br> disable breakpoints [号] 禁用某个断点,不加断点号就是禁用所有</td></tr><tr><td>continue</td><td>继续运行</td></tr><tr><td>run</td><td>执行</td></tr><tr><td>x</td><td>查看输入<br> x/7b input表示每个字节一组(b),7表示打印7组</td></tr><tr><td>watch</td><td>设置观察点<br> 例如watch input[i] 每次运行查看input数组里面i的值<br> i watch查看设置了哪些断点</td></tr><tr><td>p</td><td>print,<code>p $esp</code>可以打印寄存器中的值</td></tr><tr><td>gcc -c 目标文件</td><td>将.c文件编译成.o文件,也就是目标文件</td></tr><tr><td>ar rs</td><td>打包静态库,用法ar rs 静态库名 1.o 2.o …<br> <code>ar</code>命令类似于<code>tar</code>命令,起一个打包的作用,但是把目标文件打包成静态库只能用<code>ar</code>命令而不能用<code>tar</code>命令。选项<code>r</code>表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包中已有同名文件就替换成新的。<code>s</code>是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。</td></tr><tr><td>ranlib</td><td>ar r 之后,再ranlib 静态库名等同于上面的指令</td></tr><tr><td>gcc -print-search-dirs</td><td>查看默认目录</td></tr><tr><td>gcc -c -fPIC *.c</td><td>编译共享库的时候要加上fPIC选项</td></tr><tr><td>gcc -S main.c</td><td>生成汇编文件</td></tr><tr><td>gcc -c main.s</td><td>生成目标文件</td></tr></tbody></table><p><strong>一些注意事项:1.如果某个函数的变量发生越界错误,可能不会立刻发生错误,而是在函数返回时产生段错误 </strong> </p>]]></content>
<summary type="html">
<p>About GDB</p>
<blockquote>
<p>GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.</p>
</blockquote>
</summary>
<category term="Debugger" scheme="http://noblestaspiration.net/categories/Debugger/"/>
<category term="Linux" scheme="http://noblestaspiration.net/tags/Linux/"/>
<category term="Debugger" scheme="http://noblestaspiration.net/tags/Debugger/"/>
</entry>
<entry>
<title>Debian8下搭建MooseFS</title>
<link href="http://noblestaspiration.net/2018/09/03/Debian8%E4%B8%8B%E6%90%AD%E5%BB%BAMooseFS/"/>
<id>http://noblestaspiration.net/2018/09/03/Debian8下搭建MooseFS/</id>
<published>2018-09-03T12:49:52.464Z</published>
<updated>2018-09-05T07:23:14.702Z</updated>
<content type="html"><![CDATA[<h2 id="关于MFS"><a href="#关于MFS" class="headerlink" title="关于MFS"></a>关于MFS</h2><p>官网地址:<a href="https://moosefs.com/" target="_blank" rel="noopener">https://moosefs.com/</a></p><p>官网的介绍:</p><blockquote class="blockquote-left">MooseFS is a Fault-tolerant, Highly available, Highly performing, Scaling-out, Network distributed file system. It spreads data over several physical commodity servers, which are visible to the user as one virtual disk. It is POSIX compliant and acts like any other Unix-like file system supporting:<br><br>- Hierarchical structure: Files and Folders,<br>- File attributes,<br>- Special files: Pipes, Sockets, Block and Character devices,<br>- Symbolic and Hard links,<br>- Security attributes and ACLs.<br><br>It works with all applications that require a standard file system.</blockquote><a id="more"></a><p>CSDN有博客介绍:</p><p>MooseFS是一个分布式存储的框架,它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。其具有如下特性:</p><ul><li>Free(GPL)</li><li>通用文件系统,不需要修改上层应用就可以使用</li><li>可以在线扩容,体系架构可伸缩性极强。</li><li>部署简单。</li><li>高可用,可设置任意的文件冗余程度</li><li>可回收在指定时间内删除的文件</li><li>提供netapp,emc,ibm等商业存储的snapshot特性。</li><li>google filesystem的一个c实现。</li><li>提供web gui监控接口。</li><li>提高随机读或写的效率。</li><li>提高海量小文件的读写效率。</li></ul><p>MooseFS工作原理和设计架构:</p><table><thead><tr><th>管理服务器 Manager server(master)</th><th>负责各个数据存储服务器的管理,文件读写调度,文件空间回收及恢复,多节点拷贝</th></tr></thead><tbody><tr><td>元数据日志服务器 Metalogger server(metalogger)</td><td>负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作</td></tr><tr><td>数据存储服务器 Data servers(chunkservers)</td><td>负责联系管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输</td></tr><tr><td>客户机挂载使用 Client computers</td><td>通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地unix文件系统使用一样的效果</td></tr></tbody></table><h2 id="安装过程"><a href="#安装过程" class="headerlink" title="安装过程"></a>安装过程</h2><p>安装过程中,将master、chunkserver与client装在一台,metalogger装在另一台</p><p>接下来图片展示过程:</p><p>官网有安装过程:<a href="https://moosefs.com/download/#current" target="_blank" rel="noopener">https://moosefs.com/download/#current</a></p><h3 id="基础安装,每台机器都需安装"><a href="#基础安装,每台机器都需安装" class="headerlink" title="基础安装,每台机器都需安装"></a>基础安装,每台机器都需安装</h3><p>跟着官网文档走,先下载文件系统:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_001.png" alt="mfs"></p><p>然后将这句写到/etc/apt/source.list.d/moosefs.list里面,然后更新</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_002.png" alt="mfs"></p><h3 id="master安装:"><a href="#master安装:" class="headerlink" title="master安装:"></a>master安装:</h3><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_003.png" alt="mfs"></p><p>安装好之后etc会出现mfs文件夹,进去可以看到很多文件</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_004.png" alt="mfs"></p><p>修改mfsexport.cfg如下:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_inser4_5.png" alt="mfs"></p><p>然后修改host如下:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_insert4_5_2.png" alt="mfs"></p><p>然后启动,下图中可以看到各个板块的端口号</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_005.png" alt="mfs"></p><p>使用指令<code>netstat -ntpl | grep mfs</code> 查看与master的连接</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_007.png" alt="mfs"></p><p>启动之后在浏览器里面就可以使用IP:<code>192.168.213.140:9245</code> 看master</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_008.png" alt="mfs"></p><h3 id="安装metalogger:"><a href="#安装metalogger:" class="headerlink" title="安装metalogger:"></a>安装metalogger:</h3><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_009.png" alt="mfs"></p><p>修改mfsmetalooger.cfg:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_010.png" alt="mfs"><img src="http://p6flo4av7.bkt.clouddn.com/mfs_011.png" alt="mfs"></p><p><strong>注意:如果安装在不同的机器,一定要配置/etc/hosts同上</strong></p><h3 id="安装chunkserver"><a href="#安装chunkserver" class="headerlink" title="安装chunkserver"></a>安装chunkserver</h3><p>先安装: <code>apt install moosefs-chunkserver</code></p><p>继续修改mfschunkserver.cfg</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_012.png" alt="mfs"><img src="http://p6flo4av7.bkt.clouddn.com/mfs_013.png" alt="mfs"></p><p>修改mfshdd.cfg文件,mfshdd.cfg定义了chunkserver的数据存放目录,将目录设置为/data/mfs/ (前提是这个目录已经存在,因此需要手动创建此目录)</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_014.png" alt="mfs"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_015.png" alt="mfs"></p><p><strong>注意:如果安装在不同的机器,一定要配置/etc/hosts同上</strong></p><h3 id="安装客户端client"><a href="#安装客户端client" class="headerlink" title="安装客户端client"></a>安装客户端client</h3><p>先安装:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_016.png" alt="mfs"></p><p>修改mfsmount.cfg</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_017.png" alt="mfs"></p><p>然后启动:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_018.png" alt="mfs"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_019.png" alt="mfs"></p><p>然后进行客户端挂载:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_020.png" alt="mfs"></p><p>然后可以在网站看:</p><p>首页</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_021.png" alt="mfs"></p><p>server:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_022.png" alt="mfs"></p><p>disk:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/mfs_023.png" alt="mfs"></p><blockquote><p>参考链接:搭建:<a href="https://www.cnblogs.com/manger/p/7212110.html" target="_blank" rel="noopener">https://www.cnblogs.com/manger/p/7212110.html</a><br><a href="https://www.linuxidc.com/Linux/2015-09/122621.htm" target="_blank" rel="noopener">https://www.linuxidc.com/Linux/2015-09/122621.htm</a><br>官网:<a href="https://moosefs.com/download/#current" target="_blank" rel="noopener">https://moosefs.com/download/#current</a><br>常见问题:<a href="https://www.linuxidc.com/Linux/2013-06/85752.htm" target="_blank" rel="noopener">https://www.linuxidc.com/Linux/2013-06/85752.htm</a></p></blockquote>]]></content>
<summary type="html">
<h2 id="关于MFS"><a href="#关于MFS" class="headerlink" title="关于MFS"></a>关于MFS</h2><p>官网地址:<a href="https://moosefs.com/" target="_blank" rel="noopener">https://moosefs.com/</a></p>
<p>官网的介绍:</p>
<blockquote class="blockquote-left">MooseFS is a Fault-tolerant, Highly available, Highly performing, Scaling-out, Network distributed file system. It spreads data over several physical commodity servers, which are visible to the user as one virtual disk. It is POSIX compliant and acts like any other Unix-like file system supporting:<br><br>- Hierarchical structure: Files and Folders,<br>- File attributes,<br>- Special files: Pipes, Sockets, Block and Character devices,<br>- Symbolic and Hard links,<br>- Security attributes and ACLs.<br><br>It works with all applications that require a standard file system.</blockquote>
</summary>
<category term="Distributed File System" scheme="http://noblestaspiration.net/categories/Distributed-File-System/"/>
<category term="Linux" scheme="http://noblestaspiration.net/tags/Linux/"/>
<category term="MooseFS" scheme="http://noblestaspiration.net/tags/MooseFS/"/>
<category term="Distributed File System" scheme="http://noblestaspiration.net/tags/Distributed-File-System/"/>
</entry>
<entry>
<title>Linux基础</title>
<link href="http://noblestaspiration.net/2018/08/25/Linux%E5%9F%BA%E7%A1%80/"/>
<id>http://noblestaspiration.net/2018/08/25/Linux基础/</id>
<published>2018-08-25T03:37:35.221Z</published>
<updated>2019-04-12T09:41:44.076Z</updated>
<content type="html"><![CDATA[<blockquote class="blockquote-center">自己在使用linux时候的总结,不定时更新</blockquote><iframe src="https://music.163.com/outchain/player?type=2&id=441458&auto=0&height=66" width="930" height="100" frameborder="0" allowfullscreen></iframe><a id="more"></a><h1 id="linux"><a href="#linux" class="headerlink" title="linux"></a>linux</h1><h2 id="基本指令"><a href="#基本指令" class="headerlink" title="基本指令"></a>基本指令</h2><ul><li><p>cp:<code>cp -rf /var/cos/* /root</code>把var/cos下所有东西拷贝到root下</p></li><li><p>scp:<code>scp [-r或者其他参数][文件名或文件夹名] [root@IP:/文件路径]</code>跨机器传输</p></li><li><p>新建文件夹:单级:<code>mkdir [文件名]</code> 多级:<code>mkdir -p [文件名]</code></p></li><li><p>创建文件:<code>touch [文件名+扩展名]</code>,<code>rm [文件名]</code></p></li><li><p>移动文件:<code>mv</code></p></li><li><p>删除文件:单个文件:<code>rm [文件名]</code>(删文件夹要<code>rmdir [文件名]</code>) 删除目录及目录所有文件和子目录:<code>rm -rf [文件名]</code></p></li><li><p>查看文件类型:<code>file [文件名]</code></p></li><li><p>查找指令:</p><ul><li><strong>find</strong>:<code>find -name/-type filename</code><br><code>find -type f -mmin -10</code>所有过去10分钟更新过的普通文件,不加<code>-type f</code>则搜索普通文件+特殊文件+目录</li><li><strong>locate</strong>:<code>locate</code>是<code>find -name</code>的另外一种写法<code>locate</code>快很多,因为只搜索<code>/var/lib/locatedb</code>,这个数据库中包含了本地所有文件信息<br><code>locate /etc/sh</code>,搜索etc下所有sh开头的文件<br><code>locate ~/m</code>,搜索所有m开头的文件<br><code>locate -i ~/m</code>,用户主目录下所有m开头的文件,并且忽略大小写</li><li><strong>whereis</strong>,只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s),如果省略所有信息则返回所有信息</li><li><strong>which</strong>,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果,可以看到某个命令是否存在,以及执行的到底是哪个位置的命令</li><li>总结:<strong>which</strong> 查看可执行文件的位置<br><strong>whereis</strong> 查看文件的位置<br><strong>locate</strong> 配合数据库查看文件位置<br><strong>find</strong> 实际搜寻硬盘查询文件名称</li></ul><p>以上参考链接:<a href="https://www.cnblogs.com/kex1n/p/5233821.html" target="_blank" rel="noopener">https://www.cnblogs.com/kex1n/p/5233821.html</a></p></li><li><p>查找带某个字符的所有文件:</p><p><code>grep -rn "hello,world!" *</code></p><p>* : 表示当前目录所有文件,也可以是某个文件名</p><p>-r 是递归查找</p><p>-n 是显示行号</p><p>-R 查找所有文件包含子目录</p><p>-i 忽略大小写</p><p><code>find -type f -name '*.php' | xargs grep 'GroupRecord'</code> xargs配合grep查找</p></li><li><p>修改权限:<code>chmod [-cfvR][--help] [--version][文件名]</code></p><p>参数详解:<strong>mode : 权限设定字串,格式如下 : [ugoa…][[+-=][rwxX]…][,…],其中 u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。</strong></p><p><strong>-c : 若该档案权限确实已经更改,才显示其更改动作 </strong><br><strong>-f : 若该档案权限无法被更改也不要显示错误讯息</strong><br><strong>-v : 显示权限变更的详细资料 </strong><br><strong>-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) </strong><br><strong>–help : 显示辅助说明 </strong><br><strong>–version : 显示版本</strong></p><p><strong>+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。</strong> </p><p>r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。</p><p>其中ll(ls -l)可以看到,r-读(4),w-写(2),x-执行(1),rw—r—r代表权限644,rwxrw—r代表权限是764,其中7表示所有者对应的权限,6是表示所属组的用户权限,4表示其他用户,所以修改权限最直接的指令就是<code>chmod 777 [dir]</code></p></li><li><p><code>nl [dir]</code>(读取file参数)计算输入中的行号</p></li></ul><ul><li><p>about network:</p><p>重启:<code>service network restart(centos),/etc/init.d/networking restart(debian)</code></p><p>查看:<code>systemctl status firewalld.service</code>或者<code>firewall-cmd--state</code></p><p>关闭:<code>systemctl stop firewalld.service</code></p><p>禁止开机启动:<code>systemctl disable firewalld.service</code>(这里换成其他也可以,比如<code>network.service</code>)</p></li></ul><ul><li><p>sz&rz:(假若没有则安装)<code>yum install -y lrzsz</code></p><p>具体操作:<code>sz filename</code>发送到本地</p><p><code>rz</code>上传文件</p></li><li><p>cron:cron服务是Linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:</p><p><code>/sbin/service crond start</code>(开机自启在<code>/etc/rc.d/rc.local</code>脚本中加入<code>/sbin/service crond start</code>)</p><p><code>/sbin/service crond stop</code><br><code>/sbin/service crond restart</code><br><code>/sbin/service crond reload</code></p><p>编辑:<code>crontab -e</code>,删除:<code>crontab -r</code></p><p>E:<code>echo "1 1 * * * command" >> /var/spool/cron/root</code><br>中间五个分别是分时日月周,*/10分钟的话,10分钟执行一次。10-23/2小时的话,上午十点到晚上23点每两个小时执行一次</p></li><li><p>ln:<code>ln [选项][参数]</code>链接指令。其中选项s常用,其他的见<a href="http://man.linuxde.net/ln" target="_blank" rel="noopener">http://man.linuxde.net/ln</a> ,-s或–symbolic:对源文件建立符号连接,而非硬连接,如果不打参数默认硬链接。</p><p>E:将目录<code>/usr/mengqc/mub1</code>下的文件m2.c链接到目录<code>/usr/liu</code>下的文件a2.c:</p><blockquote><p>cd /usr/mengpc</p><p>ln /mub1/m2.c /usr/liu/a2.c</p></blockquote></li><li><p>tar:<code>tar (选项)(参数)</code></p><p>选项(部分):</p><p>-d:记录文件的差别;<br>-x或–extract或–get:从备份文件中还原文件;<br>-t或–list:列出备份文件的内容;<br>-z或–gzip或–ungzip:通过gzip指令处理备份文件;<br>-Z或–compress或–uncompress:通过compress指令处理备份文件;<br>-f<备份文件>或–file=<备份文件>:指定备份文件;<br>-v或–verbose:显示指令执行过程;<br>-r:添加文件到已经压缩的文件;<br>-u:添加改变了和现有的文件到已经存在的压缩文件;<br>-j:支持bzip2解压文件;<br>-v:显示操作过程;<br>-l:文件系统边界设置;<br>-k:保留原有文件不覆盖;<br>-m:保留文件不被覆盖;<br>-w:确认压缩文件的正确性;</p><p>E:</p><blockquote><p>压缩:</p><p>tar –cvf jpg.tar <em>.jpg //将目录里所有jpg文件打包成tar.jpg<br>tar –czf jpg.tar.gz </em>.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz<br>tar –cjf jpg.tar.bz2 <em>.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2<br>tar –cZf jpg.tar.Z </em>.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z<br>rar a jpg.rar <em>.jpg //rar格式的压缩,需要先下载rar for Linux<br>zip jpg.zip </em>.jpg //zip格式的压缩,需要先下载zip for Linux</p><p>解压:</p><p>tar –xvf file.tar //解压 tar包<br>tar -xzvf file.tar.gz //解压tar.gz<br>tar -xjvf file.tar.bz2 //解压 tar.bz2<br>tar –xZvf file.tar.Z //解压tar.Z<br>unrar e file.rar //解压rar<br>unzip file.zip //解压zip</p></blockquote><p>参考链接:<a href="http://man.linuxde.net/tar" target="_blank" rel="noopener">http://man.linuxde.net/tar</a></p></li><li><p>netstat:<code>netstat -an</code> “-a”选项意在显示所有连接,当不附加”-n”选项时,它显示的是本地计算机的netbios名字+端口号。而加了”-n”选项后,它显示的是本地IP地址+端口号。</p></li><li><p>重新动态获取IP:<code>dhclient -r /释放IP</code> 然后<code>dhclient</code></p></li><li><p>查看进程:<code>ps -ef | grep httpd</code>(检查httpd进程是否存在)</p><p>参数详解:<strong>ps:将某个进程显示出来</strong></p><p><strong>-e:显示所有进程</strong></p><p><strong>-f:全格式</strong></p><p><strong>| :管道命令,ps与grep同时执行</strong><br><strong>grep(Global Regular Expression Print):查找,强大的文本搜索工具,使用正则表达式搜索文本并把匹配的行打印出来</strong></p><p><code>cat /proc/进程号/maps</code> 查看虚拟地址空间</p><p>E:假如现在正在mv文件但是没有进度条,可以ps -ef | grep mv来看是否移动完了</p><p>杀死进程:<code>killall 进程名</code></p></li><li><p>查看端口:<code>lsof -i:端口号</code></p></li><li><p>查看CPU信息:<code>cat /proc/cpuinfo</code> # 查看CPU信息,可以看到核心数</p></li><li><p>查看系统负载:<code>cat /proc/loadavg</code> # 查看系统负载</p></li><li><p>查看CUP数:<code>cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l</code></p></li><li><p>查看内核数:<code>cat /proc/cpuinfo |grep "processor"|wc -l</code></p><p>具体看每个cpu对应的核心:<code>cat /proc/cpuinfo | grep physical | uniq -c</code></p></li><li><p>查看CPU型号和数量:<code>cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c</code></p></li></ul><ul><li><p>查看磁盘使用情况:<code>df -h</code>查看物理机</p><p><code>du -h</code>查看当前目录下的空间使用情况,这条指令会遍历</p></li></ul><ul><li><p>查看内存:</p><p><code>free</code> 默认kb,后面加上参数-m就可看mb<br><code>top</code> 类似任务管理器,查看运行程序<br><code>vmstat</code> 主要参数free空闲,buff已用缓冲数目,cache已用缓存数目<br><code>vgdiplay</code> 查看卷组名称及卷组使用情况<br><code>lvdisplay</code> 当前逻辑卷空间状态</p><p><code>LVM</code>扩容参考网址:<a href="https://blog.csdn.net/u012439646/article/details/73380197" target="_blank" rel="noopener">https://blog.csdn.net/u012439646/article/details/73380197</a></p></li></ul><ul><li>擦除网卡缓存:<code>ip addr flush eth0</code></li><li>显示已加载的系统的模块:<code>lsmod</code></li></ul><ul><li><p>查看版本:<code>cat /etc/redhat-release</code>(目测是隐藏文件)或者<code>uname -a(centos)</code> 或者<code>lsb_release -a</code></p></li><li><p>查看应用:<code>rpm -qa | grep [软件名]</code>或<code>rpm -q [软件名]</code></p></li><li><p><code>/dev/sda3</code>表示的意思:/dev是表示设备,访问外部设备的端口(其实就是文件)</p><p><code>/dev/hd[a-t]:IDE</code>设备,hda,hdb表示harddisk,a表示第一个盘等等</p><p><code>/dev/sd[a-z]</code>:SCSI设备和SATA设备,a表示第一个,以此类推,1-4分给主分区。其他的是扩展分区</p><p><code>/dev/fd[0-7]</code>:标准软驱<br><code>/dev/md[0-31]</code>:软raid设备<br><code>/dev/loop[0-7]</code>:本地回环设备<br><code>/dev/ram[0-15]</code>:内存</p><p>linux下各个文件目录的意思:<a href="https://www.jb51.net/LINUXjishu/32180.html" target="_blank" rel="noopener">https://www.jb51.net/LINUXjishu/32180.html</a></p></li><li><p>查看系统时间并且修改:<br>查看:当前:<code>data</code>,硬件时间:<code>hwclock</code><br>修改:<code>date -s “2018-08-24 10:45:10”</code><br>同步:<code>hwclock --systohc</code></p><p>修改时区:<code>timedatectl list-timezones |grep Shanghai</code>- -结果<code>Asia/Shanghai</code></p><p> <code>timedatectl set-timezone Asia/Shanghai</code></p></li></ul><hr><h2 id="安装软件"><a href="#安装软件" class="headerlink" title="安装软件"></a>安装软件</h2><h3 id="Debian下"><a href="#Debian下" class="headerlink" title="Debian下"></a>Debian下</h3><ul><li><p>sudo:进入root:su,输入密码,然后apt-get install sudo,这样可以使用sudo</p></li><li><p>vim:安装过程中如果遇到下面<code>遇到的问题</code>中第二个问题则先解决,然后<code>apt-get update&apt-get upgrade</code><br>出现需要先安装<code>common</code>,则就是<code>apt-get remove vim-common</code>,然后再<code>apt-get install vim</code><br>参考链接:<a href="https://www.cnblogs.com/drfxiaoliuzi/p/4143933.html" target="_blank" rel="noopener">https://www.cnblogs.com/drfxiaoliuzi/p/4143933.html</a></p><p>配置源的参考链接:<a href="https://blog.csdn.net/w6280190/article/details/80840728" target="_blank" rel="noopener">https://blog.csdn.net/w6280190/article/details/80840728</a></p><p>gg:跳到第一行</p><p>shift+g:跳到最后一行</p><p>ddp:光标所在行与下一行进行交换</p><p>xp:光标所在的字符与后面一个字符交换</p></li><li><p>gcc:<code>apt-get install build-essential</code> 这个命令会将所有c语言的开发包安装好,包含了gcc make gdb和lib函数库很多工具,build-essential是c语言的开发包</p></li><li><p>apt命令:<code>apt-get install --reinstall 软件名</code> 重新安装</p></li></ul><p> <code>apt-get remove 软件名</code>卸载软件</p><p> <code>apt-get clean</code>清除deb包</p><h3 id="Centos6-6下"><a href="#Centos6-6下" class="headerlink" title="Centos6.6下"></a>Centos6.6下</h3><ul><li><p>安装Mysql</p><p>首先查看是否有旧版本</p><blockquote><p>rpm –qa | grep -i mysql 或者 yum list installed | grep mysql</p></blockquote><p>删除系统自带或者已安装版本</p><blockquote><p>yum -y remove mysql-libs.x86_64</p></blockquote><p>然后给CentOS添加rpm源</p><blockquote><p> wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm</p><p> yum localinstall mysql-community-release-el6-5.noarch.rpm</p><p> yum repolist all | grep mysql</p><p> yum-config-manager –disable mysql55-community</p><p> yum-config-manager –disable mysql56-community</p><p> yum-config-manager –enable mysql57-community-dmr</p><p> yum repolist enabled | grep mysql</p></blockquote><p>安装mysql</p><blockquote><p>yum install mysql-community-server</p></blockquote><p>启动mysql</p><blockquote><p>service mysqld start</p></blockquote><p>查看mysql是否自启动,并且设置开启自启动</p><blockquote><p>chkconfig –list | grep mysqld</p><p>chkconfig mysqld on</p></blockquote><p>mysql安全设置</p><blockquote><p>mysql_secure_installation</p></blockquote><p><strong>注意centos6没有systemd,所以没有systemctl命令,只有service命令,查看状态可以service mysqld status </strong></p><p><img src="/2018/08/25/Linux基础/C:/Users\liyuf\AppData\Local\Temp\1543320226149.png" alt="mysql"></p></li></ul><hr><h2 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h2><h3 id="Debian下-1"><a href="#Debian下-1" class="headerlink" title="Debian下"></a>Debian下</h3><ul><li>运行脚本:先要有执行权限:<code>chmod u+x [文件名]</code>,执行:<code>bash [文件名.sh]或者./[文件名]</code></li><li>apt-get install之后404 not found的话那就直接先update一下</li><li>能ping通自己和网关,但是上不去网可能是路由表里面没有网关地址,route -n就可以查看,没有网关的话就直接添加就行:<code>route add defualt gw X.X.X.X</code> 这样再去看路由表里面应该就有网关,可以上网了 </li></ul><ul><li><p>ping通自己的ip,ping不通网关,要不就是自己的网关设置错了,要不就是IP冲突,改网关子网掩码和IP试试,自己虚拟机的debian非常奇怪,网关居然是192.168.213.2,IP没有冲突但是网关设置成192.168.1.1就不行,子网掩码要设成24(这个问题有待商榷,这个可能是错误的,那台Debian有些问题)</p></li><li><p>ifconfig看不到eth0,ifconfig -a可以看到,很可能是没有设置MAC地址造成,执行下面几条命令,如果是新建虚拟机的话,造成原因可能是路由器</p><blockquote><p>ifconfig eth0 down</p><p>ifconfig eth0 hw ether 00:00:AA:BB:CC:DD#随便写一个就行</p><p>ifconfig eth0 up</p><p>/etc/init.d/network restart</p></blockquote><p>这样就解决了</p></li><li><p>Debian安装缺少光盘源并且一直检测cdrom,打开/etc/apt/sources.list(最好先备份)文件,注释掉cdrom那一行,然后添加上163源或者其他源,然后再执行apt-get update和apt-get upgrade更新下deb仓库,这样以后再使用apt-get安装时就不会再搜寻cdrom了</p><p>163源:deb <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> squeeze main non-free contrib<br>deb <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> squeeze-proposed-updates main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> squeeze main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> squeeze-proposed-updates main non-free contrib</p><p>sohu:deb <a href="http://mirrors.sohu.com/debian/" target="_blank" rel="noopener">http://mirrors.sohu.com/debian/</a> lenny main non-free contrib<br>deb <a href="http://mirrors.sohu.com/debian/" target="_blank" rel="noopener">http://mirrors.sohu.com/debian/</a> lenny-proposed-updates main non-free contrib<br>deb-src <a href="http://mirrors.sohu.com/debian/" target="_blank" rel="noopener">http://mirrors.sohu.com/debian/</a> lenny main non-free contrib<br>deb-src <a href="http://mirrors.sohu.com/debian/" target="_blank" rel="noopener">http://mirrors.sohu.com/debian/</a> lenny-proposed-updates main non-free contrib</p><p>试了上面的源感觉不行,所以重新找的源:<a href="https://blog.csdn.net/yjk13703623757/article/details/78943345/" target="_blank" rel="noopener">https://blog.csdn.net/yjk13703623757/article/details/78943345/</a></p><p>其他源:</p><p>jessie:deb <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie main non-free contrib<br>deb <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie-updates main non-free contrib<br>deb <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie-backports main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie-updates main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian/" target="_blank" rel="noopener">http://mirrors.163.com/debian/</a> jessie-backports main non-free contrib<br>deb <a href="http://mirrors.163.com/debian-security/" target="_blank" rel="noopener">http://mirrors.163.com/debian-security/</a> jessie/updates main non-free contrib<br>deb-src <a href="http://mirrors.163.com/debian-security/" target="_blank" rel="noopener">http://mirrors.163.com/debian-security/</a> jessie/updates main non-free contrib</p></li></ul><h3 id="CentOS7下"><a href="#CentOS7下" class="headerlink" title="CentOS7下"></a>CentOS7下</h3><ul><li>network相关,<a href="https://blog.csdn.net/weiyongle1996/article/details/75128239,如果网络首选的网桥br0的话,一定要注意其他网卡的配置,不能出现dchp,因为centos刚开始的时候要配置静态的IP,网桥要和其他网卡IP保持一致,dchp和static不一定会保持一致,所以导致无法上网,然后遇到网络状态是active但是依然无法上网怎么办,这时候考虑是否IP冲突,解决冲突之后就可上网///10.19更新,eth1里面dhcp会有影响,所以将/etc/sysconfig/network-script文件夹下的ifcfg-eth1改名为ifcfg-eth1.bak,如果改成ifcfg-eth1.BAK的话就不行,只能改成小写" target="_blank" rel="noopener">https://blog.csdn.net/weiyongle1996/article/details/75128239,如果网络首选的网桥br0的话,一定要注意其他网卡的配置,不能出现dchp,因为centos刚开始的时候要配置静态的IP,网桥要和其他网卡IP保持一致,dchp和static不一定会保持一致,所以导致无法上网,然后遇到网络状态是active但是依然无法上网怎么办,这时候考虑是否IP冲突,解决冲突之后就可上网///10.19更新,eth1里面dhcp会有影响,所以将/etc/sysconfig/network-script文件夹下的ifcfg-eth1改名为ifcfg-eth1.bak,如果改成ifcfg-eth1.BAK的话就不行,只能改成小写</a></li></ul><h3 id="Ubuntu下"><a href="#Ubuntu下" class="headerlink" title="Ubuntu下"></a>Ubuntu下</h3><ul><li><p>Ubuntu更新源,可用源:</p><p>163源:#163 guangdong </p><p>deb <a href="http://mirrors.163.com/ubuntu/trusty" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty</a> main restricted universe multiverse </p><p>deb <a href="http://mirrors.163.com/ubuntu/trusty-security" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-security</a> main restricted universe multiverse </p><p>deb <a href="http://mirrors.163.com/ubuntu/trusty-updates" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-updates</a> main restricted universe multiverse </p><p>deb <a href="http://mirrors.163.com/ubuntu/trusty-proposed" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-proposed</a> main restricted universe multiverse </p><p>deb <a href="http://mirrors.163.com/ubuntu/trusty-backports" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-backports</a> main restricted universe multiverse </p><p>deb-src <a href="http://mirrors.163.com/ubuntu/trusty" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty</a> main restricted universe multiverse </p><p>deb-src <a href="http://mirrors.163.com/ubuntu/trusty-security" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-security</a> main restricted universe multiverse </p><p>deb-src <a href="http://mirrors.163.com/ubuntu/trusty-updates" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-updates</a> main restricted universe multiverse </p><p>deb-src <a href="http://mirrors.163.com/ubuntu/" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/</a> trusty-proposed main restricted universe multiverse</p><p>deb-src <a href="http://mirrors.163.com/ubuntu/trusty-backports" target="_blank" rel="noopener">http://mirrors.163.com/ubuntu/trusty-backports</a> main restricted universe multiverse</p><p>阿里源:</p><p>deb-src <a href="http://archive.ubuntu.com/ubuntu" target="_blank" rel="noopener">http://archive.ubuntu.com/ubuntu</a> xenial main restricted</p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial</a> main restricted </p><p>deb-src <a href="http://mirrors.aliyun.com/ubuntu/xenial" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial</a> main restricted multiverse universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-updates" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-updates</a> main restricted </p><p>deb-src <a href="http://mirrors.aliyun.com/ubuntu/xenial-updates" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-updates</a> main restricted multiverse universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial</a> universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-updates" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-updates</a> universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/</a> xenial multiverse </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/</a> xenial-updates multiverse </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-backports" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-backports</a> main restricted universe multiverse </p><p>deb-src <a href="http://mirrors.aliyun.com/ubuntu/xenial-backports" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-backports</a> main restricted universe multiverse </p><p>deb <a href="http://archive.canonical.com/ubuntu" target="_blank" rel="noopener">http://archive.canonical.com/ubuntu</a> xenial partner </p><p>deb-src <a href="http://archive.canonical.com/ubuntu" target="_blank" rel="noopener">http://archive.canonical.com/ubuntu</a> xenial partner </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-security" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-security</a> main restricted </p><p>deb-src <a href="http://mirrors.aliyun.com/ubuntu/xenial-security" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-security</a> main restricted multiverse universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-security" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-security</a> universe </p><p>deb <a href="http://mirrors.aliyun.com/ubuntu/xenial-security" target="_blank" rel="noopener">http://mirrors.aliyun.com/ubuntu/xenial-security</a> multiverse</p></li><li><p>初始安装的时候设置root密码是通过</p><blockquote><p>sudo passwd root</p></blockquote><p>然后输入密码既可以,另外修改hostname和静态IP必须要重启一下才能生效</p></li><li><p>配置ssh使其在远程能直接root登录</p><blockquote><p>apt-get install ssh</p><p>/etc/init.d/ssh start #启动</p><p>vim /etc/ssh/sshd_config #找到PermitRootLogin without-password修改为PermitRootLogin yes</p><p>/etc/init.d/ssh restart</p></blockquote></li></ul><hr><h2 id="常见脚本"><a href="#常见脚本" class="headerlink" title="常见脚本"></a>常见脚本</h2><ul><li><p>centos统计ping输出日志的脚本:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">ping 10.121.82.94 -c 172800 | awk <span class="string">'{ print $0"\t" strftime("%H:%M:%S",systime()) }'</span> > /tmp/ping94.log &</span><br></pre></td></tr></table></figure></li><li><p>centos7中根据文件大小排序以及jenkins配置每周删除一次jobs日志信息:<a href="https://blog.csdn.net/u013066244/article/details/70232050" target="_blank" rel="noopener">https://blog.csdn.net/u013066244/article/details/70232050</a></p></li><li><p>shell统计某个目录文件数量:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash </span></span><br><span class="line"> </span><br><span class="line"><span class="built_in">cd</span> /home/a //切换到要统计文件数目的目录</span><br><span class="line"></span><br><span class="line">fcnt=0</span><br><span class="line">dcnt=0</span><br><span class="line">frcnt=0</span><br><span class="line">fwcnt=0</span><br><span class="line">fxcnt=0</span><br><span class="line"><span class="keyword">for</span> file <span class="keyword">in</span> *</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"> <span class="keyword">if</span> [ -f <span class="variable">$file</span> ];<span class="keyword">then</span></span><br><span class="line"> <span class="built_in">let</span> fcnt+=1</span><br><span class="line"> <span class="keyword">if</span> [ -r <span class="variable">$file</span> ];<span class="keyword">then</span></span><br><span class="line"> <span class="built_in">let</span> frcnt+=1</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">if</span> [ -w <span class="variable">$file</span> ];<span class="keyword">then</span></span><br><span class="line"> <span class="built_in">let</span> fwcnt+=1</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">if</span> [ -x <span class="variable">$file</span> ];<span class="keyword">then</span></span><br><span class="line"> <span class="built_in">let</span> fxcnt+=1</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">elif</span> [ -d <span class="variable">$file</span> ];<span class="keyword">then</span></span><br><span class="line"> <span class="built_in">let</span> dcnt+=1</span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"There are <span class="variable">$fcnt</span> files in <span class="variable">$PWD</span>"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\tThere are <span class="variable">$frcnt</span> readable files in <span class="variable">$PWD</span>"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\tThere are <span class="variable">$fwcnt</span> writeable files in <span class="variable">$PWD</span>"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\tThere are <span class="variable">$fxcnt</span> executeable files in <span class="variable">$PWD</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"There are <span class="variable">$dcnt</span> directories in <span class="variable">$PWD</span>"</span></span><br></pre></td></tr></table></figure></li></ul>]]></content>
<summary type="html">
<blockquote class="blockquote-center">自己在使用linux时候的总结,不定时更新</blockquote>
<iframe src="https://music.163.com/outchain/player?type=2&id=441458&auto=0&height=66" width="930" height="100" frameborder="0" allowfullscreen></iframe>
</summary>
<category term="Linux基础" scheme="http://noblestaspiration.net/categories/Linux%E5%9F%BA%E7%A1%80/"/>
<category term="Linux" scheme="http://noblestaspiration.net/tags/Linux/"/>
</entry>
<entry>
<title>MouseLight</title>
<link href="http://noblestaspiration.net/2018/08/22/MouseLight/"/>
<id>http://noblestaspiration.net/2018/08/22/MouseLight/</id>
<published>2018-08-22T02:56:25.911Z</published>
<updated>2018-08-24T14:01:20.056Z</updated>
<content type="html"><![CDATA[<h2 id="MouseLight:"><a href="#MouseLight:" class="headerlink" title="MouseLight:"></a>MouseLight:</h2><p> MouseLight是比较强大的软件,如果觉得这个软件有用,请购买正版,发布这个纯属娱乐。</p><a id="more"></a><p>##大致分析</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_001.png" alt="MouseLight"></p><p>##过程</p><p> 安装好MouseLight(下载地址:<a href="https://pan.baidu.com/s/1zB8MJiqBxNc46MbKUtFluQ),然后运行起来,切到Misc目录下,发现有一栏需要输入注册码,有一栏写着只能使用30天。在输入注册码一栏中随便输入一些字符,然后点击Activate,会出现下图所示的错误" target="_blank" rel="noopener">https://pan.baidu.com/s/1zB8MJiqBxNc46MbKUtFluQ),然后运行起来,切到Misc目录下,发现有一栏需要输入注册码,有一栏写着只能使用30天。在输入注册码一栏中随便输入一些字符,然后点击Activate,会出现下图所示的错误</a></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_002.png" alt="MouseLight"></p><p> 改写系统时间为30天之后,程序不能运行,如下图</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_003.png" alt="MouseLight"></p><p> 使用OD打开mouselight,等待运行之后右键选择中文搜索引擎,选择搜索ASC码</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_005.png" alt="MouseLight"></p><p> 参照上面错误信息,搜索unexplainable,结果如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_006.png" alt="MouseLight"></p><p> 双击以上字符,进入主程序区,上下查看,发现有很多种情况,会返回不同的情况,如下图所示,会有很多种返回的情况,不一一列举,下图中可以看到success字样,照常理,只要跳转的地方跳转到这里就会直接破解成功。向上翻查函数的起始地址,00404510为起始地址。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_007.png" alt="MouseLight"></p><p> 使用IDA打开程序,上面查看程序其实地址为00404510</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_008.png" alt="MouseLight"></p><p> 按下F5反汇编其代码发现不能成功,这段是主程序,只能一步步单步调试,继续使用OD调试,从上往下调试,单步到00404696时,没有发生跳转直接进入到错误显示的界面,所以往上一条指令查看</p><blockquote><p>Cmpdword ptr[0x413030], -0x7</p></blockquote><p> 发现每一条显示在界面的信息都有和<code>dword ptr[0x413030]</code>这个数据比较的语句,那么直接在堆栈区查找这个地址,然后F8单步调试下来看在哪一个函数里面,堆栈的值发生变化,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_009.png" alt="MouseLight"></p><p> 当单步调试到如下图所示的地址时,堆栈信息发生变话,此时使用IDA查看函数功能发现函数有很多判断,根据不同返回值跳转到不同结果,下图所示:</p><p> 调试至此函数时堆栈信息发生变化</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_010.png" alt="MouseLight"></p><p> 使用IDA查看函数代码:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_011_01.png" alt="MouseLight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_011_02.png" alt="MouseLight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_011_03.png" alt="MouseLight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_011_04.png" alt="MouseLight"></p><p> 可以看到,只要返回值为1,最后结果就会显示成功,结合IDA的代码,单步调试OD,一边调试一边看IDA的代码,这样可以清楚的看到汇编的指令运行到哪一步,改完之后运行的结果如下图所示</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_012.png" alt="MouseLight"></p><p> 提示上说需要重新启动程序,但是此时动态调试重新运行程序之前修改的内容会被覆盖为原来指令,所以这里将程序保存下来然后命名为MouseLight1重新运行,发现会跳出这个提示成功的界面但是并没有激活成功,仔细查看之前代码,发现时利用注册表信息来计算的返回值,那么程序中一定存在很关键的判断没有找到,这时候只能通过OD从程序开始调试,并且之前注意力一直在激活的字眼上,上面剩余30天的界面没有去管。此时单步调试</p><p>到如下函数时进入到了比较重要的步骤</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_013.png" alt="MouseLight"></p><p> 当单步到这里时,这个函数里面进行了很多计算,并且在这个函数里面有试用剩余天数的提醒,并且还有激活成功的字样,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_014.png" alt="MouseLight"></p><p> 单步调下来发现在上图的4043E0处,直接跳过<code>register version</code>字样,这样修改jnz可能会直接激活成功,修改jnz如下图,界面显示激活成功,但是将系统时间改到30天之后,程序依旧不能运行。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_015.png" alt="MouseLight"></p><p> <strong>查看刚刚跳转指令上面几条指令,发现比较了eax和ecx的值,而eax的值为<code>0x96</code>,ecx的值由<code>0x412CB8</code>决定,运行到这里时<code>0x412CB8</code>的值是<code>0x32</code>,并不是<code>0x96</code>,继续在OD的堆栈区观察值的变化,发现当程序运行到如下图地址时,<code>0x412CB8</code>的值发生了变化</strong></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_016.png" alt="MouseLight"></p><p> <strong>上图指令一条条分析,只要eax值为<code>0x96</code>则会使je触发,但eax的值又由<code>0x40F240</code>决定,从而跳过<code>mouselig.004018D0</code>这个函数,并且<code>412CB8</code>的值也为<code>0x96</code>,使用IDA分析<code>mouselig.004018D0</code>这个函数,如下图,截取这个函数的一部分:</strong></p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_017.png" alt="MouseLight"></p><p> 可以看到这个函数是用于计算剩余天数的,所以这个函数跳过去意味着可能会跳过时间限制,查看上面提到的<code>0x40F240</code>地址的值</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_018.png" alt="MouseLight"></p><p> 使用IDA查看之后发现这里值为0x32,将这里的二进制值改为0x96。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_019.png" alt="MouseLight"></p><p> 运行程序,发现破解成功。将程序保存为MouseLight1.exe,运行程序,将系统时间改为30天之后,发现程序依旧可以运行。但是这之前要将之前的<code>return -7</code>改为<code>return 1</code>。最终结果如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/ml_020.png" alt="MouseLight"></p><p>总结:IDA反汇编代码配合上OD的汇编指令一步步调试,这种更能理解汇编指令的意思</p>]]></content>
<summary type="html">
<h2 id="MouseLight:"><a href="#MouseLight:" class="headerlink" title="MouseLight:"></a>MouseLight:</h2><p> MouseLight是比较强大的软件,如果觉得这个软件有用,请购买正版,发布这个纯属娱乐。</p>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="IDA" scheme="http://noblestaspiration.net/tags/IDA/"/>
<category term="OllyDBG" scheme="http://noblestaspiration.net/tags/OllyDBG/"/>
</entry>
<entry>
<title>Source Insight4093</title>
<link href="http://noblestaspiration.net/2018/07/18/Source-Insight4093/"/>
<id>http://noblestaspiration.net/2018/07/18/Source-Insight4093/</id>
<published>2018-07-18T02:01:35.033Z</published>
<updated>2018-07-30T01:19:29.004Z</updated>
<content type="html"><![CDATA[<h2 id="SourceInsight4093:"><a href="#SourceInsight4093:" class="headerlink" title="SourceInsight4093:"></a>SourceInsight4093:</h2><p> SourceInsight是比较强大的软件,如果觉得这个软件有用,请购买正版,发布这个纯属娱乐。</p><h2 id="关于SourceInsight"><a href="#关于SourceInsight" class="headerlink" title="关于SourceInsight"></a>关于SourceInsight</h2><p> Source Insight不仅是一个强大的程序编辑器,而且是面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。运行截图如下图所示:</p><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/si_001.png" alt="SourceInsight"></p><p>##过程</p><p> 先使用查壳工具PEID查壳,然后通过试运行sourceinsight查看会提示什么,然后决定使用什么方法来破解,一般来讲,输入注册码不正确跳出提示框,这样可以通过查找字符串进而找到关键算法,通过下面尝试,这样方法确实可行,但是并不能完全破解,只能绕过一个判断。商业软件毕竟是别的软件不一样的,sourceinsight有在线检查黑名单制度,而且相较于之前版本,黑名单检测地方在不断增多,找到黑名单检测处并且一一注释才能够最终完成破解。</p><p>###1.查壳</p><p> 先用PEID查壳,发现没有加壳,但是入口地址和偏移与之后在IDA里面看到的不一样,这是win7下的ASLR技术,ASLR技术是对缓冲区溢出的安全保护技术,对堆栈、共享库等映射随机化,这样提高安全,但是不利于我们分析,IDA动态调试的时候不能返回,相对OD显得不那么方便,但是IDA反汇编出来的地址就是没有随机化的地址,是最原始程序的地址,而OD是随机化的,所以通过参考IDA,并且尝试关闭win7下的ASLR服务,这样就可以使用OD进行动态调试,使用IDA反汇编查看源码,这样可以快随方便的找到关键判断,加速破解进度。下图为查壳结果:无壳</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_002.png" alt="SourceInsight"></p><p>###2.关闭ASLR</p><p> 如果想使用OD动态调试,那么必须要关闭ASLR服务,因为每次调试的断点,注释会随着动态地址变化而消逝,所以必须要关闭ASLR服务。下图为没关闭ASLR服务之前的OD加载地址与IDA加载地址效果图:可以明显看到OD的地址漂移。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_003.png" alt="SourceInsight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_004.png" alt="SourceInsight"></p><p> 网上下载ASLR关闭工具进行关闭是不行的,后来Google上找到一篇帖子,介绍了方法,通过win+R,regedit,HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Control->Session<br>Manager->Memory Management,右键,新建一个dword变量,命名为MoveImages,将其值置为0,重启电脑即可。如下图为修改注册表中的数值:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_005.png" alt="SourceInsight"></p><p> 关闭ASLR后效果如下图,这样可以通过IDA找到关键处,OD动态调试辅助进行破解。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_006.png" alt="SourceInsight"></p><p>###3.运行程序寻找突破口</p><p> 下图为未破解之前截图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_007.png" alt="SourceInsight"></p><p> <img src="http://p6flo4av7.bkt.clouddn.com/si_008.png" alt="SourceInsight"></p><p> 第一个选项是导入注册码,第二选项是试用30天,第三个选项是导入license,如果不选的话,会直接退出程序。尝试输入错误的注册码看会提示是什么,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_009.png" alt="SourceInsight"></p><p> 跳出一串字符如上图,然后通过IDA查找字符串,Shift+F12打开字符串界面,按下ctrl+f,然后输入上面提及的字符中not correct,搜索结果如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_010.png" alt="SourceInsight"></p><p> 第二条记录是刚刚输入不正确注册码跳出的界面的提示,双击进入,下图所示,可以看到,字符串和上面输入错的字符跳出来的提示语是一样的。可以看到第一句The serial number you entered is not correct. A serial number for下面有DATA XREF,后面跟了一个函数,鼠标放在上面会出现函数入口指令,双击进入</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_011.png" alt="SourceInsight"></p><p> 下图所示,双击进入的地方,这个地址就是这串字符压入栈的地方:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_012.png" alt="SourceInsight"></p><p> IDA最强大的一面就是反汇编,接下来就是体现其强大的一面,按F5会将这段汇编指令尽量按照源码反汇编出来,按下F5以后效果如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_013.png" alt="SourceInsight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_014.png" alt="SourceInsight"></p><p> 可以看到上面的一个关键if判断,满足条件,就会进入到下一个if判断,两个if都满足的话,说明这个序列号是3.x版本的,第二个if如果不满足,则会进入else,见下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_015.png" alt="SourceInsight"></p><p> 可以明显看到,第67行,第二个if判断没有成立进入到这里就会显示上面提到的注册不成功的提示,而sub_40A8E0这个函数就是实现显示提示的功能,IDA查看sub_40A8E0这个函数非常方便,双击这个函数就会自动跳到这个函数,如下图,想要再回到之前的函数,点击左上角返回键即可。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_016.png" alt="SourceInsight"></p><p> 上面代码可以看到是输出一串字符的,结合上面截图中的代码分析,传入的参数a1是序列号错误的提示字符串,代码中有调用其他的函数,就不一一展开说明。</p><p> 回到上上图中的代码中,只要代码不进入if判断,把显示提示序列号错误的字符跳过,那么很可能找到判断序列号是否正确的关键判断。(注:上上图中代码还有一部分没有截图展示出来,都是和这个if平行的判断,跳过了这个if,可以进入到下面的判断,下面判断中用到了替换查表的方法判断,表是代码中原有存在的,查看代码可以看文章末尾附录)</p><p> 通过上面的分析,关键call就是sub_50C8E0(&MultiByteStr,dword_66BAE8 + 1544, dword_66BAE8 + 1548, dword_66BAE8 + 1540, 1)这个函数,双击这个函数进入函数主体,下图可以看到函数中所有的代码:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_017.png" alt="SourceInsight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_018.png" alt="SourceInsight"></p><p> 接下来分析这段代码</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">cdecl <span class="title">sub_50C8E0</span><span class="params">(<span class="keyword">char</span> *a1, <span class="keyword">int</span> a2, <span class="keyword">int</span> a3, <span class="keyword">int</span> a4, <span class="keyword">int</span> a5)</span><span class="comment">//a1为输入的序列号,如果任一判断不成立return 0,那么之前的判断会直接跳到序列号失败的那个call</span></span></span><br><span class="line"><span class="function"></span>{ </span><br><span class="line"> <span class="keyword">char</span> v5; <span class="comment">// al@7</span></span><br><span class="line"> <span class="keyword">char</span> v6; <span class="comment">// al@11</span></span><br><span class="line"> <span class="keyword">char</span> v7; <span class="comment">// al@13</span></span><br><span class="line"> <span class="keyword">char</span> v8; <span class="comment">// al@21</span></span><br><span class="line"> <span class="keyword">int</span> v10; <span class="comment">// [sp+4h] [bp-18h]@28</span></span><br><span class="line"> <span class="keyword">char</span> v11; <span class="comment">// [sp+8h] [bp-14h]@28</span></span><br><span class="line"> <span class="keyword">char</span> v12; <span class="comment">// [sp+17h] [bp-5h]@28</span></span><br><span class="line"></span><br><span class="line"> _strupr(a1);</span><br><span class="line"> <span class="keyword">if</span> ( <span class="built_in">strlen</span>(a1) != <span class="number">19</span> )<span class="comment">//看输入的序列号是否总共为19位,形式是xxxx-xxxx-xxxx-xxxx总共19位</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( a1[<span class="number">4</span>] != <span class="number">45</span> )<span class="comment">//看第五位是不是字串’-’,也就是判断格式</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( a1[<span class="number">9</span>] != <span class="number">45</span> ) <span class="comment">//看第十位是不是字串’-’,也就是判断格式</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( a1[<span class="number">14</span>] != <span class="number">45</span> ) <span class="comment">//看第十五位是不是字串’-’,也就是判断格式,上面三个if判断</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( *a1 != <span class="number">83</span> )<span class="comment">//第一位字母不是‘‘S’’的话,return 0</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( a5 )<span class="comment">//函数传参进来,值应该是1</span></span><br><span class="line"> {</span><br><span class="line"> v5 = a1[<span class="number">6</span>];<span class="comment">//将序列号的第7位给到变量</span></span><br><span class="line"> <span class="keyword">if</span> ( v5 != <span class="number">82</span> && v5 != <span class="number">71</span> && v5 != <span class="number">68</span> && v5 != <span class="number">70</span> )<span class="comment">//第7位如果不是‘R’,‘G’,‘D’,‘F’,其中的一个,那么就返回0,也就是第7位这里只能是‘R’,‘G’,‘D’,‘F’,其中的一位</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> v6 = a1[<span class="number">1</span>];<span class="comment">//把序列号的第2位给到变量</span></span><br><span class="line"> <span class="keyword">if</span> ( v6 < <span class="number">48</span> || v6 > <span class="number">57</span> )<span class="comment">//如果第2位不是数字则直接return 0</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> *(_DWORD *)a4 = v6 - <span class="number">48</span>;<span class="comment">//第二位的十进制数给到变量a4</span></span><br><span class="line"> v7 = a1[<span class="number">2</span>];<span class="comment">//序列号的第三位给到变量</span></span><br><span class="line"> <span class="keyword">switch</span> ( v7 )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">84</span>:</span><br><span class="line"> *(_DWORD *)a3 = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">66</span>:</span><br><span class="line"> *(_DWORD *)a3 = <span class="number">3</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">83</span>:</span><br><span class="line"> *(_DWORD *)a3 = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">if</span> ( v7 != <span class="number">85</span> )</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> *(_DWORD *)a3 = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }<span class="comment">//第三位的值很关键,得是B,S,T,U其中的几位</span></span><br><span class="line"> v8 = a1[<span class="number">3</span>];<span class="comment">//第四位给到变量,如果第四位是G,a2=1,如果是V,a2=2,如果不等于GV且不等于R,那么返回0</span></span><br><span class="line"> <span class="keyword">if</span> ( v8 == <span class="number">71</span> )</span><br><span class="line"> {</span><br><span class="line"> *(_DWORD *)a2 = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> ( v8 == <span class="number">86</span> )</span><br><span class="line"> {</span><br><span class="line"> *(_DWORD *)a2 = <span class="number">2</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( v8 != <span class="number">82</span> )</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> *(_DWORD *)a2 = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> ( !a5 )<span class="comment">//如果a5=0的话,那么直接返回1</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> <span class="built_in">strcpy</span>(&v11, a1);,<span class="comment">//把a1给到v11</span></span><br><span class="line"> v12 = <span class="number">0</span>;</span><br><span class="line"> sub_50C0B0(&v11, <span class="number">15</span>, &unk_5F6F88, &v10);<span class="comment">//可以看到第二个参数为15,这里其实传进去的是前15位,然后来算后4位,而这个算法就是非常关键的算法</span></span><br><span class="line"> <span class="keyword">if</span> ( *(_DWORD *)(a1 + <span class="number">15</span>) == v10 )</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p> 总结以上代码,首先是判断序列号的合法性,必须满足如下格式(其中X表示未知字符):</p><p> S(0-9)(T|B|S|U)X-X(R|G|D|F)XX-XXXX-XXXX</p><p> 其中第二位,根据版本要求必须是4,第三位中T 表示 试用版,B表示Beta版,S表示Standard版,U未知。因此按照本软件的要求,序列号格式应该如下:</p><p> S4SX-X(R|G|D|F)XX-XXXX-XXXX</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_019.png" alt="SourceInsight"></p><p> 可以看到是do-while循环四次来做的,而当中最关键的是byte_5F6E68[]这个预先存于内存中的表取值,双击byte_5F6E68[],可以看到表中的值,下图展示了一部分当中的值,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_020.png" alt="SourceInsight"></p><p> 最后四个字节可以算出来,可以尝试穷举(直接遍历 byte_5F6E68[]中的字符即可),通过这样的方法来计算出最后四个字节,但是由于时间有限,没有尝试这种方法,直接利用OD单步调试算出,然后重新运行程序,输入序列号,如下图所示:call的50C0B0这个函数,计算最后四位</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_021.png" alt="SourceInsight"></p><p> 进入到50C0B0这个函数,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_022.png" alt="SourceInsight"></p><p> 过程中没有做过多的指令分析,程序运行起来,第一次输入S4SV-UFWT-ZPR6-XXXX,鼠标选中循环之外的第一条语句,如上图橙色框。选中之后直接按F4运行到这一句,然后看下面堆栈区,就计算出来最后四位,这样重新运行程序,然后就可以输入正确的序列号,跳过这一条验证, 计算结果如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_23.png" alt="SourceInsight"></p><p> 图中已标出计算结果,寄存器EAX也有计算结果,寄存器EBP中存的是前15位,可以看到前十五S4SV-UFWT-ZPR6计算出来的最后四位是F336。下次输入S4SV-UFWT-ZPR6-F336即可跳过这个判断。输入序列号,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_024.png" alt="SourceInsight"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_025.png" alt="SourceInsight"></p><p> 过程中跳过了以上的判断,但是,没有激活成功,效果如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_026.png" alt="SourceInsight"></p><p> 这时遇到瓶颈了,在很长一段时间里,无法取得进展。IDA动态调试不是很方便,所以一直使用OD进行动态调试,进行寻找突破口。在经过一段时间寻找之后,在OD动态调试到以下函数时候,下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_027.png" alt="SourceInsight"></p><p> 可以明显在堆栈区看到我键入的信息,并且能看到一个文件夹,但是当我打开文件夹时,里面不存在这个文件。无法找到这个文件,在经过很多次调试之后还是无果。只是键入序列号的话,无法激活,这时候,程序一直运行在一段地址之内,无法跳出,而屏幕上也一直显示正在激活请稍后,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_028.png" alt="SourceInsight"></p><p> 但是就像文章开头分析一样,还有可以选使用试用30天和导入license的选项,导入license是需要选择文件夹的,这是伏笔。选择试用试一下,选择试用之后,C:\ProgramData\Source Insight\4.0这个文件夹下多了一个文件,si4.lic文件,这时候打开文件分析,格式大致如下:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_029_.png" alt="SourceInsight"></p><p> 清晰看到,之前填的用户名,组织,邮箱,时间在里面,下面signature字眼很关键,说明这里使用了数据签名,然后可能在某处存在进行核对,如果正确的话就激活成功。将系统状态还原至还未试用的版本,通过多次调试,查阅资料之后,发现程序使用的Windows Cryptography APIs进行签名:在调试的时候发现调用了这个系统API,系统API怎么计算的具体怎么计算没有跟踪。OD动态跟踪之后,系统调用API如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_030_.png" alt="SourceInsight"></p><p> 通过网上查阅,“签名”和“签名验证”是通过公钥体系来实现的,所以程序中一定存在公钥,在不断寻找之后,在地址0063F648处,发现了公钥,如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_031.png" alt="SourceInsight"></p><p> 找到公钥之后,只要找到什么地方对公钥试用,以及签名最后在哪里比对,可能最终完成破解,继续选择键入序列号, 这时候程序依然处于上面那一段地址内循环,此时放弃了键入序列号破解程序的想法。文中一开始提到的三个方法,只剩最后一个导入license没用了,在使用试用版本发现si4.lic文件中格式之后,自己造了一个license文件,放入C:\ProgramData\Source<br>Insight\4.0文件夹中,然后选择导入license,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_033.png" alt="SourceInsight"></p><p> 选择license文件导入,导入之后,先会进入判断序列号是否正确的断点,序列号是通过之前计算出来的,所以不会有问题。如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_034.png" alt="SourceInsight"></p><p> 在检查完序列号之后,会一一对license文件中所有值进行一一计算验证,一路继续F7F8调试,在调试很久之后,发现很关键的字眼,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_035.png" alt="SourceInsight"></p><p> 上图中两个Asc码很显眼,可能接下来的重要数据就在这里,继续调试。再往下发现一处正在读入license中签名的值,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_036.png" alt="SourceInsight"></p><p> 再往下是继续将si4中数据进行读入并进行存储,这里只截取其中两处展示,如下图: </p><p> 将除签名之外所有的数据读入:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_037.png" alt="SourceInsight"></p><p> 将signature存在堆栈:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_038.png" alt="SourceInsight"></p><p> 再往下调试,出现了非常非常非常重要的函数,经过对license文件的计算,这个函数的返回值决定了是否能成功激活,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_039.png" alt="SourceInsight"></p><p> 进入函数主体进行分析,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_040.png" alt="SourceInsight"></p><p> 可以明显看到导入公钥了,这里计算非常关键,此时借助IDA反汇编查看代码,分析思路然后再次回到OD去调试尝试,这样两个工具相结合加快了破解的进展。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_041.png" alt="SourceInsight"></p><p> 图中展示借用公钥计算,然后返回结果,总共可以返回的结果有472、473、474、475、472、200.代码贴出如下:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">cdecl <span class="title">sub_50C3D0</span><span class="params">(BYTE *pbData, DWORD dwDataLen, BYTE *pbSignature, DWORD dwSigLen)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> result; <span class="comment">// eax@2</span></span><br><span class="line"> BOOL v5; <span class="comment">// esi@11</span></span><br><span class="line"> HCRYPTHASH hHash; <span class="comment">// [sp+0h] [bp-818h]@1</span></span><br><span class="line"> HCRYPTPROV phProv; <span class="comment">// [sp+4h] [bp-814h]@1</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> _<span class="title">CERT_PUBLIC_KEY_INFO</span> *<span class="title">pvStructInfo</span>;</span> <span class="comment">// [sp+8h] [bp-810h]@3</span></span><br><span class="line"> HCRYPTKEY phKey; <span class="comment">// [sp+Ch] [bp-80Ch]@1</span></span><br><span class="line"> DWORD pcbBinary; <span class="comment">// [sp+10h] [bp-808h]@1</span></span><br><span class="line"> DWORD pcbStructInfo; <span class="comment">// [sp+14h] [bp-804h]@3</span></span><br><span class="line"> BYTE pbBinary; <span class="comment">// [sp+18h] [bp-800h]@1</span></span><br><span class="line"></span><br><span class="line"> hHash = <span class="number">0</span>;</span><br><span class="line"> phKey = <span class="number">0</span>;</span><br><span class="line"> pcbBinary = <span class="number">2048</span>;</span><br><span class="line"> phProv = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( CryptStringToBinaryA(pszString, <span class="number">0</span>, <span class="number">0</span>, &pbBinary, &pcbBinary, <span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line"> && CryptDecodeObjectEx(<span class="number">1u</span>, (LPCSTR)<span class="number">8</span>, &pbBinary, pcbBinary, <span class="number">0x8000</span>u, <span class="number">0</span>, &pvStructInfo, &pcbStructInfo) )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( CryptAcquireContextW(&phProv, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1u</span>, <span class="number">0xF0000000</span>) )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( CryptImportPublicKeyInfo(phProv, <span class="number">1u</span>, pvStructInfo, &phKey)</span><br><span class="line"> && (LocalFree(pvStructInfo), CryptCreateHash(phProv, <span class="number">0x8004</span>u, <span class="number">0</span>, <span class="number">0</span>, &hHash)) )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( CryptHashData(hHash, pbData, dwDataLen, <span class="number">0</span>) )</span><br><span class="line"> {</span><br><span class="line"> v5 = CryptVerifySignatureW(hHash, pbSignature, dwSigLen, phKey, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"> CryptDestroyHash(hHash);</span><br><span class="line"> CryptReleaseContext(phProv, <span class="number">0</span>);</span><br><span class="line"> result = v5 != <span class="number">0</span> ? <span class="number">200</span> : <span class="number">462</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> result = <span class="number">475</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> result = <span class="number">474</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> result = <span class="number">473</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> result = <span class="number">472</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p> 经过多次尝试,发现只有当返回值为200(十六进制为0xC8)的时候,软件这时候被激活,但是过程想要让它直接运行到使其直接返回C8是有困难的,所以这里直接将值改为0xC8。如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_042.png" alt="SourceInsight"></p><p> 运行结果可以看到已经激活,结果如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_043.png" alt="SourceInsight"></p><p> 点击确定之后,在help->about Source Insight中,可以看到已经激活的信息,并且激活的信息也与license中一致。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_044.png" alt="SourceInsight"></p><p>###4.后续</p><p> 程序破解完了会有黑名单检测,如下图</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_045.png" alt="SourceInsight"></p><p> 上图中会在C:\Users\liyuf\AppData\Local\Source<br>Insight\4.0中出现一个.dat文件,这个文件记录了你是黑名单,然后再打开Source Insight会发现下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_046.png" alt="SourceInsight"></p><p> 细心点可以发现,这与之前键入注册码提示的错误不一样的地方是,没有下两行的选项了,为了应对黑名单检测,总共需要修改四处地方:</p><blockquote><p><code>1)</code></p><p><code>0050E393 85C0 TEST EAX, EAX</code></p><p><code>==></code></p><p><code>0050E393 31C0 XOR EAX, EAX</code></p><p><code>2)</code></p><p><code>0050E645 85C0 TEST EAX, EAX</code></p><p><code>==></code></p><p><code>0050E645 31C0 XOR EAX, EAX</code></p><p><code>3)</code></p><p><code>0050DF68 76 69 JBE SHORT 0050DFD3</code></p><p><code>==></code></p><p><code>0050DF68 EB 69 JMP SHORT 0050DFD3</code></p><p><code>4)</code></p><p><code>0050F1BB 85C0 TEST EAX, EAX</code></p><p><code>==></code></p><p><code>0050F1BB 31C0 XOR EAX, EAX</code></p></blockquote><p> 修改完之后保存:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_051.png" alt="SourceInsight"></p><p> 再次打开程序,界面如下:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/si_052.png" alt="SourceInsight"></p><p>###附录</p><p>附上sub_50F5A0()函数代码:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">cdecl <span class="title">sub_50F5A0</span><span class="params">(<span class="keyword">int</span> a1, <span class="keyword">int</span> a2, <span class="keyword">int</span> a3)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> result; <span class="comment">// eax@10</span></span><br><span class="line"> <span class="keyword">int</span> v4; <span class="comment">// ST28_4@17</span></span><br><span class="line"> <span class="keyword">int</span> v5; <span class="comment">// ST2C_4@17</span></span><br><span class="line"> <span class="keyword">int</span> v6; <span class="comment">// ST30_4@17</span></span><br><span class="line"> <span class="keyword">int</span> v7; <span class="comment">// ST34_4@17</span></span><br><span class="line"> HWND v8; <span class="comment">// esi@22</span></span><br><span class="line"> <span class="keyword">void</span> *v9; <span class="comment">// eax@22</span></span><br><span class="line"> <span class="keyword">void</span> *v10; <span class="comment">// eax@22</span></span><br><span class="line"> <span class="keyword">int</span> v11; <span class="comment">// [sp+0h] [bp-128h]@0</span></span><br><span class="line"> <span class="keyword">int</span> v12; <span class="comment">// [sp+4h] [bp-124h]@7</span></span><br><span class="line"> <span class="keyword">int</span> v13; <span class="comment">// [sp+8h] [bp-120h]@7</span></span><br><span class="line"> <span class="keyword">int</span> v14; <span class="comment">// [sp+Ch] [bp-11Ch]@7</span></span><br><span class="line"> <span class="keyword">int</span> v15; <span class="comment">// [sp+10h] [bp-118h]@7</span></span><br><span class="line"> <span class="keyword">int</span> v16; <span class="comment">// [sp+14h] [bp-114h]@7</span></span><br><span class="line"> <span class="keyword">int</span> v17; <span class="comment">// [sp+18h] [bp-110h]@7</span></span><br><span class="line"> <span class="keyword">int</span> v18; <span class="comment">// [sp+1Ch] [bp-10Ch]@7</span></span><br><span class="line"> CHAR MultiByteStr; <span class="comment">// [sp+28h] [bp-100h]@5</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ( !a2 )</span><br><span class="line"> {</span><br><span class="line"> v8 = (HWND)sub_406770(a1, <span class="number">30</span>);</span><br><span class="line"> v9 = (<span class="keyword">void</span> *)sub_404310();</span><br><span class="line"> sub_41B2E0(v9, <span class="number">0</span>, (<span class="keyword">int</span>)&v12);</span><br><span class="line"> <span class="built_in">strcpy</span>((<span class="keyword">char</span> *)&v13, <span class="string">"Courier New"</span>);</span><br><span class="line"> v10 = (<span class="keyword">void</span> *)sub_41B860(<span class="number">0</span>, &v12);</span><br><span class="line"> dword_66BB80 = v10;</span><br><span class="line"> <span class="keyword">if</span> ( v10 )</span><br><span class="line"> SendMessageW(v8, <span class="number">0x30</span>u, (WPARAM)v10, <span class="number">1</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> ( a2 == <span class="number">1</span> )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( dword_66BB80 )</span><br><span class="line"> {</span><br><span class="line"> DeleteObject(dword_66BB80);</span><br><span class="line"> dword_66BB80 = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> sub_4064D0(a1, <span class="number">30</span>, &MultiByteStr);</span><br><span class="line"> sub_4454A0(&MultiByteStr);</span><br><span class="line"> _strupr(&MultiByteStr);</span><br><span class="line"> sub_406300(a1, <span class="number">30</span>, &MultiByteStr);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> ( a2 != <span class="number">2</span> || a3 != <span class="number">1</span> )</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> sub_4064D0(a1, <span class="number">30</span>, &MultiByteStr);</span><br><span class="line"> sub_4454A0(&MultiByteStr);</span><br><span class="line"> _strupr(&MultiByteStr);</span><br><span class="line"> sub_406300(a1, <span class="number">30</span>, &MultiByteStr);</span><br><span class="line"> <span class="keyword">if</span> ( !sub_50C8E0(&MultiByteStr, dword_66BAE8 + <span class="number">1544</span>, dword_66BAE8 + <span class="number">1548</span>, dword_66BAE8 + <span class="number">1540</span>, <span class="number">1</span>) )</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> ( sub_55C580(&MultiByteStr) )</span><br><span class="line"> sub_40A8E0(</span><br><span class="line"> <span class="string">"The serial number you entered is for version 3.x of Source Insight.\n"</span></span><br><span class="line"> <span class="string">"\n"</span></span><br><span class="line"> <span class="string">"This version requires a version 4.x serial number."</span>,</span><br><span class="line"> v11,</span><br><span class="line"> v12,</span><br><span class="line"> v13,</span><br><span class="line"> v14,</span><br><span class="line"> v15,</span><br><span class="line"> v16,</span><br><span class="line"> v17,</span><br><span class="line"> v18);</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> sub_40A8E0(</span><br><span class="line"> <span class="string">"The serial number you entered is not correct. A serial number for Source Insight version 4.x is required.\n"</span></span><br><span class="line"> <span class="string">"\n"</span></span><br><span class="line"> <span class="string">"Please check the number and re-enter it."</span>,</span><br><span class="line"> v11,</span><br><span class="line"> v12,</span><br><span class="line"> v13,</span><br><span class="line"> v14,</span><br><span class="line"> v15,</span><br><span class="line"> v16,</span><br><span class="line"> v17,</span><br><span class="line"> v18);</span><br><span class="line"> sub_406A30(a1, <span class="number">30</span>);</span><br><span class="line"> sub_4046B0();</span><br><span class="line"> <span class="keyword">if</span> ( ++dword_66BB84 >= sub_44E310(<span class="number">1</span>) + <span class="number">3</span> )</span><br><span class="line"> {</span><br><span class="line"> dword_66BB84 = <span class="number">0</span>;</span><br><span class="line"> sub_44CEB0();</span><br><span class="line"> Sleep(<span class="number">0x1B58</span>u);</span><br><span class="line"> sub_44CF00();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> dword_66BB84 = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( *(_DWORD *)(dword_66BAE8 + <span class="number">1540</span>) != BYTE3(dword_646848) )</span><br><span class="line"> {</span><br><span class="line"> sub_40A8E0(</span><br><span class="line"> <span class="string">"The serial number you entered is for a different version of Source Insight.\n"</span></span><br><span class="line"> <span class="string">"\n"</span></span><br><span class="line"> <span class="string">"This version requires a version 4.x serial number."</span>,</span><br><span class="line"> v11,</span><br><span class="line"> v12,</span><br><span class="line"> v13,</span><br><span class="line"> v14,</span><br><span class="line"> v15,</span><br><span class="line"> v16,</span><br><span class="line"> v17,</span><br><span class="line"> v18);</span><br><span class="line"> sub_406A30(a1, <span class="number">30</span>);</span><br><span class="line"> sub_4046B0();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> ( *(_DWORD *)(dword_66BAE8 + <span class="number">1548</span>) == <span class="number">3</span> )</span><br><span class="line"> {</span><br><span class="line"> sub_40A8E0(</span><br><span class="line"> <span class="string">"The serial number cannot be used with the 'release' version of Source Insight."</span>,</span><br><span class="line"> v11,</span><br><span class="line"> v12,</span><br><span class="line"> v13,</span><br><span class="line"> v14,</span><br><span class="line"> v15,</span><br><span class="line"> v16,</span><br><span class="line"> v17,</span><br><span class="line"> v18);</span><br><span class="line"> sub_4046B0();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> ( !sub_50CA20(&MultiByteStr) )</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> ( sub_50E180(dword_66BAE8 + <span class="number">1284</span>) )</span><br><span class="line"> {</span><br><span class="line"> sub_412390(<span class="string">"Upgrade License was validated: %s"</span>, dword_66BAE8 + <span class="number">1284</span>, v11, v12, v13, v14, v15, v16, v17);</span><br><span class="line"> result = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> sub_40A8E0(</span><br><span class="line"> <span class="string">"Sorry, but we could not validate your previous license. Please make sure you have the correct serial number for ve"</span></span><br><span class="line"> <span class="string">"rsion 3.x.\n"</span></span><br><span class="line"> <span class="string">"\n"</span></span><br><span class="line"> <span class="string">"If your old version of Source Insight is running, you can see the serial number by selecting Help > About Source I"</span></span><br><span class="line"> <span class="string">"nsight. Otherwise, the serial number was typically provided in an email activation message when you purchased the old license."</span>,</span><br><span class="line"> v11,</span><br><span class="line"> v12,</span><br><span class="line"> v13,</span><br><span class="line"> v14,</span><br><span class="line"> v15,</span><br><span class="line"> v16,</span><br><span class="line"> v17,</span><br><span class="line"> v18);</span><br><span class="line"> sub_406A30(a1, <span class="number">30</span>);</span><br><span class="line"> sub_4046B0();</span><br><span class="line"> sub_4122B0(<span class="string">"Upgrade License could not be validated"</span>, v4, v5, v6, v7, v12, v13, v14, v15);</span><br><span class="line"> result = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>参考链接:</p><blockquote><p><a href="https://www.52pojie.cn/thread-713308-1-4.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-713308-1-4.html</a></p><p><a href="https://bbs.pediy.com/thread-215669-1.htm" target="_blank" rel="noopener">https://bbs.pediy.com/thread-215669-1.htm</a></p><p><a href="https://www.52pojie.cn/thread-580580-1-1.html" target="_blank" rel="noopener">https://www.52pojie.cn/thread-580580-1-1.html</a></p></blockquote>]]></content>
<summary type="html">
<h2 id="SourceInsight4093:"><a href="#SourceInsight4093:" class="headerlink" title="SourceInsight4093:"></a>SourceInsight4093:</h2><p> SourceInsight是比较强大的软件,如果觉得这个软件有用,请购买正版,发布这个纯属娱乐。</p>
<h2 id="关于SourceInsight"><a href="#关于SourceInsight" class="headerlink" title="关于SourceInsight"></a>关于SourceInsight</h2><p> Source Insight不仅是一个强大的程序编辑器,而且是面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。能分析源代码并在工作的同时动态维护它自己的符号数据库,并自动显示有用的上下文信息。运行截图如下图所示:</p>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="IDA" scheme="http://noblestaspiration.net/tags/IDA/"/>
<category term="OllyDBG" scheme="http://noblestaspiration.net/tags/OllyDBG/"/>
</entry>
<entry>
<title>Seetaface</title>
<link href="http://noblestaspiration.net/2018/07/02/Seetaface/"/>
<id>http://noblestaspiration.net/2018/07/02/Seetaface/</id>
<published>2018-07-02T11:57:25.412Z</published>
<updated>2018-07-18T06:39:35.702Z</updated>
<content type="html"><![CDATA[<p>虚拟机中进行项目:</p><p>1.环境:win7 X64、vs2013、OpenCV</p><p>2.配置环境变量:安装OpenCV的过程就是解压代码到指定目录的过程,解压完毕后有vc10~12,与Visual Studio对应关系如下:<br>vc9 Visual Studio 2010 : vc10 </p><p>Visual Studio 2012 : vc11 </p><p>Visual Studio 2013 : vc12 </p><p>Visual Studio 2015 : vc14 </p><p>Visual Studio 2017 : vc15</p><a id="more"></a><p>右键我的电脑->属性->高级系统设置->环境变量->系统变量->双击Path</p><p>添加OpenCV变量(解压的到电脑里面的路径),我的是C:\Program Files\opencv\build\x64\vc12\bin,添加,x86的也添加上</p><p>3.开始编译Detection。</p><p>3.1打开VS2013新建项目,C++的win32控制台应用程序,注意选上空项目,然后再在解决方案处右键新建项目,这次新建dll文件,同样是空项目</p><p>3.2将活动解决方案平台转化为X64平台:点击配置管理器(配图),在活动解决方案下面点击,然后新建,改为x64,点击确定,然后将debug换成release</p><p>3.3将下载的FaceDetection源码中的data,include,model,scr拷贝到目录下,其中data在SeetaFace目录下,其他三个在FaceDetection目录下</p><p>3.4添加cpp文件,右键FaceDetection下的源文件,添加scr文件下除去test文件的所有cpp文件,一共11个</p><p>3.5配置项目属性:右键FaceDetection,属性,3.5.1:VC++目录->包含目录,编辑其目录输入include(相对路径),3.5.2:选择C/C++预处理器->预处理器定义->添加”SEETA_EXPORTS和USE_OPENMP”两项,3.5.3:C/C++->语言->OpenMP支持->是</p><p>3.6右键项目生成,在SeetaFace\x64\release下面会看到dll,lib文件</p><p>4.创建测试项目</p><p>4.1创建测试项目,同样选择空项目,现将其设置为启动项</p><p>4.2把活动解决方案转化为x64平台,如果提示创建不成功就把原来的移除重新创建,重新创建可能会导致前面配置清空,如清空则重新配置。之前这些其实都不必要,只要在新建项目平台的时候把创建新的解决方案平台的√点掉就行。</p><p>4.3写入测试代码,右键FaceDetection下的源文件->添加->新建项->C++文件,复制src\test下的代码进来,此时会有很多报错,需要配置</p><p>4.4创建lib文件,在SeetaFace下创建一个lib文件夹,把上一步x64\release里面生成的lib文件复制到lib文件夹下</p><p>4.5配置属性:右键FaceDetection->属性,4.5.1:调试->命令参数->输入:“..\data\0_1_1.jpg ..\FaceDetection\model\seeta_fd_frontal_v1.0.bin”</p><p>4.5.2:VC++ 目录 -> 包含目录(添加opencv\build\include路径以及FaceDetection的inculde的路径) ->库目录(添加opencv\build\x64\vc12\lib路径以及SeetaFace下的lib文件夹的路径)</p><p>4.5.3:C\C++->预处理器->预处理器定义 -> 添加%(PreprocessorDefinitions)、USE_OPENMP和SEETA_EXPORTS</p><p>4.5.4:链接器—>输入—>附加依赖项—>添加opencv_highgui2411.lib、opencv_imgproc2411.lib、opencv_core2411.lib和在3.6中生成的FaceDetection.lib</p><p>4.6本地生成并运行:解决错误error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突:右键FaceDetectionTest,点击属性,弹出项目属性页,链接器—-高级,配置改成所有配置,平台改为x64,目标计算机为MachineX64(/MACHINE:x64),然后右键解决方案->属性,把FaceDetectionTest平台改为x64,运行即可。</p><p>如果显示没有包含opencv_highgui2411.dll文件,则重新检查一遍配置,然后重启试试</p><p>Alignment和Identification同样也是这样,先创建dll,然后创建测试文件</p><p>…</p><p>待续</p><p>本地在桌面SeetaFace文件夹里面</p>]]></content>
<summary type="html">
<p>虚拟机中进行项目:</p>
<p>1.环境:win7 X64、vs2013、OpenCV</p>
<p>2.配置环境变量:安装OpenCV的过程就是解压代码到指定目录的过程,解压完毕后有vc10~12,与Visual Studio对应关系如下:<br>vc9 Visual Studio 2010 : vc10 </p>
<p>Visual Studio 2012 : vc11 </p>
<p>Visual Studio 2013 : vc12 </p>
<p>Visual Studio 2015 : vc14 </p>
<p>Visual Studio 2017 : vc15</p>
</summary>
<category term="Windows programing" scheme="http://noblestaspiration.net/categories/Windows-programing/"/>
<category term="FaceDetection" scheme="http://noblestaspiration.net/categories/Windows-programing/FaceDetection/"/>
<category term="Seetaface" scheme="http://noblestaspiration.net/tags/Seetaface/"/>
<category term="VS2013" scheme="http://noblestaspiration.net/tags/VS2013/"/>
</entry>
<entry>
<title>Debian8搭建OpenVPN</title>
<link href="http://noblestaspiration.net/2018/06/01/Debian8%E6%90%AD%E5%BB%BAOpenVPN/"/>
<id>http://noblestaspiration.net/2018/06/01/Debian8搭建OpenVPN/</id>
<published>2018-06-01T03:29:57.708Z</published>
<updated>2018-12-03T02:31:15.408Z</updated>
<content type="html"><![CDATA[<p>先搭建好debian8的环境,然后确保能上网</p><blockquote><p><code>ping www.baidu.com</code></p></blockquote><p>内网最好改为静态ip,修改静态IP方法:</p><p>第一步:</p><blockquote><p>vi /etc/network/interfaces</p><p>auto eth0</p><p># iface eth0 inet dhcp # 这为原来存在的注释掉,保存为下面</p><p>iface eth0 inet static</p><p> address xx.xx.xx.xx</p><p> netmask xx.xx.xx.xx</p><p> gateway xx.xx.xx.xx</p></blockquote><p>第二步(可不配):</p><blockquote><p>vi /etc/resolv.conf #修改为自己的网关</p><p>/etc/init.d/networking restart</p></blockquote><a id="more"></a><p>网关可以在宿主机上面看到</p><h2 id="服务器端搭建"><a href="#服务器端搭建" class="headerlink" title="服务器端搭建"></a>服务器端搭建</h2><ul><li>查看是否有tun和iptables_net模块支持</li></ul><p>先查看tun</p><blockquote><p>cat /dev/net/tun</p></blockquote><p>返回的是File descriptor in bad state说明可用,No such device则需要开通tun/tap服务,可以更新系统(apt-get update && apt-get dist-upgrade)之后再查看是否开启服务</p><p>再查看iptables_net</p><blockquote><p>apt-get install iptables</p></blockquote><ul><li>检查系统时间是否与客户机一致,不一致则调整为一致</li></ul><blockquote><p>date -R #查看时间</p><p>date -s 01/01/2000</p><p>date -s 14:00</p><p>hwclock -w #时间写入本地</p></blockquote><p><strong>只改时间能安装成功这一步可不做:时区也可能导致安装失败,修改时区</strong></p><blockquote><p>timedatectl list-timezones |grep Shanghai #实验室Debian8默认美国芝加哥时间,时区可以修改为上海,这条指令是显示上海在哪个时区,结果会是Asia/Shanghai</p></blockquote><blockquote><p>timedatectlset-timezone Asia/Shanghai #修改时区</p></blockquote><ul><li>正式安装OpenVPN</li></ul><blockquote><p>apt-get install openvpn lzop</p><p>apt-get install zip</p><p>apt-get install expect</p></blockquote><p>如果安装没有成功则先更新一下系统</p><blockquote><p>apt-get update && apt-get dist-upgrade</p></blockquote><ul><li><p>使用easy-rsa生成证书</p><p>默认openvpn的easy-rsa文档会放在<code>/usr/share/easy-rsa/</code>下,不在则检查是否安装成功,或者用locate、find命令查找一下,然后将文档复制到<code>/etc/openvpn/</code>下</p><blockquote><p>cp -r /usr/share/easy-rsa/ /etc/openvpn/</p></blockquote><ul><li><p>生成ca证书:</p><blockquote><p>cd /etc/openvpn/easy-rsa/</p><p>source vars #可自行编译vars文件,也可保持默认</p><p>./clean-all</p><p>./build-ca</p></blockquote><p>提示回车默认即可,y/n选择y</p></li><li><p>生成服务器端证书和密钥:</p><blockquote><p>./build-key-server server #server是服务端的名字可自行设置</p></blockquote><p>提示回车默认即可,y/n选择y</p></li><li><p>生成客户端证书和密钥:</p><p>这里设置的客户端名字不能和上一步服务端名字一样</p><blockquote><p>./build-key client</p></blockquote><p>提示回车默认即可,y/n选择y,想要生成多个客户端的证书和米哟啊将client改成另外的名字重复操作即可,所有证书都在<code>/etc/openvpn/easy-rsa/keys/</code>下面保存</p></li><li><p>生成Diffie Hellman参数:</p><p>以上完成之后执行:</p><blockquote><p>./build-dh</p></blockquote><p>keys目录下文件如下:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/openvpn.png" alt="Crack013"></p></li></ul></li><li><p>配置OpenVPN服务端文件</p><ul><li><p>编辑/etc/openvpn/server.conf文件,没有的新建一个,加入以下内容:(最好将注释去掉)</p><blockquote><p>local xx.xx.xx.xx #xx.xx.xx.xx为服务器的IP<br>port 8080 #端口,需要与客户端配置保持一致,并保证与其他软件无共用<br>proto udp #使用协议,需要与客户端配置保持一致<br>dev tun #也可以选择tap模式<br>ca /etc/openvpn/easy-rsa/keys/ca.crt<br>cert /etc/openvpn/easy-rsa/keys/server.crt<br>key /etc/openvpn/easy-rsa/keys/server.key<br>dh /etc/openvpn/easy-rsa/keys/dh2048.pem #以上为认证文件的绝对路径,根据实际情况修改<br>ifconfig-pool-persist ipp.txt<br>server 10.168.1.0 255.255.255.0 #给客户的分配的局域网IP段,注意不要与客户端网段冲突!<br>push “route xx.xx.xx.xx 255.255.0.0”#xx.xx.xx.xx表示内网网段,是网段,只在连接内网是流量走vpn,客户使用外网是任然使用其自身网络流量,规则为“route内网网段 内网掩码”;若客户端希望所有的流量都通过 VPN 传输,则可以使用该语句:push “redirect-gateway”,并在客户端配置文件加上redirect-gateway;<br>push “dhcp-option DNS 8.8.8.8” #客户端的DNS,可不设置<br>push “dhcp-option DNS 8.8.4.4” #客户端的DNS,可不设置<br>client-to-client<br>;duplicate-cn #若要在多台电脑使用一个证书,请去掉前面的;<br>keepalive 20 60<br>comp-lzo<br>max-clients 50<br>persist-key<br>persist-tun<br>status openvpn-status.log<br>log-append openvpn.log<br>verb 3<br>mute 20</p></blockquote></li><li><p>设置IP转发:</p><blockquote><p>iptables -t nat -A POSTROUTING -s 10.168.1.0/24 -j SNAT –to-source xx.xx.xx.xx #xx.xx.xx.xx为服务器IP</p><p>iptables -t nat -L</p></blockquote><p>第一条命令是设置,如果知道你的路由的外网IP,那么就把前面换为外网IP添加进去</p><p>看到如下字样则转发成功:</p><blockquote><p>SANT all – 10.168.1.0/24 anywhere to:xx.xx.xx.xx#xx.xx.xx.xx为服务器IP</p></blockquote></li><li><p>修改/etc/sysctl.conf的内容为:</p><p>这个文件进去之后全是注释,在最下面加上这几句</p><blockquote><p>net.ipv4.ip_forward = 1</p><p>net.ipv4.conf.all.send_redirects = 0</p><p>net.ipv4.conf.default.send_redirects = 0</p><p>net.ipv4.conf.all.accept_redirects = 0</p><p>net.ipv4.conf.default.accept_redirects= 0</p></blockquote><p>然后执行</p><blockquote><p>sysctl -p</p></blockquote><p>使其生效,到这里服务器端的配置都完成了</p><blockquote><p>/etc/init.d/openvpn restart</p></blockquote><p>上面的命令让OpenVPN重启</p><p>如果无效的话,那么重启debian</p></li></ul></li><li><p>想使其开机自动运行的话还需要:</p></li></ul><p>创建/root/vpn.sh 文件,加入下面的内容:(复制到VPS上时,最好把注释去掉)</p><blockquote><p>#!/bin/bash</p><p>/etc/init.d/openvpn start #Debian下OpenVPN不用设置就可以开机自动运行,如可以自动运行就去掉这句</p><p>/sbin/iptables -t nat -A POSTROUTING -s 10.168.1.0/24 -j SNAT –to-source xx.xx.xx.xx #xx.xx.xx.xx为服务器IP,实际根据自己的服务器来做调整,这只做示例</p></blockquote><p>将这一脚本写入cron执行计划,执行</p><blockquote><p>crontab -e</p><p>@reboot /bin/bash /root/vpn.sh >/dev/null 2>&1</p></blockquote><p>这是服务端,还有客户端,<strong>当然如果更改了上面的配置文件一定要重新导出证书放在openvpn安装目录下的config文件夹下</strong></p><h2 id="端口映射"><a href="#端口映射" class="headerlink" title="端口映射"></a>端口映射</h2><p>上面中有提服务端端口设置,设置外部端口,让其映射到内部端口(服务器端口),在xx.xx.1.1里面设置</p><h2 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h2><p>主要配置windows客户端</p><ul><li>下载客户端,下载地址:<a href="https://openvpn.net/index.php/open-source/downloads.html" target="_blank" rel="noopener">https://openvpn.net/index.php/open-source/downloads.html</a>翻墙的时候要开全局,不然访问页面都会很卡</li><li>下载证书,使用SourceFXPortable连接到debian8下载,SourceFXPortable下载地址:<a href="https://pan.baidu.com/s/1fA53wVXlL-SAFRvLap-Ugw" target="_blank" rel="noopener">https://pan.baidu.com/s/1fA53wVXlL-SAFRvLap-Ugw</a> 密码:ruep</li></ul><p>证书在/etc/openvpn/easy-rsa/keys里,两个证书一个key <strong>ca.crt、client.crt、client.key</strong>放在openvpn安装目录下的config文件夹里面</p><ul><li>创建客户端配置文件</li></ul><p>在上面提到的config文件夹下面创建一个sunny.ovpn文件,添加以下内容:</p><blockquote><p>client #这个client不是自定义名称不能更改</p><p>dev tun #要与前面server.conf中的配置一致。</p><p>proto udp #要与前面server.conf中的配置一致。</p><p>remote xx.xx.xx.xx 88 #xx.xx.xx.xx为路由外网的IP,88为外部端口,端口与之前端口映射的外部端口一致,若同处内网,则ip和端口与前面的server.conf中配置一致。</p><p>resolv-retry 20</p><p>nobind</p><p>persist-key</p><p>persist-tun</p><p>ca ca.crt #具体名称以刚下载的为准</p><p>cert client.crt #具体名称以刚下载的为准</p><p>key client.key #具体名称以刚下载的为准</p><p>ns-cert-type server</p><p>/# redirect-gateway#如服务端配置为push”redirect-gateway”,则保留这行,否则请注释掉</p><p>keepalive 10 30</p><p>comp-lzo</p><p>verb 3</p><p>mute 20</p><p>route-method exe</p><p>route-delay2</p></blockquote><ul><li>运行OpenVPN客户端,绿色则表示连接成功,黄色就是断开连接</li><li>各种连不上以及问题参照本地<strong>vpn启动及恢复检查文档-最新.word</strong></li></ul><p>##文章参考:</p><p><a href="http://shit.name/openvpn-on-debian/" target="_blank" rel="noopener">http://shit.name/openvpn-on-debian/</a></p><p>以及实验室OpenVPN安装文档</p>]]></content>
<summary type="html">
<p>先搭建好debian8的环境,然后确保能上网</p>
<blockquote>
<p><code>ping www.baidu.com</code></p>
</blockquote>
<p>内网最好改为静态ip,修改静态IP方法:</p>
<p>第一步:</p>
<blockquote>
<p>vi /etc/network/interfaces</p>
<p>auto eth0</p>
<p># iface eth0 inet dhcp # 这为原来存在的注释掉,保存为下面</p>
<p>iface eth0 inet static</p>
<p> address xx.xx.xx.xx</p>
<p> netmask xx.xx.xx.xx</p>
<p> gateway xx.xx.xx.xx</p>
</blockquote>
<p>第二步(可不配):</p>
<blockquote>
<p>vi /etc/resolv.conf #修改为自己的网关</p>
<p>/etc/init.d/networking restart</p>
</blockquote>
</summary>
<category term="Linux" scheme="http://noblestaspiration.net/categories/Linux/"/>
<category term="VPN" scheme="http://noblestaspiration.net/categories/Linux/VPN/"/>
<category term="Debian" scheme="http://noblestaspiration.net/tags/Debian/"/>
<category term="OpenVPN" scheme="http://noblestaspiration.net/tags/OpenVPN/"/>
</entry>
<entry>
<title>Git上传本地代码</title>
<link href="http://noblestaspiration.net/2018/05/18/Git%E4%B8%8A%E4%BC%A0%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81/"/>
<id>http://noblestaspiration.net/2018/05/18/Git上传本地代码/</id>
<published>2018-05-18T08:16:23.983Z</published>
<updated>2018-05-18T08:18:18.775Z</updated>
<content type="html"><![CDATA[<h2 id="步骤:"><a href="#步骤:" class="headerlink" title="步骤:"></a>步骤:</h2><ul><li>首先在GitHub上建一个仓库</li><li>本地新建一个保存代码的文件夹,在保存代码文件夹里面打开git bash</li></ul><a id="more"></a><ul><li><code>然后执行</code></li></ul><blockquote><p><code>git init</code></p></blockquote><ul><li>然后是添加代码,把代码复制到这个文件夹下,执行</li></ul><blockquote><p>git add .//全部添加</p><p>git add xx.cpp//一个个添加</p></blockquote><ul><li>然后执行</li></ul><blockquote><p>git commit -m “保存代码的文件夹”</p></blockquote><ul><li><code>关联仓库:git remote add origin https://git@github.com:Summary22/Myproject.git</code></li><li>上传执行</li></ul><blockquote><p>git push origin master</p></blockquote><p><strong>注意:第一次上传的是其他颜色字体</strong></p>]]></content>
<summary type="html">
<h2 id="步骤:"><a href="#步骤:" class="headerlink" title="步骤:"></a>步骤:</h2><ul>
<li>首先在GitHub上建一个仓库</li>
<li>本地新建一个保存代码的文件夹,在保存代码文件夹里面打开git bash</li>
</ul>
</summary>
<category term="git_operation" scheme="http://noblestaspiration.net/categories/git-operation/"/>
<category term="git_Push" scheme="http://noblestaspiration.net/tags/git-Push/"/>
</entry>
<entry>
<title>pdf2word</title>
<link href="http://noblestaspiration.net/2018/05/17/pdf2word/"/>
<id>http://noblestaspiration.net/2018/05/17/pdf2word/</id>
<published>2018-05-17T06:24:04.660Z</published>
<updated>2018-05-17T06:58:40.241Z</updated>
<content type="html"><![CDATA[<h1 id="PDF2Word"><a href="#PDF2Word" class="headerlink" title="PDF2Word"></a>PDF2Word</h1><h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><p>程序启动后弹出注册页面,随意输入E-mail和注册码后弹出提示错误的窗口</p><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_001.png" alt="Crack013"></p><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><p>使用IDA破解,软件破解思路是查找字符,看Graph View,最后看核心判断,也可以看到核心算法,写出注册机。</p><h2 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h2><ul><li>Shift +F12找出所有的字符串,Ctrl + F搜索错误字符串“Wrong”,(同样的Alt+t可以直接在代码段查找关键词也可以)下图中可以看到</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_002.png" alt="Crack013"></p><ul><li>双击“Your registration key is wrong“进入下图界面 ,图中可以看出字符串所在区域是.data段,并没有在代码段,字符串后面有注释,有写data xref,xref是交叉引用的意思,鼠标移至后面箭头会出现这个call里面具体的代码,鼠标滚轮向下滑动,会显示出更多。双击这里即可进入相应的代码段。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_003.png" alt="Crack013"></p><p>双击图中黄色的16F后的箭头跳转到字符串的引用位置</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_004.png" alt="Crack013"></p><p>向上滑动一点可以看到注册成功的相关代码,当然直接搜索字符串也能找到注册成功的相关代码,如果使用的是OllyDbg,通常的做法是在注册失败的代码中打断点,回溯到判断注册是否成功的代码中去,这里使用IDA的Graph View可以加快破解速度,在代码段按空格就会切换到Graph View,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_005.png" alt="Crack013"></p><p>可以非常明显的看到判断注册是否成功的流程,有红色断点的框中是判断注册是否成功的函数,先调用call ds:GetDigItemTextA获取输入的注册码,再把注册码通过栈作为参数传到sub_405F60函数中去,这个函数的返回值eax就是最后的注册结果,eax= 0时注册失败,暴力破解可以直接修改eax的值为1,略。下图中,可以看到跳转的连线有红色和绿色,红色是判断失败则执行,绿色是成功执行。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_006.png" alt="Crack013"></p><p>可以看出sub_405F60是关键的call。</p><p>用Graphmode整体地看下sub_405F60函数,左分支返回的都是eax= 0,造成注册失败,输入的注册码只要使程序到达最右下的分支即注册成功</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_007.png" alt="Crack013"></p><p>逐条分析指令,发现有如下几条条件限制:</p><ul><li><p>判断输入的注册码长度是否为0x14,即20(d)位</p></li><li><p>atoi(code[0]) + atoi(code[1]) = 0xB (注意这里没有使用ASCII码做运算)</p><p>(int)注册码的第一位+ (int)注册码的第二位= 0xB</p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_008.png" alt="Crack013"></p><ul><li><p>atoi(code[18]) + atoi(code[19]) = 0xD</p><p>(int)注册码第19位 + (int) 注册码第20位 = 0xD</p></li><li><p>atoi(code[5])+atoi(code[13]) = 0x9</p></li><li><p>code[12] = 0x56(ASCII ‘V’)</p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_009.png" alt="Crack013"></p><ul><li>code[14] = 0x33 (ASCII ‘3’)</li><li>code[15] = 0x33 (ASCII ‘2’)</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_010.png" alt="Crack013"></p><p>综上</p><p>注册码code的要求为</p><ul><li>总长度20位</li><li>atoi(code[0]) + atoi(code[1]) =0xB (11D)</li></ul><ul><li>atoi(code[18]) + atoi(code[19])= 0xD (13D)</li><li>atoi(code[5]) + atoi(code[13])= 0x9 (9D)</li></ul><ul><li>code[12] = ‘V’</li><li>code[14] = ‘3’</li></ul><ul><li>code[15] = ‘2’</li><li>其他位随便填写</li></ul><p>注册机以及满足以上要求的一个注册码是如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_011.png" alt="Crack013"></p><p>破解以后的画面是下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_012.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/p2w_013.png" alt="Crack013"></p><h2 id="IDA"><a href="#IDA" class="headerlink" title="IDA"></a>IDA</h2><p>IDA的Graph View功能十分强大,F5更是可以近似生成源码,而且动态调试的时候在程序段同样可以查看到Graph View,而且当从一个模块到另一个模块的时候,如果停在上一个模块的最后一条指令,那么接下来要执行哪一个模块,指向那一个模块的线会跳动。但是感觉IDA动态调试没有OD方便,可能是IDA用得比较少吧。。。</p>]]></content>
<summary type="html">
<h1 id="PDF2Word"><a href="#PDF2Word" class="headerlink" title="PDF2Word"></a>PDF2Word</h1><h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><p>程序启动后弹出注册页面,随意输入E-mail和注册码后弹出提示错误的窗口</p>
</summary>
<category term="逆向分析" scheme="http://noblestaspiration.net/categories/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/"/>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="IDA" scheme="http://noblestaspiration.net/tags/IDA/"/>
<category term="pdf2word" scheme="http://noblestaspiration.net/tags/pdf2word/"/>
</entry>
<entry>
<title>010Editor</title>
<link href="http://noblestaspiration.net/2018/05/03/010Editor/"/>
<id>http://noblestaspiration.net/2018/05/03/010Editor/</id>
<published>2018-05-03T03:15:01.723Z</published>
<updated>2018-05-03T05:55:48.851Z</updated>
<content type="html"><![CDATA[<h1 id="010Editor破解"><a href="#010Editor破解" class="headerlink" title="010Editor破解"></a>010Editor破解</h1><h2 id="关于软件"><a href="#关于软件" class="headerlink" title="关于软件"></a>关于软件</h2><ul><li>官网的介绍:Professional Text Editor+World’s Best Hex Editor</li></ul><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_001.png" alt="Crack013">)</p><h2 id="破解思路"><a href="#破解思路" class="headerlink" title="破解思路"></a>破解思路</h2><p>抓包分析软件在验证的时候没有发包,所以可以确定注册码一定是在本地生成,找到判断成功与否的指令,改掉jnz或者在上层调用中改返回值。此次没有编写注册机。</p><h2 id="破解过程"><a href="#破解过程" class="headerlink" title="破解过程"></a>破解过程</h2><ul><li>先使用PEID查壳,发现无壳</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_002.png" alt="Crack013"></p><ul><li>用OD打开程序,F9运行起来,tools->register,会弹出一个form,然后随便输入用户名,验证码,点击确定,弹出失败的messagebox,此时F12暂停,堆栈查看</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_003.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_004.png" alt="Crack013"></p><ul><li>属于程序领空的一一查看,0012A380处,shawcall,会发现很多字符串,判断的地方应该就在这里,然后在这个函数的入口处下断</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_005.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_006.png" alt="Crack013"></p><ul><li>再次点击check license,会断在刚刚断点地方,F8单步下去,会发现有一处cam后跳过了正确的字符,修改这里,破解成功。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_007.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_008.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_009.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/010Editor_010.png" alt="Crack013"></p>]]></content>
<summary type="html">
<h1 id="010Editor破解"><a href="#010Editor破解" class="headerlink" title="010Editor破解"></a>010Editor破解</h1><h2 id="关于软件"><a href="#关于软件" class="headerlink" title="关于软件"></a>关于软件</h2><ul>
<li>官网的介绍:Professional Text Editor+World’s Best Hex Editor</li>
</ul>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="逆向分析" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
</entry>
<entry>
<title>WinRAR去广告</title>
<link href="http://noblestaspiration.net/2018/04/23/WinRAR%E5%8E%BB%E5%B9%BF%E5%91%8A/"/>
<id>http://noblestaspiration.net/2018/04/23/WinRAR去广告/</id>
<published>2018-04-23T06:51:49.826Z</published>
<updated>2018-05-03T05:55:48.850Z</updated>
<content type="html"><![CDATA[<h1 id="WinRAR去广告"><a href="#WinRAR去广告" class="headerlink" title="WinRAR去广告"></a>WinRAR去广告</h1><h2 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h2><p>WinRAR是一款强大的压缩文件管理工具,目前最新版本为5.50版本,但是中文免费版本在每次启动时,会弹出广告页面,本次破解目标是去除广告页面。如下图:</p><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_002.png" alt="Crack013"></p><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><p>官网下载软件,先使用PEID检查是否有壳,有壳的话去壳,然后通过OD进行跟踪分析,找到页面弹出的指令将其nop或者直接jmp,达到去取广告的目的。</p><h2 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h2><ul><li>先使用PEID查壳,无壳,但无法查出是什么语言编写的程序。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_001.png" alt="Crack013"></p><ul><li><p>F9运行后F12暂停,Alt+K查看堆栈,找最近在程序领空的调用,右键show call,查找ASC和Unicode没有发现关键字,这样只能F8单步下去,查看运行哪个call程序会运行并弹出广告,然后打断,F7单步进这个call,这样反复查看,最后找到弹出页面的call,nop或jmp这个call。如下图所示:</p><p>程序入口点:</p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_003.png" alt="Crack013"></p><p>F8跳过这个call时会运行程序并且弹出广告,在这下断,Ctrl+F2重新运行,F9到这一步,F7进入</p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_004.png" alt="Crack013"></p><p>进入上面的call,F8下去,如下图注释,第一个call,弹出form,第二个call,加载form里面的内容,这里不会弹出广告</p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_005.png" alt="Crack013"></p><p>运行第一个和第二个call以后的结果:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_006.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_008.png" alt="Crack013"></p><p>继续F8调试,当运行完下图这个call之后,弹出了广告</p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_009.png" alt="Crack013"></p><p>查看上图指令,经过一番研究,上面一条指令je short WinRAR.0132CF78,跳过紧挨着je的call指向弹出广告的call,这里修改je指令,将其修改为直接跳过弹出广告的call,如下图所示:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/WinRAR_010.png" alt="Crack013"></p><p>然后F9运行,发现不会弹出广告,将其保存替换exe即可</p>]]></content>
<summary type="html">
<h1 id="WinRAR去广告"><a href="#WinRAR去广告" class="headerlink" title="WinRAR去广告"></a>WinRAR去广告</h1><h2 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h2><p>WinRAR是一款强大的压缩文件管理工具,目前最新版本为5.50版本,但是中文免费版本在每次启动时,会弹出广告页面,本次破解目标是去除广告页面。如下图:</p>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="WinRAR" scheme="http://noblestaspiration.net/tags/WinRAR/"/>
</entry>
<entry>
<title>U盘杀毒专家</title>
<link href="http://noblestaspiration.net/2018/04/20/U%E7%9B%98%E6%9D%80%E6%AF%92%E4%B8%93%E5%AE%B6/"/>
<id>http://noblestaspiration.net/2018/04/20/U盘杀毒专家/</id>
<published>2018-04-20T06:52:39.551Z</published>
<updated>2018-05-03T05:55:48.851Z</updated>
<content type="html"><![CDATA[<h1 id="U盘杀毒专家破解追码"><a href="#U盘杀毒专家破解追码" class="headerlink" title="U盘杀毒专家破解追码"></a>U盘杀毒专家破解追码</h1><h2 id="关于软件"><a href="#关于软件" class="headerlink" title="关于软件"></a>关于软件</h2><ul><li>U盘杀毒专家是一款国产的专业U盘病毒专杀工具,它可以检测查杀文件夹变成exe病毒,auturun病毒,vbs病毒,U盘文件夹被隐藏等1200多种U盘病毒,还可以免疫U盘,自动修复因为病毒而损坏的系统配置以及文件。另外还提供一些其他U盘辅助功能,比如U盘解锁功能,以及进程管理等。如下图,需要用一些功能的时候需要购买,目标就是破解此处并写出注册机。</li></ul><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_001.png" alt="Crack013"></p><h2 id="破解思路"><a href="#破解思路" class="headerlink" title="破解思路"></a>破解思路</h2><p>官网下载软件,先使用PEID检查是否有壳,有壳的话去壳,然后通过OD、DeDe等进行跟踪分析,找到算法,最后编写出注册机。</p><h2 id="破解过程"><a href="#破解过程" class="headerlink" title="破解过程"></a>破解过程</h2><ul><li>先使用PEID查壳,发现是UPX壳,使用UPXEasyGUI 2.0去壳,Scanner->Browse选择exe文件所在文件夹->Option>Decompress->Start,如下图,完了再检测,就会发现程序已去壳。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_002.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_003.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_004.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_005.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_006.png" alt="Crack013"></p><ul><li>发现是Dephi编写的程序,于是用DeDe来寻找确定按钮事件,进而寻找方法破解。打开DeDe,点击forms根据名称以及坐标寻找按钮,根据事件的名字,BuyNow事件就是立即购买按钮,双击,根据名称以及坐标,发现button14为点击立即购买以后那个确定按钮,如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_007.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_008.png" alt="Crack013"></p><ul><li>根据上图找到的确定按钮入口地址,在此下断,F9程序运行,点击立即购买,然后随意输入一串字符,点击确定,会断在确定按钮的入口地址,开始F7,F8,交替调试寻找:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_009.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_010.png" alt="Crack013"></p><p> 上图主模块区,最下面的指令test al,al,当F8到这里,发现执行完这一句,下一条指令跳过了很多call,很有可能是关键判断,试一下,nop掉下一句JNZ,F9运行,发现破解成功,但是并没有真正的注册,如下图,所以可以判断,这之前的call很可能是关键call,点击确定,将nop的修改回来,进入上面提及的call</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_011.png" alt="Crack013"></p><p> 进入之后F8运行,当运行到下图所示时,会发现一串字符串,这串字符可以用于升级换注册码,这并不是正确的注册码,继续往下寻找</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_012.png" alt="Crack013"></p><p> 再继续往下寻找,又发现类似上图一样的一串字符,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_013.png" alt="Crack013"></p><p> 经过验证,这里的字符串就是正确注册码,但是一旦输入这个注册码,然后点击确定,就会写进注册表,点击立即购买就会一直出现您已购买,这给之后的分析造成麻烦,所以这里不输入,进入这个关键call寻找算法写出注册机,如下图,这个call里面有两个call,其他指令是赋值和对栈的操作,进入第一个call,一步一步运行会发现是生成机器码的过程,然后单步进入第二个call,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_014.png" alt="Crack013"></p><p> 如下图,算法就是在下面图上所示,通过分析,可以判断,正确的注册码是通过取出每个字符经过一定操作进行计算的,而真正的算法是:假设计算到第n个字符,用(2*n+1)+第n个字符的asc码+1,结果就是正确注册码的asc码,通过上面算法算出的asc码如果不是字母或者数字则跳过,详细注释见下图</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_015.png" alt="Crack013"></p><p> 这个for循环之后在local3里面存的就是正确注册码,所以可以肯定,这两个call肯定会成功生成正确的码,单步进入第一个call,发现里面很简单,但是进入这个call的第一句,push edx,很关键的一句话。这时候会压入上面算法计算的值,将这个数据保护起来。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_016.png" alt="Crack013"></p><p> 单步进入,这时候,有三个call在这里,经过分析,第一个call并没有生成正确字符,第二个call里面,有着重要的信息,而此时,0012F818这个地址的值没有改变,一直关注这里的值,单步进入第二个call,指令的分析见下图。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_017.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_018.png" alt="Crack013"></p><ul><li><p>编写注册机</p><ul><li>上面细致分析了算法,接下来就是根据算法编写注册机,下图为注册机界面:</li><li>可以比对,生成的注册码和上面图中提及的正确注册码一致,将注册码输入,即可注册成功。再次点击立刻购买,会提示你已经注册成功,如下图:</li></ul></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_019.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_020.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_021.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Upanshadu_022.png" alt="Crack013"></p>]]></content>
<summary type="html">
<h1 id="U盘杀毒专家破解追码"><a href="#U盘杀毒专家破解追码" class="headerlink" title="U盘杀毒专家破解追码"></a>U盘杀毒专家破解追码</h1><h2 id="关于软件"><a href="#关于软件" class="headerlink" title="关于软件"></a>关于软件</h2><ul>
<li>U盘杀毒专家是一款国产的专业U盘病毒专杀工具,它可以检测查杀文件夹变成exe病毒,auturun病毒,vbs病毒,U盘文件夹被隐藏等1200多种U盘病毒,还可以免疫U盘,自动修复因为病毒而损坏的系统配置以及文件。另外还提供一些其他U盘辅助功能,比如U盘解锁功能,以及进程管理等。如下图,需要用一些功能的时候需要购买,目标就是破解此处并写出注册机。</li>
</ul>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="注册机" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E6%B3%A8%E5%86%8C%E6%9C%BA/"/>
<category term="逆向分析" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E6%B3%A8%E5%86%8C%E6%9C%BA/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="DelphiDecompiler" scheme="http://noblestaspiration.net/tags/DelphiDecompiler/"/>
<category term="Delphi" scheme="http://noblestaspiration.net/tags/Delphi/"/>
</entry>
<entry>
<title>Crack007</title>
<link href="http://noblestaspiration.net/2018/04/13/Crack007/"/>
<id>http://noblestaspiration.net/2018/04/13/Crack007/</id>
<published>2018-04-13T13:25:04.305Z</published>
<updated>2018-05-03T05:55:48.851Z</updated>
<content type="html"><![CDATA[<h1 id="Crack007-aLoNg3x-2"><a href="#Crack007-aLoNg3x-2" class="headerlink" title="Crack007-aLoNg3x.2"></a>Crack007-aLoNg3x.2</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul><li>此题和上题很相似,但是具体内部实现是不一样的,而且本题的目标是写出注册机。同样的这个程序是用Delphi写的,无壳,程序隐藏两个按钮才达到破解,首先输入用户名和序列号,点击register,如果正确,register按钮隐藏,会出现一个again按钮,两个按钮全部隐藏既破解成功,另外有个about按钮,点击会弹出四个form,只是一些说明和提醒,还有一个cancella按钮,用于将序列号清零,当你输入的序列号不为纯数字的时候会跳出提醒,当输入序列号为0时也会弹出提示框。下面为程序初始状态:</li></ul><a id="more"></a><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_001.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_002.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_003.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_004.png" alt="Crack013"></p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>借助DelphiDecompiler找到各个事件入口地址,用OllyDBG动态调试程序,在事件入口打断点,然后单步分析指令,分析逻辑关系,找出主要算法,写出注册机。</p><h2 id="题解过程"><a href="#题解过程" class="headerlink" title="题解过程"></a>题解过程</h2><ul><li>用DelphiDecompiler打开exe文件查看各个按钮事件的入口地址并在下地址下断,事件后就为入口地址:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_005.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_006.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_007.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_008.png" alt="Crack013"></p><ul><li>单步调试,查看算法,先查看register事件,输入用户名:qwer12,序列号:123456:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_009.png" alt="Crack013"></p><p>由于之前在register事件入口下断,所以程序会停在register事件入口,这时单步F8向下调试,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_010.png" alt="Crack013"></p><p>到这里可以看到,这个je跳过了提示框以及下面三个call,说明输入符合要求。继续F8运行,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_insert_10and11.png" alt="Crack013"></p><p>到上面一步,这个跳转跳过了隐藏register按钮和显示again的关键call,按下esc往上一步看,test里面al的值决定这个跳转,再往上看,test上一条指令,call aLoNg3x_.00442FF2,很有可能这个call里面就有关键的算法,单步F7进去查看算法,</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_011.png" alt="Crack013"></p><p>F8单步到这一步的时候,可以看到一个关键的跳转,JNZ跳过了一句赋值语句,让bl为1的赋值语句,然后继续F8,当跳出函数,回到上图test语句的时候,这时al为0</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_013.png" alt="Crack013"></p><p>将上一步的JNZ指令nop掉,让bl直接为1,可以看到,al的值也为1,并且register按钮隐藏,again按钮显示出来,再点击一下again按钮就破解成功了,如下图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_012.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_013.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_014.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_015.png" alt="Crack013"></p><p>通过上面分析可以判断,上面图中,JNZ上一步的cmp为关键判断,这条指令比较的是寄存器EBX和ECX里面的值,再往上分析,去寻找EBX和ECX的算法。重新运行一下程序,然后单步进入关键call,从建立栈帧开始单步往下分析,下图所示,通过call取出用户名长度存在EAX中,然后通过cmp判断输入用户名是否合法,这里的限制条件是用户名必须大于4位。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_insert_15and16.png" alt="Crack013"></p><p>继续往下调试,可以看到有两个循环</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_016.png" alt="Crack013"></p><p>这里执行的算法是:</p><p>内层循环中,开始取输入的用户名的第一个字符和最后一个字符相乘,然后再与edi相乘,结果存在edx,最后将ebx与edx相加后结果存在ebx,比如上面例子中,输入用户名为qwer12,那么第一次就是字符q的asc码与字符2的asc码相乘,然后与edi里面的值相乘,最后加上ebx里面的值结果存在ebx。</p><p>因为esi第一次赋值为1,在内存循环中不变,所以在一次外层循环中,edx始终保持不变,对于外层循环来说,外层循环一次,等于输入用户名的一个字符依次乘用户名的所有字符,并乘edi,求和之后保存在ebx。</p><p>这里执行的时候上面有指令将ebx置0,那么变量只剩下edi了,程序调试中,edi始终为0,这就导致最后结果一直为零,关键判断不相等,跳过将bl置1的指令。所以需要寻找到edi的赋值指令,往上会看到</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_017.png" alt="Crack013"></p><p>这条指令将eax的值给了edi,而前面的语句没有提及eax,所以要回到call外面去找,重新点击register,程序断下之后寻找eax赋值指令</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_018.png" alt="Crack013"></p><p>在关键call上一条,将地址0x445830的值赋给eax了,但是这时这地址里的值为零,这时要寻找给这个地址赋值的指令,往上可以看到一条,mov dword ptr [0x445830],<br>eax,但是这条指令被上面判断序列号是否合法的跳转语句跳过了,再往上找不到操作这个地址的指令了,可以判断,在mov dword ptr [0x445830], eax指令上一条call指令,很有可能包含eax的算法,分析这个call,可以找出eax的值。输入一个不合要求的序列号,带字母即可,单步进入这个call,进行分析。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_019.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_020.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_021.png" alt="Crack013"></p><p>上图输入不是数字的序列号,顺利进入到赋值语句之前的关键call里面,图中有一条指令cmp eax,0x5,这条指令要求输入序列号必须大于五位,所以这里的cmp置Z标志位为1,跳转指令跳过了关键算法,重新输入序列号,重新进入,分析主要算法。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_022.png" alt="Crack013"></p><p>这里算法只有一个for循环,刚开始将序列号长度取出存在eax,并将其赋给ebx,作为控制条件,然后取出序列号的第二个字符除以0x11的余数存在edx,然后再加一,取出序列号第一个字符与edx相乘,这算一次循环,下次操作第三个字符和第二个字符,循环五次,最后的结果加上0x37B。接着分析下面算法:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_023.png" alt="Crack013"></p><p>计算的结果存在eax中,然后结果除以0x7148,结果存在eax,余数存在edx,然后将结果转存在ebx,最后又将ebx的值返还给eax,计算的结果暂称为因子,因子的计算解决了对图十二分析时所遇到的问题,但这里要输入不合法字符串才能计算。接下来继续分析图十分析之后的算法:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_024.png" alt="Crack013"></p><p>首先将计算的结果存在eax,,然后对0xA2C2A进行取余,结果存在ebx,然后用输入的序列号除0x59,商保存在ecx,输入的序列号再对0x50取余,结果加上之前的ecx,最终结果再加一,然后和ebx值相比较,如果相等,则jnz不会跳转,bl的值会等于1,这时候,再回到这个call之外,将不会再将隐藏register按钮和显示again按钮的指令跳过,会执行,也就破解成功一半,again按钮的计算方法和register按钮就算方法一样,所以只要执行一遍对register按钮的操作,again按钮也将隐藏。</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_025.png" alt="Crack013"></p><ul><li>编写注册机</li></ul><p>上面细致分析了算法,接下来就是根据算法编写注册机,下图为注册机界面:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_026.png" alt="Crack013"></p><p>在计算注册码的时候会生成多个,所以可以随机选择。</p><p><strong>特别说明:(1).在计算的时候,如果用户名字符串输入过长,或者长度小于6,都是属于不合法的用户名。输入过长的话,计算的时候,因为寄存器为32位,所以结果很可能溢出造成错误。经过测试,如果输入用户名为6个纯字母,结果溢出,所以用户名最好以数字和字母配合,而长度大于6位,很大几率造成溢出,如果选取asc码值比较小的符号当中用户名的话,情况会好一些。(这些可能是程序本身造成的限制)</strong></p><p><strong>(2).验证注册码是否正确的步骤应该是,随机填写用户名和注册码(这个注册码一定为不合法的注册码,也就是不要全为数字,这样edi的值才不为0),点击register键,出现提示框点掉,然后用注册机生成注册码,将生成的注册码重新填入程序,点击register,这时候register会消失,然后重新做一遍上述操作,again也会被隐藏,破解成功。</strong></p><p>下图为随机验证:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_027.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_028.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_029.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_030.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_031.png" alt="Crack013"><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_032.png" alt="Crack013"></p><p>破解之后会出现Cracked by casa63.</p><p>另外补上注册不成功的截图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/aLoNg3x_033.png" alt="Crack013"></p><h2 id="补充-OllyDBG破壳"><a href="#补充-OllyDBG破壳" class="headerlink" title="补充-OllyDBG破壳"></a>补充-OllyDBG破壳</h2><p>用OD加载进去之后,先F8单步运行一下,然后看见右边ESP字体是红色的,右键ESP在数据窗口跟随,这时候右键左下方的地址后面的十六进制码,选择long,然后address,然后选择esp那里作为断点(硬件访问->word),(然后这种方法不可行)</p><p>另一种方法:使用UPXEasyGUI去壳,scan文件夹,option一下是加壳还是脱壳,然后点击开始,再用pied查壳发现没壳了</p>]]></content>
<summary type="html">
<h1 id="Crack007-aLoNg3x-2"><a href="#Crack007-aLoNg3x-2" class="headerlink" title="Crack007-aLoNg3x.2"></a>Crack007-aLoNg3x.2</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul>
<li>此题和上题很相似,但是具体内部实现是不一样的,而且本题的目标是写出注册机。同样的这个程序是用Delphi写的,无壳,程序隐藏两个按钮才达到破解,首先输入用户名和序列号,点击register,如果正确,register按钮隐藏,会出现一个again按钮,两个按钮全部隐藏既破解成功,另外有个about按钮,点击会弹出四个form,只是一些说明和提醒,还有一个cancella按钮,用于将序列号清零,当你输入的序列号不为纯数字的时候会跳出提醒,当输入序列号为0时也会弹出提示框。下面为程序初始状态:</li>
</ul>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="注册机" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E6%B3%A8%E5%86%8C%E6%9C%BA/"/>
<category term="逆向分析" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E6%B3%A8%E5%86%8C%E6%9C%BA/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="DelphiDecompiler" scheme="http://noblestaspiration.net/tags/DelphiDecompiler/"/>
<category term="Delphi" scheme="http://noblestaspiration.net/tags/Delphi/"/>
</entry>
<entry>
<title>Crack013</title>
<link href="http://noblestaspiration.net/2018/04/04/Crack013/"/>
<id>http://noblestaspiration.net/2018/04/04/Crack013/</id>
<published>2018-04-04T11:26:30.176Z</published>
<updated>2018-05-03T05:55:48.851Z</updated>
<content type="html"><![CDATA[<h1 id="Crack013-badboy"><a href="#Crack013-badboy" class="headerlink" title="Crack013-badboy"></a>Crack013-badboy</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul><li>通过PEID分析,此题是P-Code编码的VB程序,下图是未破解前程序所有状态。两种模式,一种是序列号,一种是名称加序列号(输入字符5个以上),输入不正确会出现Try Again字样。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_1.png" alt="Crack013"></p><a id="more"></a><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>如果此题采用OllyDBG动态分析,很难找到合适断点去修改指令破解。既然程序采用VB就可以使用VB.Decompiler进行静态分析并修改,达到破解的目的。</p><h2 id="题解过程"><a href="#题解过程" class="headerlink" title="题解过程"></a>题解过程</h2><ul><li>首先使用PEID查壳,检测到是VB程序,如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_2.png" alt="Crack013"></p><ul><li><p>用VB.Decompiler加载exe文件,如下图<br> <img src="http://p6flo4av7.bkt.clouddn.com/Crack013_3.png" alt="Crack013"></p></li><li><p>点击下方Combol1_Click事件进行分析,如下图<br> <img src="http://p6flo4av7.bkt.clouddn.com/Crack013_4.png" alt="Crack013"></p></li><li><p>分别点击Command2和Command4进行进一步分析<br> <img src="http://p6flo4av7.bkt.clouddn.com/Crack013_5.png" alt="Crack013"></p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_6.png" alt="Crack013"></p><ul><li>根据分析,通过Disassemble找到判断语句对应的反汇编指令,在HEX Editor中搜索并进行更改,破解模式1:搜索4051DA并将1C改为1D或者将4051CA处FB 30改为FB 3D。破解模式二:搜索405815将1C改为1D或者将40580D处FB 30改为FB 3D,(部分指令含义见文章末尾附录),如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_7.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_8.png" alt="Crack013"></p><ul><li>破解成功截图</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_9.png" alt="Crack013"></p><ul><li><p>另外的方法:用OllyDBG来分析的话,可以找到正确密码,但是很难将其破解。简单介绍这种思路:</p><p>用OllyDBG将exe运行,选择断点:BreakPoint->VB APIs->Comaparision->_vbaStrcomp,然后F9运行程序,输入序列号:123456,点击try,F9运行程序会中断,看主模块的堆栈区,会显示出来正确的答案:7718158。</p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_10.png" alt="Crack013"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_11.png" alt="Crack013"></p><ul><li>同理,名称加序列号模式也会出现正确序列号:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_12.png" alt="Crack013"></p><ul><li>这时候名称不变再输入一次序列号57572-444610就会成功。</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_13.png" alt="Crack013"></p><ul><li>程序有一点特殊的地方:输入正确的序列号点try,显示”Congratulation !”和“OK”按钮,点OK按钮后,回到序列号页,又输入刚刚正确的的序列号,再次点try会显示”Try Again!”,这是因为在第一次注册成功的时候,根据上面分析Label3.caption被赋值:“Congratulation !”,只有再次输入Congratulation !才能再次成功,不再会跳出Try Again!</li></ul><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><ul><li>跳转指令:</li></ul><p>Branch-无条件跳转-1E</p><p>BranchT-栈顶数据为真则跳转-1D</p><p>BranchF-栈顶数据为假则跳转-1C</p><ul><li>比较指令:</li></ul><p>EqVarBool-比较变量相等:FB 33</p><p>NeVarBool-比较变量不相等:FB 40</p><p>EqStr-比较字符串相等:FB 30</p><p>NeStr-比较字符串不相等:FB 3D</p><p>Lt-判断是否小于</p><p>Gt-判断是否大于</p><h2 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h2><ul><li>这里补充一下栈帧的概念,栈帧是用来实现过程/函数调用一种数据结构(就是栈),也就是记录每次函数调用的相关信息的记录单元。这个<a href="https://blog.csdn.net/yxysdcl/article/details/5569351" target="_blank" rel="noopener">参考网址</a>里面的内容很经典</li><li>关键跳转前面一般都是关键call,所以要写注册机的话,往这里分析</li><li>idiv是有符号除法,影响的标志位有A,C,O,P,S,Z,32位中,隐含的除数有EDX和EAX,商存在EAX,余数存在EDX</li><li>CDQ:这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。</li><li>标志位补充:<ul><li>O:Overflow,溢出标志</li><li>S:Sign,符号标志,结果为负置1</li><li>Z</li><li>C:Carry Flag,进位</li><li>A:Auxiliary carry Flag,辅助进位标志,记录运算时第3位(半个字节)产生的进位,有进位为1</li><li>P:Parity,奇偶标志</li><li>D:Direction,方向标志</li><li>I:Interrupt,中断标志</li><li>T:Trap,陷阱标志</li></ul></li><li>一些汇编指令</li></ul><ul><li>shl,逻辑左移位,最后移出的一位写入cf中,最低位用0补充</li></ul>]]></content>
<summary type="html">
<h1 id="Crack013-badboy"><a href="#Crack013-badboy" class="headerlink" title="Crack013-badboy"></a>Crack013-badboy</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul>
<li>通过PEID分析,此题是P-Code编码的VB程序,下图是未破解前程序所有状态。两种模式,一种是序列号,一种是名称加序列号(输入字符5个以上),输入不正确会出现Try Again字样。</li>
</ul>
<p><img src="http://p6flo4av7.bkt.clouddn.com/Crack013_1.png" alt="Crack013"></p>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="Crack" scheme="http://noblestaspiration.net/tags/Crack/"/>
<category term="Badboy" scheme="http://noblestaspiration.net/tags/Badboy/"/>
</entry>
<entry>
<title>Crack001</title>
<link href="http://noblestaspiration.net/2018/04/02/Crack001/"/>
<id>http://noblestaspiration.net/2018/04/02/Crack001/</id>
<published>2018-04-02T13:41:07.465Z</published>
<updated>2018-05-03T05:55:48.850Z</updated>
<content type="html"><![CDATA[<h1 id="Crack001-Acid-burn"><a href="#Crack001-Acid-burn" class="headerlink" title="Crack001-Acid_burn"></a>Crack001-Acid_burn</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul><li>所用工具为OllyDBG,开始想用IDA,但是发现并不适合动态调试(也许将来打脸)。</li><li>题目中需要破解的是两个序列号,一个是一串字符,一个是两串,一串字符的往往是硬编码在程序内部,而两串的可以通过一定计算设计得复杂一点,通过研读指令才能破解。注册机需要完全理解汇编指令才能编写,注册机晚些在补。(截图之后再补2018.4.2)</li></ul><a id="more"></a><h2 id="破解过程"><a href="#破解过程" class="headerlink" title="破解过程"></a>破解过程</h2><ul><li>先用ODBG把程序运行起来,通过F8找到第一个弹框所调用的指令,然后F7单步进去,Ctrl+F8进一步定位弹框的位置,这一题,刚开始的弹框可有可无,可以迅速点击确定,然后继续点击Ctrl+F8继续运行,直到弹出下一个Form,这时候选择一个串那个,点进去,随便输一串,然后点击check,这时候,之前标记的断点起到作用了,当你看到call jmp User32.messagebox的时候,看主模块的堆栈区,找到离他最近的一个返回,右键进入反汇编,然后你会看到略微熟悉的UnIcode编码提醒,最后找到push ebp mov ebp esp,这两条指令,这两条指令是建立栈帧,然后往下寻找,找到JNZ,右键二进制,nop填充,这就破解完了,同理,两串的也是这样破解,但是这样破解唯一一点不好的地方就是不管你输什么进去都能进入,最好的方法是写注册机,这样会强大很多,这个后续一定会补上,截图后面也会补上。</li><li>这里还有第二种方法,比上面方法简单一些,我选用上面方法是因为根据<a href="https://www.52pojie.cn/thread-264393-1-1.html" target="_blank" rel="noopener">参考网址</a> ,我的显示不了低地址的messagebox,无法去查找返回地址,然后我重新在虚拟机装了win7,这时候可以看见了,直接运行到弹出出错的form,然后去查找低地址的messagebox,右键查看调用,在这个call打断,然后继续点击check,这时候会停在断点,然后在主模块区的堆栈区找到第一条返回语句,然后右键查看反汇编,进去找一条JNZ的汇编语句,这时候看左边的实线,会看见跳转到sorry..的Unicode,Unicode语句在右边查看,将这句nop填充即可。</li></ul><h2 id="一点知识"><a href="#一点知识" class="headerlink" title="一点知识"></a>一点知识</h2><h3 id="题目相关"><a href="#题目相关" class="headerlink" title="题目相关"></a>题目相关</h3><ul><li>发现问题:当点击左边两串,先输入一些字符,破解会失败,比如第一行输入123,第二行输入qwe,注册不会成功,这是因为程序本身在设计的时候就不允许输入字符少于三位。</li></ul><h3 id="汇编指令"><a href="#汇编指令" class="headerlink" title="汇编指令"></a>汇编指令</h3><ul><li>JE,JNE,JNZ和JZ的区别,JE(jump equal)相等则跳转,JNE(jump not equal)不相等则跳转,JNZ结果不为零则跳转,JZ零标志为1就跳转。</li><li>[test和cmp的区别][<a href="https://blog.csdn.net/thanklife/article/details/11067731]" target="_blank" rel="noopener">https://blog.csdn.net/thanklife/article/details/11067731]</a> </li><li>给出<a href="http://www.cnblogs.com/bbdxf/p/3793545.html" target="_blank" rel="noopener">VB反汇编参考</a> </li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li><strong>选择破解完01的时候,第二个选择破解09,当面对的是跳出成功和失败的页面的时候,往往可以通过先OD打开程序,先运行到密码输入错误界面,然后alt+k查看堆栈,找到massagebox查看调用,然后寻找跳转成功和失败的指令,nop掉失败的指令就爆破成功,随后的13题会单独写一篇</strong></li><li><strong>再来说08,08破解的方法和09很相似,有两种方法可选,第一是和09一样,运行程序直至出错,回到OD,按F12,然后去alt+K去堆栈看messageBox,查看调用(show call),然后在主模块的堆栈区,这时候一定要看提示的Unicode语句在主模块堆栈地址是否在程序领空,如果在领空的话,离他最近return右键看反汇编,上下翻动看到成功和失败的Unicode,然后查找跳转到失败的je,jNz等语句,让NOP掉这条指令就爆了,第二种方法,由于程序是VB,所以可以利用其API,BreakPoint ->VB APIs->Comaparison->选上一切可疑的比如_vbaStrCmp,_vbaStrComp,_vbaVarCmpEq,然后点击确定的时候会中断,上下翻看程序是否有成功或者失败的提示,然后找到跳转NOP,这时候也可以看断点处是否在程序领空,如果在的话很可能就是那里。这种方法要看编译器</strong></li><li><strong>用VB.D…反编译出来的地址和OD里面一模一样,利用这个特性,其实可以把11题破了,但是要写出注册机很难,11题根据VB反编译器分析之后,可以Ctrl+G直接去含有判断的地方把跳过显示REGISTRIERT的跳转指令nop掉就可以,而且查找字符,无论是Unicode还是ASCII,都需要在程序的领空才能查到程序相关的字符,在超过程序领空的查不到 </strong></li><li><strong>在这之后由看了04,04爆破可以在加载程序完之后选择查看asc码,看到恭喜注册成功双击进去,然后这里有一点小坑,上面的jnz指令,如果不点击程序图片的框的话,是不会运行到这里的,可以在这里下断试,把跳过成功这句jnz nop掉就可以,有时候会出现一直搜索不到的情况,那就先运行程序,F12暂停,alt+k查看堆栈,找到程序领空,show produce然后再查找就可以了</strong></li><li><strong>一般程序会从低地址开始加载,如果一开始运行程序的时候从F…开始的,那就是估计程序有那么一点毛病,我之前是在用OD加载之前运行了一下看,然后就从F..开始加载了,所以…讲不清 </strong></li><li><strong>第五个,暴力破解,大概步骤是这样的,首先运行程序然后F9让其运行,然后F12中断,这时候alt+K,看到这里这个调用是在程序领空的,右键跟进去,进到主模块,右键查看ASC码,寻找“注册了”的字样,双击进去,把跳过这句话的指令全部nop,实际上只要nop第一个je和接下来的两个jnz就行,但是这个程序改了之后保存不下来,不知道为何,据说是有壳。 </strong></li></ul>]]></content>
<summary type="html">
<h1 id="Crack001-Acid-burn"><a href="#Crack001-Acid-burn" class="headerlink" title="Crack001-Acid_burn"></a>Crack001-Acid_burn</h1><h2 id="关于题目"><a href="#关于题目" class="headerlink" title="关于题目"></a>关于题目</h2><ul>
<li>所用工具为OllyDBG,开始想用IDA,但是发现并不适合动态调试(也许将来打脸)。</li>
<li>题目中需要破解的是两个序列号,一个是一串字符,一个是两串,一串字符的往往是硬编码在程序内部,而两串的可以通过一定计算设计得复杂一点,通过研读指令才能破解。注册机需要完全理解汇编指令才能编写,注册机晚些在补。(截图之后再补2018.4.2)</li>
</ul>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="逆向破解" scheme="http://noblestaspiration.net/tags/%E9%80%86%E5%90%91%E7%A0%B4%E8%A7%A3/"/>
<category term="Crack" scheme="http://noblestaspiration.net/tags/Crack/"/>
<category term="反汇编" scheme="http://noblestaspiration.net/tags/%E5%8F%8D%E6%B1%87%E7%BC%96/"/>
</entry>
<entry>
<title>加密与解密学习</title>
<link href="http://noblestaspiration.net/2018/03/30/%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86/"/>
<id>http://noblestaspiration.net/2018/03/30/加密与解密/</id>
<published>2018-03-30T11:05:07.190Z</published>
<updated>2018-06-27T08:33:24.437Z</updated>
<content type="html"><![CDATA[<h1 id="Crack工具"><a href="#Crack工具" class="headerlink" title="Crack工具"></a>Crack工具</h1><h2 id="Ollydbg"><a href="#Ollydbg" class="headerlink" title="Ollydbg"></a>Ollydbg</h2><h3 id="快捷键"><a href="#快捷键" class="headerlink" title="快捷键"></a>快捷键</h3><ul><li>F7-单步调试,如果遇到函数调用,会进入函数主体。shift+F7-单步调试,但是遇到中断,调试器会尝试进入被调试程序指定的异常处理。Ctrl+F7-自动步入,断点,异常会停下来,ESC可退出</li><li>F8-单步调试,遇到调用会一次执行完这个函数,shift和Ctrl和F7一样</li></ul><a id="more"></a><ul><li>F4-运行到选定位置,也就是运行到光标所在的位置。</li><li>Ctrl+F9-运行到return返回。</li><li>Alt+F9-执行到用户代码,也就是程序领空。</li></ul><ul><li>F9-让程序继续执行,shift和Ctrl和F7一样,alt+F9-执行直到返回用户代码段</li><li>Ctrl+F11-Run跟踪步入</li><li>F12 - 停止程序执行,同时暂停被调试程序的所有线程。</li><li>Ctrl+F12 - Run跟踪步过,一条一条执行命令,但是不进入子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。</li><li>Alt+B - 显示断点窗口。在这个窗口中,可以编辑、删除、或跟进到断点处。</li><li>Alt+C - 显示CPU窗口。</li><li>Alt+E - 显示模块列表[list of modules]。</li><li>Alt+K - 显示调用栈[Call stack]窗口。</li><li>Alt+L - 显示日志窗口。</li><li>Alt+M - 显示内存窗口。</li><li>Alt+O - 显示选项对话框[Options dialog]</li><li>Ctrl+P - 显示补丁窗口。</li><li>Ctrl+T - 打开Run跟踪 对话框</li><li>Alt+X - 关闭 OllyDbg。</li><li>Ctrl+E -以二进制(十六进制)格式编辑所选内容。</li><li>Ctrl+F -开始命令搜索。</li><li>Ctrl+G -转到某地址。</li><li>Ctrl+K - 查看与当前函数相关的调用树[Call tree]。在用这个功能之前,必须使用分析代码功能。</li><li>Ctrl+L - 搜索下一个,重复上一次的搜索内容。</li><li>Ctrl+N - 打开当前模块的名称(标签)列表。</li><li>Ctrl+O - 扫描object文件。扫描Object文件。该命令会显示扫描Object文件对话框,您可以在该对话框中选择Object文件或者lib文件,并扫描这个文件,试图找到在实际代码段中用到的目标模块。</li><li>Ctrl+S -命令搜索。</li><li>分号是注释</li></ul><h2 id="IDA"><a href="#IDA" class="headerlink" title="IDA"></a>IDA</h2><ul><li>快捷键<ul><li>j(jump)表示跳转</li><li>o(offset)便是偏移值</li><li>p(procedure)表示子程序,回车或双击可跳</li><li>字符上按X可以打开交叉参考窗口</li><li>M键为重命名,alt+M标记当前位置,Ctrl+M跳到标记位置,选择要跳的位置双击就过去了</li><li>U让所有代码以数据的形式显示出来,C重新分析代码</li><li><code>F12会出现函数执行的流程图</code> ,按空格可以相互之间转化</li><li>Alt+T查找字符串</li><li>XREF:交叉引用</li><li></li><li>碰到地址的时候右键选择H,就会显示在这个栈帧中实际的位置,十六进制的,双击变量,变量会调到详细的视图</li><li></li></ul></li><li>图形视图<ul><li>蓝色,顺序执行</li><li>绿色,条件执行(YES)</li><li>红色,条件执行(NO)</li></ul></li><li>文本视图<ul><li>箭头实线表示非条件跳转,虚线表示条件跳转</li><li>向下箭头加上jump表示跳转</li></ul></li><li>IDC作为IDA的一个重要组成,是一种嵌入式语言,一些反汇编的任务需要IDC的协助,如对代码进行加密程序,可以用IDC先写一段解密代码,在解密后反汇编就可以得到正确的反汇编结果</li><li>IDA另一个重要特征是库文件的快速识别与鉴定。</li><li>四种区段:<ul><li>.text:代码段</li><li>.data:数据段</li><li>.rdata:只读数据段</li><li>.bss:未初始化数据段</li></ul></li></ul><p>这里给出一个比较好的学习网址:<a href="https://blog.csdn.net/fishmai/article/details/52398376" target="_blank" rel="noopener">https://blog.csdn.net/fishmai/article/details/52398376</a></p><h2 id="汇编相关"><a href="#汇编相关" class="headerlink" title="汇编相关"></a>汇编相关</h2><h3 id="寄存器"><a href="#寄存器" class="headerlink" title="寄存器"></a>寄存器</h3><ul><li>EBP是存取某个时刻的栈顶指针,ESP是一直指向栈顶的指针,以方便对栈的操作</li></ul><h3 id="汇编指令"><a href="#汇编指令" class="headerlink" title="汇编指令"></a>汇编指令</h3><ul><li>sete指令,cmp eax,ecx sete cl,如果eax=ecx,那么cl为1,否则为0 ,最清楚的解释是,sete指令是当zf=1时,将cl置1,否则置0</li><li>movzx,高位全用0填充</li><li>movsx,32位,低16位的第一位为1则高16位全用1填充,为0则用0填充</li><li>JBE,前者小于等于后者跳转</li></ul><h2 id="杂项知识点"><a href="#杂项知识点" class="headerlink" title="杂项知识点"></a>杂项知识点</h2><ul><li>PE—Portable Executable可执行文件</li><li>很多工具在反汇编的时候可能无法正确区分数据和代码,有些程序就是用这个来对抗静态反汇编</li></ul>]]></content>
<summary type="html">
<h1 id="Crack工具"><a href="#Crack工具" class="headerlink" title="Crack工具"></a>Crack工具</h1><h2 id="Ollydbg"><a href="#Ollydbg" class="headerlink" title="Ollydbg"></a>Ollydbg</h2><h3 id="快捷键"><a href="#快捷键" class="headerlink" title="快捷键"></a>快捷键</h3><ul>
<li>F7-单步调试,如果遇到函数调用,会进入函数主体。shift+F7-单步调试,但是遇到中断,调试器会尝试进入被调试程序指定的异常处理。Ctrl+F7-自动步入,断点,异常会停下来,ESC可退出</li>
<li>F8-单步调试,遇到调用会一次执行完这个函数,shift和Ctrl和F7一样</li>
</ul>
</summary>
<category term="加密解密" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/"/>
<category term="逆向分析" scheme="http://noblestaspiration.net/categories/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/"/>
<category term="Ollydbg" scheme="http://noblestaspiration.net/tags/Ollydbg/"/>
<category term="Crack" scheme="http://noblestaspiration.net/tags/Crack/"/>
<category term="IDA" scheme="http://noblestaspiration.net/tags/IDA/"/>
<category term="汇编与反汇编" scheme="http://noblestaspiration.net/tags/%E6%B1%87%E7%BC%96%E4%B8%8E%E5%8F%8D%E6%B1%87%E7%BC%96/"/>
</entry>
<entry>
<title>Objective-C学习笔记</title>
<link href="http://noblestaspiration.net/2018/03/26/Objective-C%E7%AC%94%E8%AE%B0/"/>
<id>http://noblestaspiration.net/2018/03/26/Objective-C笔记/</id>
<published>2018-03-26T13:22:05.673Z</published>
<updated>2018-04-02T14:19:17.524Z</updated>
<content type="html"><![CDATA[<h2 id="Objective-C笔记"><a href="#Objective-C笔记" class="headerlink" title="Objective-C笔记"></a>Objective-C笔记</h2><ul><li>.m文件代表的是message,指的是OC的一种主要特性。</li><li>#import是让编译器在头文件中查询定义</li><li>框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等,Foundation框架的头文件Foundation.h包含一百多个文件,一旦使用<code>#import<Foundation/Foundation.h></code>, 那么将会获得全部集合。</li><li>argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char *argv[]是一个字符数组,其大小是int argc,主要用于命令行参数argv[]参数,数组里每个元素代表一个参数</li></ul><a id="more"></a><ul><li><strong>特别的.h文件和.m文件build之前一定要将.h文件右键properties->advance下的compiler…改为objc,这在环境搭建的blog也有提到</strong></li></ul><h3 id="创建类"><a href="#创建类" class="headerlink" title="创建类"></a>创建类</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">//头文件Fraction.h</span><br><span class="line">#import<Foundation/Foundation.h></span><br><span class="line">@interface Fraction:NSObject</span><br><span class="line">{</span><br><span class="line"> int numerator;</span><br><span class="line"> int denominator;//成员变量,这里是private的字段,数据存储在字段中,修改字段才修改数据。封装起来,保证数据安全。</span><br><span class="line">}</span><br><span class="line">-(void) print;</span><br><span class="line">-(void) setNumerator:(int) n;</span><br><span class="line">-(void) setDenominator:(int) d;</span><br><span class="line">-(int) numerator;</span><br><span class="line">-(int) denominator;//这里是属性,有get和set方法</span><br><span class="line">//.m文件</span><br><span class="line">#import<stdio.h></span><br><span class="line">#import"Fraction.h"</span><br><span class="line">@implementation Fraction</span><br><span class="line">-(void) print</span><br><span class="line">{</span><br><span class="line"> printf("%i/%i",numerator,denominator);</span><br><span class="line">}</span><br><span class="line">-(void) setNumeration:(int) n</span><br><span class="line">{</span><br><span class="line"> numerator=n;</span><br><span class="line">}</span><br><span class="line">...</span><br><span class="line">-(int) denominator</span><br><span class="line">{</span><br><span class="line"> return denominator;//属性中get方法,这样上面print可以访问成员变量</span><br><span class="line">}</span><br><span class="line">@end</span><br><span class="line">//main函数中使用</span><br><span class="line">//头文件中要包含:Fraction.h</span><br><span class="line">Fraction *frac=[[Fraction alloc] init];</span><br><span class="line">[frac print];</span><br><span class="line">[frac setNumeration:1];</span><br><span class="line">[frac release];</span><br><span class="line">//多个参数,-(void)setNumerator:(int) n andDeminator:(int) d;</span><br></pre></td></tr></table></figure><h3 id="构造子,先看一下构造函数和析构函数-的区别。"><a href="#构造子,先看一下构造函数和析构函数-的区别。" class="headerlink" title="构造子,先看一下构造函数和析构函数 的区别。"></a>构造子,先看一下<a href="http://www.runoob.com/cplusplus/cpp-constructor-destructor.html" target="_blank" rel="noopener">构造函数和析构函数</a> 的区别。</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">//.h里面的声明</span><br><span class="line">-(Fraction*) initWithNumerator:(int)n denomination:(int)d</span><br><span class="line">//.m具体实现方法</span><br><span class="line">-(Fraction*) initWithNumerator:(int)n denomination:(int)d</span><br><span class="line">{</span><br><span class="line"> _self=[super init];</span><br><span class="line"> if(_self)</span><br><span class="line"> {</span><br><span class="line"> [_self setNumerator:n andDenomitor:d];</span><br><span class="line"> }</span><br><span class="line"> return _self;</span><br><span class="line">}//if(_self)等同if(_self!=nil),nil等同于NULL,</span><br><span class="line">//main函数中实现</span><br><span class="line">Fraction *frac3 = [[Fraction alloc] initWithNumerator: 3 denominator: 10];</span><br><span class="line">printf( "Fraction 3 is: " );</span><br><span class="line">[frac3 print];</span><br><span class="line">printf( "\n" );</span><br></pre></td></tr></table></figure><ul><li>self 是指指向自己的指针</li></ul><h3 id="Class-level-access"><a href="#Class-level-access" class="headerlink" title="Class level access"></a>Class level access</h3><ul><li><strong>前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的。对应的有+号, 代表是类的静态方法,不需要实例化即可调用。</strong></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">//ClassA.h</span><br><span class="line">#import <Foundation/NSObject.h></span><br><span class="line"> static int count;</span><br><span class="line">@interface ClassA: NSObject</span><br><span class="line">+(int) initCount;</span><br><span class="line">+(void) initialize;</span><br><span class="line">@end</span><br><span class="line">//ClassA.m</span><br><span class="line">#import "ClassA.h"</span><br><span class="line">@implementation ClassA</span><br><span class="line">-(id) init</span><br><span class="line">{</span><br><span class="line">_self = [super init];</span><br><span class="line">count++;</span><br><span class="line">return _self;</span><br><span class="line">}</span><br><span class="line">+(int) initCount</span><br><span class="line">{</span><br><span class="line">return count;</span><br><span class="line">}</span><br><span class="line">+(void) initialize</span><br><span class="line">{</span><br><span class="line">count = 0;</span><br><span class="line">}</span><br><span class="line">@end</span><br><span class="line">main.m</span><br><span class="line">#import "ClassA.h"</span><br><span class="line">#import <stdio.h></span><br><span class="line">int main( int argc, const char *argv[] )</span><br><span class="line">{</span><br><span class="line">ClassA *c1 = [[ClassA alloc] init];</span><br><span class="line">ClassA *c2 = [[ClassA alloc] init];</span><br><span class="line">// print count</span><br><span class="line">printf( "ClassA count: %i\n", [ClassA initCount] );</span><br><span class="line">ClassA *c3 = [[ClassA alloc] init];</span><br><span class="line">// print count again</span><br><span class="line">printf( "ClassA count: %i\n", [ClassA initCount] );</span><br><span class="line">[c1 release];</span><br><span class="line">[c2 release];</span><br><span class="line">[c3 release];</span><br><span class="line">return 0;</span><br><span class="line">}</span><br><span class="line">output:</span><br><span class="line">ClassA count: 2</span><br><span class="line">ClassA count: 3</span><br></pre></td></tr></table></figure><ul><li><p><strong>类方法用类名访问,实例方法用示例名访问。静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。</strong></p></li><li><p><strong>类方法可以计算一个实体被instance几次,还可以共享数据,它不需要访问或者修改某个实例的成员变量。类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。 </strong></p><blockquote><p><code>插入一点:windows要通过各种各样的句柄来标识诸如应用程序实例,窗口,图标菜单等对象。句柄的实际值对程序来讲无光紧要,这个值是用来引用相应对象的。句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。</code></p></blockquote></li></ul><h3 id="这里留给异常"><a href="#这里留给异常" class="headerlink" title="这里留给异常"></a>这里留给异常</h3><h3 id="继承多态以及其他实体导向功能"><a href="#继承多态以及其他实体导向功能" class="headerlink" title="继承多态以及其他实体导向功能"></a>继承多态以及其他实体导向功能</h3><h4 id="ID类型"><a href="#ID类型" class="headerlink" title="ID类型"></a>ID类型</h4><ul><li>Objective-C有一种id的类型,操作有些像void*,不过它却严格规定只能用在实体上。Objective-C与Java、C++不一样,在调用一个实体的方法时,并不需要知道这个实体的类型。当然,这个方法一定要存在,在称为Objective-C的消息传递。这种动态连接有显而易见的好处。你不需要知道你调用的方法的那个实体是什么类型,如果这个实体对这个消息有反应,那就会调用这个方法。这也不会牵涉到一堆繁琐的类型转换,比如在Java里调用一个整形实体的.intValue()就要先转换,然后才能调用这个方法。</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">id number;</span><br><span class="line">number=comp;</span><br><span class="line">[number print];</span><br></pre></td></tr></table></figure><h4 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h4><ul><li><p>关于<em>_self=[super init]</em> ,下面一段代码</p><ul><li>[super init]的作用:面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return _self。当父类的初始化完成之后,即_self不为nil的情况下,就可以开始做子类的初始化了。</li><li>把[_self init]付给_self,防止父类release掉了self指向的空间并重新获得alloc了一块空间,如果[self init]alloc失败,则不执行if语句内容。</li><li>super作为消息接受者的实质:<strong>super并不是真正的指针,[super message]的实质是由self来接受父类的message。</strong>需要注意的是,[super message]中,message方法出现的self为[super message]语境中的self,即子类实例。</li></ul></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">_self=[super init];</span><br><span class="line">if(_self)</span><br><span class="line">{</span><br><span class="line"> [_self setWidth:w height:h];</span><br><span class="line">} </span><br><span class="line">return _self;</span><br></pre></td></tr></table></figure><ul><li>重要一点:<strong>if( self = [super init] )这是一种通常的建议写法,赋值并测零只是为了防止超类在初始化过程中发生改变,返回了不同的对象</strong></li></ul><p><strong>注:所有self前面均无_,只是hexo的时候会报错,所以选择加上</strong></p>]]></content>
<summary type="html">
<h2 id="Objective-C笔记"><a href="#Objective-C笔记" class="headerlink" title="Objective-C笔记"></a>Objective-C笔记</h2><ul>
<li>.m文件代表的是message,指的是OC的一种主要特性。</li>
<li>#import是让编译器在头文件中查询定义</li>
<li>框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等,Foundation框架的头文件Foundation.h包含一百多个文件,一旦使用<code>#import&lt;Foundation/Foundation.h&gt;</code>, 那么将会获得全部集合。</li>
<li>argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char *argv[]是一个字符数组,其大小是int argc,主要用于命令行参数argv[]参数,数组里每个元素代表一个参数</li>
</ul>
</summary>
<category term="Objective-C" scheme="http://noblestaspiration.net/categories/Objective-C/"/>
<category term="Objective-C" scheme="http://noblestaspiration.net/tags/Objective-C/"/>
<category term="languish" scheme="http://noblestaspiration.net/tags/languish/"/>
</entry>
<entry>
<title>Windows下搭建OC环境</title>
<link href="http://noblestaspiration.net/2018/03/26/Windows%E4%B8%8B%E6%90%AD%E5%BB%BAOC%E7%8E%AF%E5%A2%83/"/>
<id>http://noblestaspiration.net/2018/03/26/Windows下搭建OC环境/</id>
<published>2018-03-26T08:23:07.368Z</published>
<updated>2018-03-31T01:53:14.736Z</updated>
<content type="html"><![CDATA[<h1 id="安装Objective-C编译器"><a href="#安装Objective-C编译器" class="headerlink" title="安装Objective-C编译器"></a>安装Objective-C编译器</h1><p>需安装文件地址:<a href="https://pan.baidu.com/s/1qkS-7_EBuj4ofd9gHtdHcA" target="_blank" rel="noopener">链接</a> ,密码是:lm8y</p><ul><li>先安装OC的编译器,这里使用的是GNUstep,安装次序为:gnustep-msys-system、gnustep-core、gnustep-devel,我安装再d盘,下面路径皆以d盘开始</li><li>接着安装IDE,选择codeblocks作为IDE</li></ul><a id="more"></a><h1 id="配置开发环境"><a href="#配置开发环境" class="headerlink" title="配置开发环境"></a>配置开发环境</h1><ul><li>先进入<strong>setting->Compiler anddebugger…</strong>,进去之后选择<strong>GUN GCC Compiler</strong>,按<strong>copy</strong>按钮,将其重新命名为<strong>GUNstep MinGW Compiler</strong>,如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/1.jpg" alt="第一步"></p><p>这里一定要将<strong>selected compiler</strong>选择到<strong>GUNstep MinGW Compiler</strong>,然后点击<strong>set as default</strong>。勾选如图的两个选项。</p><ul><li>然后在<strong>compiler flags</strong>旁边的<strong>other compiler options</strong>里面添加这句话:<strong>-fconstant-string-class=NSConstantString -std=c99 </strong></li><li>在<strong>linker setting</strong>中添加两个链接,分别链接到<strong>libgnustep-base.dll.a</strong>和<strong>libobjc.dll.a</strong>,我的<strong>GUNstep</strong>是安装在D盘,所以路径依次是:<code>D:\GNUstep\GNUstep\System\Library\Libraries\libgnustep-base.dll.a</code> 和<code>D:\GNUstep\GNUstep\System\Library\Libraries\libobjc.dll.a</code> 如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/2.jpg" alt="链接文件"></p><ul><li>指定搜索目录,<strong>Search directories</strong>,这里有两处需要指定,第一是<strong>compiler</strong>,将其设置为<code>D:\GNUstep\GNUstep\System\Library\Headers</code> 第二处是linker,将其设置为<code>D:\GNUstep\GNUstep\System\Library\Libraries</code> 这两个不能写为同一个路径。如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/3.jpg" alt="设置搜索路径"></p><p><img src="http://p6flo4av7.bkt.clouddn.com/4.jpg" alt="设置搜索路径"></p><h1 id="添加Objective-C文件支持类型"><a href="#添加Objective-C文件支持类型" class="headerlink" title="添加Objective-C文件支持类型"></a>添加Objective-C文件支持类型</h1><ul><li><p>进入<strong>Settings->Environment…</strong>,选择<strong>Files extension handling</strong> 添加<strong>*.m</strong>。如图:</p><p><img src="http://p6flo4av7.bkt.clouddn.com/5.jpg" alt="添加.m文件"></p></li><li><p>然后新建一个项目,在<strong>project->project tree->categories…</strong>下面将<strong>*.m</strong>添加到<strong>source</strong>下,一定要注意前面使用<code>;</code> 分号分开的,如下图:</p></li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/6.jpg" alt="添加.m文件"></p><ul><li>进入<strong>Settings->Editor…</strong>,选择<strong>Syntaxhighlighting</strong>,点击<strong>Filemasks….</strong>按钮,在弹出框尾部添加*.m 到文件类型。如图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/7.jpg" alt="添加.m文件"></p><ul><li>然后点击<strong>Keywords…</strong>按钮 (紧靠<strong>Filemasks…</strong>按钮) 添加下面<strong>Objective-C</strong>的关键字到<strong>EditKeywords</strong>列表中。如图:</li></ul><blockquote><p><strong>@interface @implementation @end @class @selector @protocol @public @protected @private id BOOL YES NO SEL nil NULL self</strong></p></blockquote><p><img src="http://p6flo4av7.bkt.clouddn.com/8.jpg" alt="添加.m文件"></p><p>这就大体完成了。</p><h1 id="测试部分"><a href="#测试部分" class="headerlink" title="测试部分"></a>测试部分</h1><ul><li>测试代码如下:</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">#import <Foundation/Foundation.h></span><br><span class="line"></span><br><span class="line">int main (int argc, const char *argv[])</span><br><span class="line"></span><br><span class="line">{</span><br><span class="line"></span><br><span class="line"> NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];</span><br><span class="line"></span><br><span class="line"> NSLog(@"%@",@"hello world");</span><br><span class="line"></span><br><span class="line"> [pool drain];</span><br><span class="line"></span><br><span class="line"> return 0;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>测试之前要在工程目录下新建一个.m文件,然后在编译器中右键这个文件,选择两个选项,如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/9.jpg" alt="测试"></p><ul><li>.h文件也必须选择上面这一步,而且在options下面一个选项properties里面,必须这样选择properties->advanced->compiler->variable里面改为objc,这时候编译才能通过</li></ul><p>#一点补充</p><ul><li>关于代码高亮:在<strong>setting->editor</strong>里面,选择<strong>Syntax highlighting</strong>,然后选择<strong>objective c</strong>,点击filemasks…然后添加*.m,注意,后面加上<code>,</code>号,如下图:</li></ul><p><img src="http://p6flo4av7.bkt.clouddn.com/10.jpg" alt="代码高亮"></p>]]></content>
<summary type="html">
<h1 id="安装Objective-C编译器"><a href="#安装Objective-C编译器" class="headerlink" title="安装Objective-C编译器"></a>安装Objective-C编译器</h1><p>需安装文件地址:<a href="https://pan.baidu.com/s/1qkS-7_EBuj4ofd9gHtdHcA" target="_blank" rel="noopener">链接</a> ,密码是:lm8y</p>
<ul>
<li>先安装OC的编译器,这里使用的是GNUstep,安装次序为:gnustep-msys-system、gnustep-core、gnustep-devel,我安装再d盘,下面路径皆以d盘开始</li>
<li>接着安装IDE,选择codeblocks作为IDE</li>
</ul>
</summary>
<category term="Stall IDE" scheme="http://noblestaspiration.net/categories/Stall-IDE/"/>
<category term="Objective-C" scheme="http://noblestaspiration.net/tags/Objective-C/"/>
<category term="Windows" scheme="http://noblestaspiration.net/tags/Windows/"/>
<category term="GNUstep" scheme="http://noblestaspiration.net/tags/GNUstep/"/>
</entry>
<entry>
<title>一点markdown</title>
<link href="http://noblestaspiration.net/2018/03/15/%E7%AC%AC%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0-markdown/"/>
<id>http://noblestaspiration.net/2018/03/15/第一篇文章-markdown/</id>
<published>2018-03-15T14:17:57.454Z</published>
<updated>2018-08-27T07:00:24.322Z</updated>
<content type="html"><![CDATA[<blockquote><p>先写一点自己可能用得上的语法</p></blockquote><p>有几个#号就是几级标题</p><h1 id="一级"><a href="#一级" class="headerlink" title="一级"></a>一级</h1><h2 id="二级"><a href="#二级" class="headerlink" title="二级"></a>二级</h2><h3 id="三级"><a href="#三级" class="headerlink" title="三级"></a>三级</h3><h4 id="四级"><a href="#四级" class="headerlink" title="四级"></a>四级</h4><blockquote><p>这是>加空格</p><blockquote><p>两个>加空格</p></blockquote></blockquote><a id="more"></a><ul><li>一个<em>号加空格表示强调,可以在句中表示强调不过要以什么符号开始,就以什么结束,例子</em>这个是星号*,如果回车还是一样的格式,不想这样要这个格式,那就再回车一下</li><li><ul><li>回车再*号就会是空心小圆圈,或者换行之后backspace然后+号也可以</li></ul></li></ul><ul><li>一个-减号也是一个小黑点这样</li></ul><p>像这样-–,***变成一个分隔符</p><hr><p>链接有两种形式:</p><ul><li>行内式:链接可以用[]加上()这样来书写,[]中间写链接内容,()中间写链接地址</li></ul><p> <a href="noblestaspiration.net">我博客链接</a></p><ul><li><p>参考式:两个[]连起来</p><p>例子:<a href="noblestaspiration.net" title="mine">我的博客</a></p></li></ul><ul><li><noblestaspiration.net> 自动链接</li></ul><p>三个`这个符号是代码区,紧跟在三个符号后面的是语言类型,可以写Python或者C啊这些</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">cout</span><<<span class="number">111111</span><<<span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>两个``中间写的内容会变成其他颜色,但是第一个符号要加上空格</p><p><code>这就是其他颜色</code></p><p>插入图片是![]()其中[]中填的是图片名称,后面写的是路径加上图片的名称,名称一定要加上类型,比如.jpg什么的,下面插一张图片</p><p><img src="/2018/03/15/第一篇文章-markdown/D:/MyBlog\hexo\source\uploads\123.jpg" alt="123"></p><blockquote class="blockquote-center">这里是内容</blockquote><p>一对<>里面写blockquote class=”blockquote-center”这是搞一个像留言板下面那样的一个区域然后后面再加上一对<>里面写/blockquote这样就行了</p><p>另外\反斜杠可以帮助插其他符号,下面的就是前面已经加上反斜杠了</p><p>+ </p><p>`</p><p>*</p><p>_</p><p>{}</p><p>[]</p><p>()</p><p>#</p><p>+</p><p>-</p><p>.</p><p>!</p><p>多级列表:</p><ul><li>这是第一级<ul><li>在上一行回车再回车之后tab再-加上空格</li></ul></li></ul><p>外链播放,添加一个视频页面什么的,音乐也可以<iframe src="[网址]" width="930" height="542" frameborder="0" allowfullscreen></iframe>后面两个数字是高宽</p>]]></content>
<summary type="html">
<blockquote>
<p>先写一点自己可能用得上的语法</p>
</blockquote>
<p>有几个#号就是几级标题</p>
<h1 id="一级"><a href="#一级" class="headerlink" title="一级"></a>一级</h1><h2 id="二级"><a href="#二级" class="headerlink" title="二级"></a>二级</h2><h3 id="三级"><a href="#三级" class="headerlink" title="三级"></a>三级</h3><h4 id="四级"><a href="#四级" class="headerlink" title="四级"></a>四级</h4><blockquote>
<p>这是&gt;加空格</p>
<blockquote>
<p>两个&gt;加空格</p>
</blockquote>
</blockquote>
</summary>
<category term="学习" scheme="http://noblestaspiration.net/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="markdown" scheme="http://noblestaspiration.net/tags/markdown/"/>
<category term="基础" scheme="http://noblestaspiration.net/tags/%E5%9F%BA%E7%A1%80/"/>
</entry>
</feed>