本帖最后由 qiucx 于 2021-4-1 11:04 编辑
恒生交易系统被用于证券、股票、邮币卡等系统,是一款非常不错的产品。交易协议是socket通讯或者安全socket通信。(前期的分析就不讲了,可以通过抓二进制数据看看结构)。破解的第一步首先要获取跟服务器的交互数据。我主要采用插桩的办法,打印数据到文件中。com/android/killer/Log原来有打印字符串的函数,改成写二进制数据到文件的方法。代码如下:
[Java] 纯文本查看 复制代码 .method public static logToFile([B)V
.locals 6
.param p0, "bytes" # [B
.prologue
.line 137
:try_start_0
new-instance v1, Ljava/io/File;
invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
move-result-object v4
const-string v5, "/qiucxjiuzhouA.txt"
invoke-direct {v1, v4, v5}, Ljava/io/File;-><init>(Ljava/io/File;Ljava/lang/String;)V
.line 138
.local v1, "file":Ljava/io/File;
invoke-virtual {v1}, Ljava/io/File;->exists()Z
move-result v4
if-nez v4, :cond_0
.line 139
invoke-virtual {v1}, Ljava/io/File;->createNewFile()Z
.line 141
:cond_0
new-instance v2, Ljava/io/FileOutputStream;
const/4 v4, 0x1
invoke-direct {v2, v1, v4}, Ljava/io/FileOutputStream;-><init>(Ljava/io/File;Z)V
.line 142
.local v2, "fos":Ljava/io/FileOutputStream;
invoke-virtual {v2, p0}, Ljava/io/FileOutputStream;->write([B)V
.line 144
const-string v4, "\r\n"
invoke-virtual {v4}, Ljava/lang/String;->getBytes()[B
move-result-object v3
.line 145
.local v3, "newLine":[B
invoke-virtual {v2, v3}, Ljava/io/FileOutputStream;->write([B)V
.line 147
invoke-virtual {v2}, Ljava/io/FileOutputStream;->flush()V
.line 148
invoke-virtual {v2}, Ljava/io/FileOutputStream;->close()V
:try_end_0
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
.line 153
.end local v1 # "file":Ljava/io/File;
.end local v2 # "fos":Ljava/io/FileOutputStream;
.end local v3 # "newLine":[B
:goto_0
return-void
.line 150
:catch_0
move-exception v0
.line 151
.local v0, "e":Ljava/io/IOException;
invoke-virtual {v0}, Ljava/io/IOException;->printStackTrace()V
goto :goto_0
.end method
直接把数据写到文件qiucxjiuzhouA.txt中。插到OutputStream的write方法前面。
[Java] 纯文本查看 复制代码 invoke-static {v4}, Lcom/android/killer/Log;->logToFile([B)V
invoke-virtual {v3, v4}, Ljava/io/OutputStream;->write([B)V
invoke-virtual {v3}, Ljava/io/OutputStream;->flush()V
大部分数据都能人眼看出来,部分数据看不出来。
这是因为这些是压缩数据,需要解压缩,可以用 java.util.zip.Inflater;实现。解压后的二进制数据就能看清楚了。
不能讲太详细,思路就这样,如果看的人多,热心值高于30,我再将怎么用java模拟跟服务器操作写一下。暴力的含义是模拟时直接用我们打印的数据直接读取,然后跟服务器交互,更好的办法是利用恒生SDK跟服务器交互。都能实现登录、购买等核心功能。
有帮助的话请大家免费评点分,感谢! |