我有一个虚拟机,它在 VM_Create 上将函数(systemCalls)的地址传递给虚拟机。
所以我hook VM_Create 并窃取syscalls 地址,将其放入备份函数指针中,我修改后的systemCalls 函数的地址传递给原始VM_Create,从中我可以更改参数,添加或删除调用,然后调用支持的- up syscalls 函数。这运作良好,直到游戏的新版本。
我相信已经发现了问题:
这是未修改的 systemCalls 函数的开头:
intptr_t CL_CgameSystemCalls(intptr_t *args) {
switch (args[0]) {
case CG_PRINT:
Com_Printf( "%s", (const char*)VMA(1));
return 0;
case CG_ERROR:
Com_Error(ERR_DROP, "%s", (const char*)VMA(1));
return 0;
Run Code Online (Sandbox Code Playgroud)
这是我修改后的系统调用函数:
intptr_t modified_CL_CgameSystemCalls (intptr_t *args)
{
switch (*args)
{
case CG_GETSNAPSHOT:
mysnap = mysnap ;
mynextSnap = (snapshot_t*) (CG_QVM2NATIVE(args[2]));
mysnap = mynextSnap;
retval = original_CL_CgameSystemCalls(args);
break ;
Run Code Online (Sandbox Code Playgroud)
问题是从修改后的函数中调用原始函数:
intptr_t modified_CL_CgameSystemCalls(intptr_t *args)
{
retval = original_CL_CgameSystemCalls(args);
return retval;
}
Run Code Online (Sandbox Code Playgroud)
已经失败了。
从反汇编的伪代码可以看出,CL_CgameSystemCalls的新定义似乎是:
char __usercall …Run Code Online (Sandbox Code Playgroud) 我继承了一个使用遗留文件格式来存储数据的项目,我可以访问进入该文件格式的数据,以及生成的文件,但我无权访问模板,我需要重新创建它.
什么是逆向工程二进制文件的最佳方法?如何确定使用的语言/加密,或者我甚至需要?一旦我做了,最好的程序(免费,首选)是什么来获取信息?这是在Windows系统上,但我运行一个OpenSUSE linux框,我不反对使用该问题的帮助.
因此,正如过去许多其他人所问的那样,有没有办法超越 Excel 中每个单元格 32k 的限制?
我找到了通过将工作负载拆分为两个不同的 .txt 文件然后合并两个 .txt 文件的方法来做到这一点,但是它是一个巨大的 PITA,而且更多时候我最终只使用 excel 到它的极限,就像我做的那样在 .txt 文件合并后没有时间验证数据,这是一个漫长的过程和乏味的 IMO。
但是我认为,如果存在限制,那是因为它是在 Microsoft 开发 Excel 时编码的,并且由于他们尚未提高它(2013 版本的限制仍然是相同的限制,因此升级没有好处)
我也知道很多人会说,如果您需要在该长度的单个单元格中获取信息,那么您应该很好地使用 ACCESS 我不知道如何使用 ACCESS 或如何像导入 EXCEL 一样将制表符分隔的文件导入到 ACCESS 中,然后即使我能弄清楚,我现在仍然必须弄清楚如何学习所有新命令和他的 EXCEL 等价物,如果有的话。
所以前几天我浏览了一些关于如何克服软件限制的博客文章,我阅读了一些关于逆向工程的内容。
是否可以将 excel 加载到十六进制编辑器中,然后将 32767 的每个实例更改为更大的内容?
Xcode删除了我的项目,一切都消失了.我唯一拥有的是iPhone 6中的应用程序.那么有什么办法可以检索应用程序的Xcode项目吗?
.. 更新 ..
我发现所有文件现在我只需要在一个新项目中重新组装它们.但我不知道怎么做.
编辑/更新
所以我认为让我困惑的是:
LEA ESI, [EBX + 8*EAX + 4]
Run Code Online (Sandbox Code Playgroud)
加载一个地址,但是:
LEA ESI, [EBX + 4]
Run Code Online (Sandbox Code Playgroud)
加载内容(值?)而不是地址。这怎么不是解引用?
我也不确定是什么
mov [eax+1], ecx
Run Code Online (Sandbox Code Playgroud)
做?
原始问题
我正在尝试学习阅读汇编,但是我开始挣扎。对不起,如果有错别字,我无法从我的实验室机器上复制。这是来自恶意代码,因此它可能不是最佳的。
我想我在某处有一个有缺陷的理解,但我无法弄清楚这一点。
var_30 = byte ptr -30h
lea eax, [ebp+esi+var_30]
Run Code Online (Sandbox Code Playgroud)
我的理解是加载有效地址将成为从 [basepointer-30h+esi] 计算出的任何地址。我不知道 esi 或 edi 是什么。
lea ecx, [esi+edi]
lea ebx, [esi+6]
Run Code Online (Sandbox Code Playgroud)
所以我相信 ebx 是 esi + 6 个字节的结果地址?
mov esi, ds:WriteProcessMemory
Run Code Online (Sandbox Code Playgroud)
esi 指向 WriteProcessMemory API 调用
mov byte ptr [eax], 68h
Run Code Online (Sandbox Code Playgroud)
我相信将指令 PUSH 放入 eax 的地址(当前为 [basepointer-30h+esi]
mov [eax+1], ecx
Run Code Online (Sandbox Code Playgroud)
我相信现在是 [esi+edi] 的地址的 ecx 包含要提供给 PUSH …
我有以下课程(通过 jadx 获得此代码)
package e.u.e.a.c;
public final class a implements AnalyticsConfig {
public static final String f21227a;
public static String f21231e;
//.......
}
Run Code Online (Sandbox Code Playgroud)
我想使用 Frida 获取这两个静态变量的值。
我试过这个
Java.perform(function x() {
var Test = Java.use("e.u.e.a.c.a");
console.log( Test.f21227a.value );
});
Run Code Online (Sandbox Code Playgroud)
但收到以下错误。
类型错误:无法读取未定义的属性“值”
编辑:
我使用这个脚本来获取方法和类字段,效果很好。我得到了变量的名称
public static final java.lang.String e.u.e.a.c.a.a
public static java.lang.String e.u.e.a.c.a.d
Run Code Online (Sandbox Code Playgroud)
但我仍然无法弄清楚如何获得这些变量的实际运行时值。
我在这里有这个 Assembly 函数,并且多次运行它试图了解它的作用和模式是什么。在理解它的模式方面,我遇到了砖墙。任何形式的指导在这里都值得赞赏。
0x0000555555555cbe <+0>: push %rbx
0x0000555555555cbf <+1>: mov %edx,%eax
0x0000555555555cc1 <+3>: sub %esi,%eax
0x0000555555555cc3 <+5>: mov %eax,%ebx
0x0000555555555cc5 <+7>: shr $0x1f,%ebx
0x0000555555555cc8 <+10>: add %eax,%ebx
0x0000555555555cca <+12>: sar %ebx
0x0000555555555ccc <+14>: add %esi,%ebx
0x0000555555555cce <+16>: cmp %edi,%ebx
0x0000555555555cd0 <+18>: jg 0x555555555cda <func4+28>
0x0000555555555cd2 <+20>: cmp %edi,%ebx
0x0000555555555cd4 <+22>: jl 0x555555555ce6 <func4+40>
0x0000555555555cd6 <+24>: mov %ebx,%eax
0x0000555555555cd8 <+26>: pop %rbx
0x0000555555555cd9 <+27>: retq
0x0000555555555cda <+28>: lea -0x1(%rbx),%edx
0x0000555555555cdd <+31>: callq 0x555555555cbe <func4>
0x0000555555555ce2 <+36>: add %eax,%ebx
0x0000555555555ce4 <+38>: jmp …Run Code Online (Sandbox Code Playgroud) 我正在做一个保险箱比赛,我得到了这个保险箱:
start:
add ds:0DEDh, ax
xor cx, cx
loop start
Run Code Online (Sandbox Code Playgroud)
根据我的理解,cx 在循环结束时将为 0,并在下一次迭代时更改为 FFFF。我也知道 0xCCh 是会停止程序的非法指令。我怎样才能破解这个保险箱?
**编辑:这里的目标是停止这个无限循环。循环没有停止项,我需要以某种方式让它停止使用逆向工程。例如:这是一个简单的保险箱
safe:
mov ax, ds:4D2h
cmp ax, 1000h
jl safe
Run Code Online (Sandbox Code Playgroud)
这是它的关键,使用逆向工程编写:
mov bx, 1000h
mov [4D2h], bx
l:
jmp l
Run Code Online (Sandbox Code Playgroud)
这种保险箱和钥匙的模拟是在Core Wars 8086 引擎内完成的。该规则是如下,其中既安全和关键是在战争中的幸存者:
幸存者不能在固定地址上加载,因为游戏引擎每回合都会将它们加载到一个随机地址。生成的程序必须是 COM 而不是 EXE,并且只包含 8086 条指令。
每个幸存者收到一组自己的完整寄存器(寄存器),其他幸存者无法访问。此外,每个幸存者都有一个 2048 字节的“个人”堆栈,其他幸存者也无法访问。
在运行第一轮游戏之前,游戏引擎将竞技场中的所有字节初始化为值 0CCh(注意:此字节值是“不支持”的指令 - 详情如下)。然后引擎将每个幸存者加载到竞技场内存中的随机位置,即 - 完全按原样复制幸存者文件的内容。两个幸存者之间的距离,以及幸存者与竞技场边缘之间的距离,保证至少为 1024 字节。每个幸存者的代码最多有 512 个字节。
在第一轮之前,游戏引擎将(每个幸存者的)寄存器初始化为以下值:
- BX、CX、DX、SI、DI、BP - 重置。
- 标志 - 重置。
- AX, IP …
在尝试对“crackme”二进制文件进行逆向工程时,我偶然发现了一个像这样开头的函数:
mov ecx, [esp+4]
test ecx, 3
jz short loc_106A9F0
Run Code Online (Sandbox Code Playgroud)
该函数的第一个参数(这是MOV“d到ECX在该函数的第一行)是一个指针为字符串。如果我理解正确,下一行执行TEST操作,其中一个操作数是内存地址,另一个是常量。我想知道为什么程序会这样做,考虑到内存地址本身应该无关紧要。
简而言之,我想知道为什么要编程TEST一个具有非零常量的指针。