160道逆向破解 002
题目是160道逆向破解题目的二道
首先点击运行,发现运行不了,原因是缺少了一个dll文件,直接百度搜索下载道这个exe的根目录里就行了,点击运行,是一个用户密码注册的小窗口
直接拖入od,右键智能搜索,找到try again等报错的字样,往上面翻两下就能看到我们的关键点je了,右键nop填充就好了。
在用一下另外一种寻找关键点的方法,先运行并输入伪码,然后停止运行程序,查看堆栈视图,这些函数名称看着都很生疏,百度一下,是用vb写的,看后面的来源,发现rtcmsgbox是来源于afkayas的,百度一下知道这个函数是调用消息框的函数。u送一直接右键show call。就找到了。
还有一种方法,我们ctrl + n可以看到当前模块的名称列表,可以看到那个……cmp函数,右键下断点,可以看到下了两个断点,说明有两个函数,运行程序跑到断点处,然后看堆栈窗口可以看到这个call传进去了两个参数,一个是我们自己输入的密码,一个是一串字符串,很有可能就是正确的注册码。试一下正确!我么们再改一下用户名,发现注册码由错误了,说明注册码始于用户名有关系的。
接下来是注册机部分
注册机我还不会搞,所以就找了 ...
期末实训之图书管理系统
本次期末实训历经八天终于做完了,感觉对于能力的提升还是蛮大的,不管是对于代码能力还是各个方面来讲,也让自己看到了不足之处。话不多说直接上源码。
链接:https://pan.baidu.com/s/1osRKznMSEj1LAjDJ2rN19w提取码:z1in
系统使用了链表来储存数据,并且使用了easyx制作了可视化界面并添加了鼠标操作。系统本身并没有什么优化,所以代码量很多,后期可能会做一些算法优化等等。
person.h 头文件
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<stdlib.h>#include<iostream>#include<conio.h>#include<windows.h>#include<graphics.h>#include<time.h>/*int time(){ time_t timep; struct tm* p; time(&timep); p = ...
nck破解课程02:破解补丁工具的使用
破解一个程序的时候我们可以通过搜索字符串的方式来寻找关键点,那么假如我们在编写一个程序的时候,怎么提防这种简单的暴破方式呢? 上一篇文章中已经提到过od里面实现搜索字符串功能是一个插件,视频中的作者给我们展示了一下这个插件的源码,下图是插件的核心函数:
可以看出,该函数显示读取整个模块的内存,然后开始寻找push,mov,lea指令,并读取他们的操作数,当他读到’\0’的时候就认为这是一个字符串,但是问题也来了,如下图我们可以看到,上图的push ebp中的ebp是以\0结尾的,但是很明显,这并不是一个字符串,而是一个结构体。但是他却读到’\0’的时候就停止了并判定这是一个字符串,这样就导致了真正的字符串并没有读取,只读取了\0就结束了。而ida则是直接通过搜索pe文件的。
说了这么多,那么我们到底该如何防止搜索字符串呢?我们新建一个vs windows控制台程序,然后在od中的地址栏中右键修改二进制然后输入注册失败,接着修改它的值,将14中的1改为0,然后将字符串的二进制复制下来。(点击二进制,然后赋值二进制)粘贴在刚刚新建的vs中(说的这么麻烦,其实就是修改一下字符 ...
nck破解课程01:一个最简单的小暴破
爆破的软件是自己编写的一个很简单的注册弹窗软件,用e语言编写的,文章写的很粗糙。如有不对还望大佬指正。
首先我们需要理解程序验证的流程
a、点击注册按钮
b、读取注册码
c、判断注册码是否合法
d、提示用户是否注册成功
暴破的时候我们就可以从以上四点为入手点,首先将程序拖入od,此时我们先找到读取编辑框内容的API函数:GetWindowTextA函数,ctrl+g转到该函数以后,设置一个断点,然后运行程序,但是我们发现运行不了,为什么呢? 我们看一下对战窗口,可以看到函数的三个参数。第一个参数是:包含文本的窗口或控件的句柄。 第二个参数表示将接收文本的缓冲区。如果字符串与缓冲区一样长或长,则该字符串将被截断并以空字符结尾。,第三个参数表示的是要复制到缓冲区的最大字符数,包括空字符。如果文本超过此限制,则会被截断。有的人这里会发现一直运行不了,就是因为第一个二参数的判断字柄是标签栏而不是编辑框。所以只需要shift+f2加上一个条件断点[esp+4]!=…….就行了,然后我们继续运行,此时我们就可以正常往编辑框输入东西了,我们输入1111111。我们再来回顾一 ...
BUUCTF reverse SimpleRev
每天一道ctf,能多不能少
题目链接首先拖入ida打开以后查看main函数如图可以看出,Dercy函数里的信息很重要,双击进入Dercy函数,
unsigned __int64 Decry(){ char v1; // [rsp+Fh] [rbp-51h] int v2; // [rsp+10h] [rbp-50h] int v3; // [rsp+14h] [rbp-4Ch] int i; // [rsp+18h] [rbp-48h] int v5; // [rsp+1Ch] [rbp-44h] char src[8]; // [rsp+20h] [rbp-40h] __int64 v7; // [rsp+28h] [rbp-38h] int v8; // [rsp+30h] [rbp-30h] __int64 v9; // [rsp+40h] [rbp-20h] __int64 v10; // [rsp+48h] [rbp-18h] int v11; // [rsp+50h] [rbp-10h] unsigned __int64 v12; // [ ...
BUUCTF reverse 刮开有奖
每天一道ctf,能多不能少
题目链接
下载好以后双击点开
发现是这么个玩意儿,但我们却没法对它进行操作,好吧,查一下壳,然后直接用ida打开,查看主函数,这里我发现主函数是这种的
学识短浅的我只能去百度,大概了解了一下:windows支持两种应用程序,一种是一种是基于控制台用户界面的应用程序(Console User Interface,简称CUI),另一种是基于图形用户界面的程序(Graphic User Interface,简称GUI)。然后main函数和WinMain函数分别是这两种应用程序的主函数(不知道这样理解做没错,原话是这样的:main函数和WinMain 函数是分别做为CUI和GUI的进入点函数被使用的。)废话不多说,继续我们的ctf。
所以我们打开主函数,然后查看反码。这里面的函数是一个windowsAPI函数,作用是从一个对话框资源中创建一个模态对话框。参数我并不太明白,百度了一下也没百度出个结果,看了其他大佬的wp是这样说的的:继续往下,查看代码
INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM ...
BUUctf reverse 不一样的flag
BUUctf reverse 不一样的flag
每天一到ctf,能多不能少
今天这道题感觉挺有意思的,题目链接
啊这,考眼力,天真的我直接跑到ida里面搜索字符串去了,搜索半天发现找不到,那么就只能分析一波代码了。
int __cdecl main(int argc, const char **argv, const char **envp){ char v3; // [esp+17h] [ebp-35h] int v4; // [esp+30h] [ebp-1Ch] int v5; // [esp+34h] [ebp-18h] signed int v6; // [esp+38h] [ebp-14h] int i; // [esp+3Ch] [ebp-10h] int v8; // [esp+40h] [ebp-Ch]
__main(); v4 = 0; v5 = 0; qmemcpy(&v3, _data_start__, 0x19u); while ( 1 ) { puts("you can choos ...
PE文件笔记十七 重定位表
前面在PE文件笔记十六 代码重定位中学习了代码重定位,接着学习重定位表
重定位表重定位表的作用经过前面对导入表和导出表的学习,知道了一个程序运行时一般需要加载多个PE文件
而每个PE文件在内存中的首地址由扩展PE头中的ImageBase决定;当前面的PE文件占用了后面PE文件在内存中位置时,允许后面PE文件重新选择一个基地址。这时候就需要对所有的重定位信息进行修正,而修正的依据就是PE中的重定位表
操作系统会根据重定位表对代码予以纠正,使得代码位置移动后仍然能够正确地运行;也就是代码重定位的工作由操作系统来完成
什么是重定位表重定位表就是记录代码位置移动后修正重定位信息所需要的一种结构
PS:也就是说当代码位置没有发生移动时,是用不到重定位表的
定位重定位表定位重定位表原理像导入表、导出表、重定位表、资源表等表,这些表的起始地址和大小都存储在扩展PE头里的DataDirectory这个数组的成员中,DataDirectory是一个数组,每个数组成员对应一张表
回顾先前的笔记PE文件笔记五 PE文件头之扩展PE头,能得到重定位表对应的下标为5
宏定义
值
含义
IMAG ...
PE文件笔记十六 代码重定位
前面在PE文件笔记十五 导入表中学习了导入表,接着要学习重定位表,但在学习重定位表前,要先了解一下代码重定位
代码重定位在学习重定位表之前,要知道什么是代码重定位
代码重定位定义代码重定位是把可执行代码从内存的一个地方移动到另外一个地方去,保证该部分代码还能正常执行
重定位的提出可执行代码从内存的一个地方移动到另外一个地方,所有的字节码(硬编码)均保持不变;如果代码指令中的某些操作数不跟着地址发生改变,势必会导致程序运行出错。这里的某些操作数是指那些使用了绝对地址定位的程序指令中的操作数
为更好地学习重定位,结合下面的实例分析:
代码 复制代码 隐藏代码#include <stdio.h>int main(){ int result=0; _asm{_code: xor eax,eax mov al,byte ptr ds:[_data] jmp _end_data: _emit 0x61_end: ...
PE文件笔记十五 导入表
前面在PE文件笔记十四 导出表学习了导出表,接着学习导入表
导入表导入表作用当程序运行时,需要多个PE文件共同组成
PE文件提供哪些功能→导出表
PE文件需要依赖的模块以及依赖这些模块中的哪些函数→导入表
什么是导入表导入表就是记录该PE文件还需要依赖的模块以及依赖这些模块中的哪些函数的一种结构
定位导入表定位导入表原理在上一个笔记:PE文件笔记十四 导出表中以及提到了,像导入表、导出表、重定位表、资源表等表,这些表的起始地址和大小都存储在扩展PE头里的DataDirectory这个数组的成员中,DataDirectory是一个数组,每个数组成员对应一张表
回顾先前的笔记,能得到导入表对应的下标为1
宏定义
值
含义
IMAGE_DIRECTORY_ENTRY_IMPORT
1
导入表
即DataDirectory[1]表示导入表
关于DataDirectory的具体描述在上一个笔记中已经详细说明过了,这里不再赘述:
IMAGE_DATA_DIRECTORY成员
数据宽度
说明
VirtualAddress
DWORD(4字节)
表的起始位置(RVA)
...