0x02.Afkayas.1-WP

先打开程序随便输入查看情况

    

OD打开后,搜索相应的字符串找到了这里


往上面看发现了这里的JE是整个跳转的关键,同时发现了You Get It的成功字样:


然后把JE给NOP掉就显示出了结果,(人家竟然让我KEYGEN….)


判断的函数应该在前面,所以在前面一步一步下断点,发现了当在这里断点的时候,寄存器出现了变化:


EAX中的‘ssss’是我随意输入的serial,ECX中的‘780345’不知道是什么。

调用了箭头所指函数后,EAX中出现了像serial一样的东西:


所以推测箭头执行的函数是把ECX里面的字符串前面加上AKA-变成了serial,看来又是固定前面字符串后面自动生成的类型。

重新打开输入尝试了一下发现结果正确,确实是serial:

那么接下来开始分析这个780345是怎么来的:

不断在上面设断点,发现了这个函数执行后EAX出现了780345(这段还是借助百度,自己思路确实不太够。):


最后从前面开始慢慢分析,遇到VBA的相关函数就百度,最后的分析结果如下(换了吾爱破解版的写注释,要不正常OD中文注释实在是看不清。)


知识点:

       VbaLenBstr 求字符串的字节数

       RtcAnsVauleBstr 求字符串第一个字符的ASCII码

       VbaStrI4 将数字(dec)转换成相应的字符串

所以最后serial=AKA-len(name)*17CFB+’name[0]’,这样就可以写keygen了!

keygen如下:

#include<string.h>
#include<iostream>
using namespace std;

int main(int argc,char *argv[])
{
	char name[50];
	int serial;
	
	while(1)
	{
		cout<<"Input the name:";
		cin>>name;
		if(strlen(name)>50)
			cout<<"The name is too long!"<<endl;
		else
		{
			serial=strlen(name)*(0x17CFB)+name[0];
			cout<<"The serial is:"<<"AKA-"<<serial<<endl;
	 	}
		 
		cout<<"Coutinue or not(y/n)?";
		char temp;
		cin>>temp;
		if(temp=='n') break;
	 }
 	system("pause"); 
 	return 0;
 } 

可以使用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、付费专栏及课程。

余额充值