我的一个朋友,他有一天提出这个问题,他最近买了一个garmin心率监测设备,跟踪他的心率,并允许他将他的心率统计数据上传一天到他的电脑.
唯一的问题是没有用于garmin USB设备的linux驱动程序,他设法解释了一些数据,例如型号和他的用户详细信息,并且已经确定存在一些二进制数据表,我们假设它们代表一系列记录他的心率和录音的时间.
当你对结构一无所知时,在逆向工程数据的哪一个开始?
我有一个小实用程序,最初是用VS2005编写的.
我需要进行一些小改动,但其中一个dll的源代码已经丢失了.
是否有免费或价格合理的工具将dll反向工程回C++代码.
只是好奇 - 通信协议的逆向工程有哪些自动甚至半自动技术?
当一个人嗅探流量并试图理解协议时,我特别感兴趣.
我可以找到一些关于学者的论文,但根据我的经验,大多数时候这是一个完全手动的过程.
如果有人有这方面的经验并且感觉分享,那将非常感激.
我在这里有一个很好的问题.
有一个名为reg.exe的实用程序已经与Windows一起提供了很长时间.从脚本导入.reg文件,从脚本修改值等等非常方便.所以在为脚本场景制作副本时("为什么不在system32中使用副本?" - >软件限制策略,个人首选等等)我注意到重命名它会让它无声地失败:
Windows Server 2008 x64:
Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation. All rights reserved.
C:\Windows\system32>reg.exe
ERROR: Invalid syntax.
Type "REG /?" for usage.
C:\Windows\system32>copy reg.exe reg2.exe
1 file(s) copied.
C:\Windows\system32>reg2.exe
C:\Windows\system32>reg2.exe /?
C:\Windows\system32>reg.exe /?
REG Operation [Parameter List]
Operation [ QUERY | ADD | DELETE | COPY |
SAVE | LOAD | UNLOAD | RESTORE |
COMPARE | EXPORT | IMPORT | FLAGS ]
Return Code: (Except for REG COMPARE)
0 - Successful
1 …Run Code Online (Sandbox Code Playgroud) 对于任何程序员来说,架构师最苛刻的任务之一就是理解其他代码.
例如,我是承包商,雇用来快速救出一些项目.修复错误,计划全局重构,因此我需要最有效的方式来理解代码.什么是概念列表,它们的优先级和最佳工具?
据我所知:反向代码工程来创建对象模型(每个包创建图表不太方便),创建序列图(该工具以调试模式连接到系统并从运行时生成图表).一些可视化技术,使用一些工具不仅可以使用,.java而且还可以使用JPA像Hibernate.为所有代码库生成图表,但添加一些类,然后添加它使用的类.
Sparx Enterprise Architect是逆向工程中最先进的技术还是远离它?还有其他更好的工具?理想情况下,该工具会让我理解代码,好像我自己写的那样:)
Android和Java提供了一个加密API,相对来说非常容易用于加密非专家.
但是既然我们知道没有任何代码可以真正受到保护免受逆向工程,特别是用作种子或共享机密的字符串常量,我想知道:在Android应用程序中经历加密和解密的磨难有什么意义?
我错过了什么吗?
试图让我的问题更清晰,更具体:假设我已经在使用特定字符串的应用程序通过代码,在代码(即没有用户数据)必须是秘密的:一种方法是将它们存储在加密的形式在编译.apk并在运行时解密它们(使用模糊的硬编码密码).另一种方法是将它们以加密形式存储在远程服务器中,在运行时获取它们(通过Internet)并解密(使用共享密码)它们.
我认为两者之间没有太大的区别,因为两者都要求(反向工程)代码中存在"密钥".
有这个问题的解决方案吗?
如果没有解决方案,为什么要加密?
由于微软决定将Xbox Live用户的个人资料页面置于登录墙之后,出于某些愚蠢的原因,我不得不寻找其他方法来确定Xbox Live用户是否在线.
为此,我使用了mitmproxy来确定iOS版Xbox One Smartglass应用程序的请求.似乎对于任何需要身份验证的请求,应用程序使用"XBL3.0 x = {computed auth token}"填充"身份验证"标头字段.
我已想出的是,应用程序通过执行一个POST请求来获取接入令牌https://login.live.com/oauth20_token.srf并传递形式的编码数据,其中所述属性中的一个是用户的"refresh_token".您可以通过使用mitmproxy查看任何这些请求来获取此刷新令牌.
然后,应用程序继续向https://user.auth.xboxlive.com/user/authenticate发送POST请求,传递我无法确定其来源的各种信息.以下是此请求的示例JSON有效内容:
{
"Properties": {
"AuthMethod": "RPS",
"RpsHeader": "<data removed for safety>",
"RpsTicket": "<data removed for safety>",
"SiteName": "user.auth.xboxlive.com"
},
"RelyingParty": "http://auth.xboxlive.com",
"TokenType": "JWT"
}
Run Code Online (Sandbox Code Playgroud)
此请求的响应包含以下JSON:
{
"DisplayClaims": {
"xui": [
{
"uhs": "<data removed for safety>"
}
]
},
"IssueInstant": "2014-08-02T23:44:56.5868148Z",
"NotAfter": "2014-08-16T23:44:56.5868148Z",
"Token": "<data removed for safety>"
}
Run Code Online (Sandbox Code Playgroud)
连接在一起的"uhs"和"token"的内容似乎是"XBL3.0 x ="授权标头中缺少的身份验证令牌.
问题是我对微软的网络堆栈完全不熟悉,经过几个小时的搜索,我无法弄清楚"RpsHeader"和"RpsTicket"的价值来自哪里.
我有一些旧的LED板,你可以发送一些文本并将其挂在某处...它是在1994/95制造的,它通过串行端口进行通信,使用16位MS-DOS应用程序,你可以在其中输入一些文字.
所以,因为你可能无法在任何地方运行它,除非使用DOSBox或类似的技巧,我决定用C#重写它.
在对原始的dos-exe进行端口监视之后,我发现它对你重建它真的不感兴趣 - 必须回答请求,变化的字节,预先发送的"ping"消息等等......
也许你知道类似我的dos-exe使用的校验和例程/模式,或者你可以提供任何关于尝试逆向工程的技巧...另外,因为我只熟悉编程而且没有花太多时间在反转方法上和/或分析协议,如果这个主题有点愚蠢的想法,请不要判断我 - 我会很高兴得到任何帮助......
真正包含应该显示的文本的消息是143个字节长(只是那么长,因为如果你没有用尽你的文本的所有空间它会填充填充字节),并且在那个消息中我注意到以下模式:
第四个字节(仍属于msg标头)与6或7个重复值的列表不同(在我的示例中,该字节始终为0F).
最后两个字节用作校验和
一些例子:
到目前为止,我完全确定校验和确实依赖于标头中的第四个字节,因为如果它发生变化,则校验和将完全不同,以便显示相同的文本.
这是一个显示"123"的完整143字节字符串的示例,仅用于为您提供更好的方向:
02 86 04 0F 05 03 01 03 01 03 01 03 00 01 03 00 ...............
00 31 00 32 00 33 …Run Code Online (Sandbox Code Playgroud) 我想100%保护我的应用程序并且不希望黑客进入内部.
这些是我从Stack Overflow中找到的解决方案.
在应用程序中集成Proguard.
在C/C++中保留代码中最重要的部分.
使用NDK将代码本机编写到.So文件中.
使用MD5加密api密钥.
那么有没有其他方法可以完全保护我的Android应用程序免受黑客攻击,或者这是上述提到的最佳解决方案.
这些是我发现的参考文献
我读了一篇有趣的论文,名为"对最后一级缓存的高分辨率侧通道攻击",并希望找到我自己机器的索引哈希函数 - 即Intel Core i7-7500U(Kaby Lake架构) - 遵循这项工作的线索.
为了对散列函数进行逆向工程,本文提到了第一步:
for (n=16; ; n++)
{
// ignore any miss on first run
for (fill=0; !fill; fill++)
{
// set pmc to count LLC miss
reset_pmc();
for (a=0; a<n; a++)
// set_count*line_size=2^19
load(a*2^19);
}
// get the LLC miss count
if (read_pmc()>0)
{
min = n;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我如何编写代码reset_pmc(),并read_pmc()在C++?从我到目前为止在线阅读的所有内容来看,我认为它需要内联汇编代码,但我不知道用什么指令来获取LLC未命中数.如果有人可以为这两个步骤指定代码,我将不得不承担责任.
我在VMware工作站上运行Ubuntu 16.04.1(64位).
PS:我发现这些记载LONGEST_LAT_CACHE.REFERENCES并LONGEST_LAT_CACHE.MISSES在第18的的3B卷英特尔架构软件开发手册,但我不知道如何使用它们.