0x01.Acid Burn-WP

先打开文件,

随便输入一下尝试:


所以该程序应该是破解掉Serial/Name。(ps:在被坑了一下午之后百度到一开始弹出来的东西叫nag窗口,要想办法把他给去掉。

1.    去除NAG:

开始F8,到CALL 00429F8C的时候弹出了NAG,所以F2然后CTRL+F2重新开始


F9运行到断点处,F7进到函数内部继续F8到这个位置,再次弹出NAG(继续下断点重新调试)


接着F8到这里又出现弹窗,我们继续重复上面的操作。


又找到了这里,不过看这里的注释应该是快到终点了


看到了MessageBoxA,终于找到NAG的源头了


然后滚回去发现了个判断函数完美避开NAG


重新调试,改成JMP继续,这样NAG窗口就没了。


2.    解决NameSerial:

随便输入之后显示如下

然后在OD里面搜索Sorry这段字符串并进入相应汇编地址


随便看看发现了一个Congratz……似乎发现了什么


还发现上面的JNE正好跳到下面的Sorry处


其实到这里如果把JNE改成NOP掉就可以跳到成功的位置了,然而我们要写Keygen,这就很尴尬,接着继续推测出JNE上面的CALL应该是返回一个ZF值来判断的,再上面一个函数应该是生成这个serial的关键。

3.    KEYGEN:

在这个函数位置设了断点后,F8几步后,发现栈中生成的serial:


输入了一下正确,那么接下来开始研究这个函数里面到底发生了什么吧。

进入到函数内部,发现了三个CALL,先下3个断点看看栈中的serial是什么时候生成的吧,额,一直都没生成,而且程序似乎在做死循环,我也说不清楚为什么。

然后我们接着从函数出来发现上方的两个字符串CW和CRACKED引起了我们的注意。F8后出现了一些我们想要的变化。


所以我们重新调试程序来研究最上面的过程究竟是什么样子:


分析如备注所示(从这个位置开始分析其实还是借助网上的参考,毕竟经验不足。)

然后我们知道了实际上CW和CRACKED中间的数字就是输入字符串的第一个字符乘以29h再乘以2得到的数值转化成相对应的字符串

写出keygen如下:

#include<iostream>
using namespace std;

int main(int argc,char *argv[])
{
	char name[50];
	int serial=0;
	
	while(1)
	{
		cout<<"Input the name : ";
		cin>>name;
		serial=name[0]*(0x29)*2;
		cout<<"The serial is :"<<"CW-"<<serial<<"-CRACKED"<<endl; 
		
		cout<<"Continue or not(y/n)?";
		char temp;
		cin>>temp;
		if(temp=='n') break;
	}
	system("pause");
	
 } 
(菜鸟的第一次做CrackMe,弄了好久才弄明白OD怎么用。在大量的参考下做出了这道题,积累经验,路还很长!)

 

可以使用Java的Socket和InputStream类来读取Socket中返回的ASCII数据,然后根据题目要求进行转义和生成图片。 下面是一个简单的示例代码,可以实现读取Socket中的数据并进行转义和生成图片: ```java import java.io.*; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class SocketReader { public static void main(String[] args) throws IOException { String host = "localhost"; int port = 8080; Socket socket = new Socket(host, port); InputStream inputStream = socket.getInputStream(); List<Byte> bytes = new ArrayList<>(); int b; while ((b = inputStream.read()) != -1) { if (b == 0x7D) { bytes.add((byte) 0x7D); bytes.add((byte) 0x01); } else if (b == 0x5B) { bytes.add((byte) 0x7D); bytes.add((byte) 0x02); } else if (b == 0x5D) { bytes.add((byte) 0x7D); bytes.add((byte) 0x03); } else if (b == 0x2C) { bytes.add((byte) 0x7D); bytes.add((byte) 0x04); } else if (b == 0x2A) { bytes.add((byte) 0x7D); bytes.add((byte) 0x05); } else { bytes.add((byte) b); } } byte[] imageData = new byte[bytes.size()]; for (int i = 0; i < bytes.size(); i++) { imageData[i] = bytes.get(i); } FileOutputStream outputStream = new FileOutputStream("image.jpg"); outputStream.write(imageData); outputStream.close(); socket.close(); } } ``` 在上述代码中,我们首先建立了一个到指定主机和端口的Socket连接,并获取了该Socket连接的输入流。然后我们通过循环读取输入流中的数据,并根据题目要求对数据进行转义,最后将转义后的数据写入到一个字节数组中。 接着,我们将字节数组写入到一个文件中,生成图片。在这里,我们假设输入的ASCII数据就是一张JPEG图片,并将它写入到名为“image.jpg”的文件中。 需要注意的是,上述代码是一个简单的示例,实际的应用场景可能会更加复杂,需要根据具体的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值