我有一个Qt Dll,我使用Windows绕道库注入第三方应用程序:
if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
&si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
"C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))
Run Code Online (Sandbox Code Playgroud)
然后我设置了一个系统范围的钩子来拦截窗口创建:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Run Code Online (Sandbox Code Playgroud)
其中XOR是我的程序名,而Status :: getInstance()是一个Singleton,我保持全局变量.
在我的CBTProc回调中,我想拦截所有QWidgets的窗口:
HWND hwnd= FindWindow(L"QWidget", NULL);
Run Code Online (Sandbox Code Playgroud)
这很好用,因为我得到了一个相应的HWND(我用Spy ++检查过)然后,我想得到一个指向QWidget的指针,所以我可以使用它的函数:
QWidget* q = QWidget::find(hwnd);
Run Code Online (Sandbox Code Playgroud)
但这是问题所在,返回的指针始终为0.我是不是正确地将代码注入到进程中?或者我不是应该使用QWidget :: find()吗?
谢谢,
戴夫
编辑:如果我将QWidget :: find()函数更改为我的DLL的导出函数,在设置钩子后(所以我可以设置并捕获断点),QWidgetPrivate :: mapper为NULL.
我在android平台上问了这个,但是没有收到回复.我已经提到了这个帖子,但找不到他所指的帖子(动态生成Dalvik字节码到运行的Dalvik/Android应用程序)
此外,还提出了此问题(http://code.google.com/p/android/issues/detail?id=6322)
所以,我的问题是,
干杯.Earlence
我正在某些应用程序中注入一个dylib以获得某些期望的行为.
我能够正确地连接平面C API.一旦我注入了dylib,我会在符号表中查看并使用我的函数地址更新其条目,然后调用原始函数.
因此,符号名称对我来说很重要.
我的问题是C++名称修改.我们如何挂钩名称已被破坏的C++函数.我读了堆栈溢出的一些地方,可以用mach_override挂钩c ++代码,但没有示例或引用.
有些人可以举例说明如何实现C++的挂钩吗?
编辑:
我用$ c++filt -n _ZN10WindowData12GetCGContextEv作为例子并得到了输出WindowData::GetCGContext()
像这样......
typedef void* (*WindowData_GetCGContextProcPtr)(void* inObj);
static WindowData_GetCGContextProcPtr gWindowDataGetCGContextProcPtr = NULL;
void* try_WindowDataGetCGContextProcPtr(void* inObj)
{
printf("try_WindowDataGetCGContextProcPtr \n");
return gWindowDataGetCGContextProcPtr(inObj);
}
Run Code Online (Sandbox Code Playgroud)
现在,我想要修补此方法.
gWindowDataGetCGContextProcPtr = (WindowData_GetCGContextProcPtr)Patch((const void*)&WindowData::GetCGContext, (const void*)&try_WindowDataGetCGContextProcPtr);
Run Code Online (Sandbox Code Playgroud)
此修补程序提供编译错误.
error: 'WindowData' has not been declared
error: 'GetCGContext' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
我是怎么解决的?
我使用Haskell编写了一个Java字节码解析器,它运行得很好.然而,下一步让我完全难过.
我的Haskell程序需要修改.class文件,以便在执行时,Java程序打印:
" 在执行方法之前输入[此处的方法名称] ",和
执行方法后" 退出[此处的方法名称] ".
我所知道的是,我们需要在调用时附加常量池和方法表System.out.println,但我觉得我仍然缺少某些东西.
System.out.println字节码? System.out.println?我在远程控制应用程序上编程.其中一项任务是注入角色.我目前使用的代码如下所示:
Instrumentation instr = new Instrumentation();
String str="a";
// basically the same like calling instr.sendStringSync(str);
char[] chars = str.toCharArray();
KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
KeyEvent[] keyEvents = keyCharacterMap.getEvents(chars);
if (keyEvents != null) {
for (KeyEvent kev : keyEvents) {
instr.sendKeySync(kev);
}
}
Run Code Online (Sandbox Code Playgroud)
这完全适用于英文字符(字符显示在EditText框中).但是,如果我尝试注入例如韩文字符,则会失败.函数getEvents返回null,即使我配置了韩语和键盘也是如此.
我知道还有另一种直接注入字符串的方法:
KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0);
instr.sendKeySync(event);
Run Code Online (Sandbox Code Playgroud)
这也不起作用 - 在EditText框中没有显示任何字符,并且在我的测试活动中也没有调用onKeyMultiple().
这很奇怪,因为具有相同事件的dispatchKeyEvent()在我的测试活动中起作用:
KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0);
dispatchKeyEvent(event);
Run Code Online (Sandbox Code Playgroud)
我的远程控制应用程序需要注入事件,无论哪个活动.这可以使用Instrumentation(带有android.permission.INJECT_EVENTS平台密钥和签名).
如何使用仪器注入非英文字符?还有另一种方法来实现这一目标吗?例如,使用dispatchKeyEvent(也必须适用于其他活动/应用程序).
好吧,因为似乎有很多混乱,我将稍微简化一下这个问题.您可以尝试回答下面的原始问题,或者您可以解决此版本而忽略该行下方的所有内容.
我的目标是采取任意表达并在极其受限制的环境中对其进行评估.此环境仅包含具有以下类型值的变量:
此外,表达式必然能够使用任何文字,例如数字和字符串常量(但不是数字或字符串向量,因为那些需要c).我想评估此环境中的表达式,并确保表达式无法访问环境之外的任何内容,以便我可以确定评估表达式不会带来安全风险.那么,在下面的代码中,你能用一个字符串填充空白,这个字符串在评估时会做些调皮吗?"顽皮的东西"被定义为在屏幕上打印某些东西,访问变量的值secret,执行任何shell命令(最好是产生输出的命令),或任何其他看起来很顽皮的东西(证明你的选择).
a <- 1
b <- 2
x <- 5
y <- 1:10
z <- -1
## Give secret a random value so that you can't just compute it from
## the above variables
secret <- rnorm(5)
allowed.variables <- c(
## Numeric variables
"a", "b", "x", "y", "z",
## Arithmetic operators
"(", "+", "-", "/", "*", "^", "sqrt", "log", "log10", "log2", "exp", "log1p")
restricted.environment <- Map(get, allowed.variables)
## Example naughty expressions …Run Code Online (Sandbox Code Playgroud) 如何从普通的groovy类中访问数据源?注入不像服务那样工作.
原因是我需要从groovy类中进行一些手动数据库调用(即:使用groovy.sql.Sql类的SQL语句),因为我正在使用遗留数据库.
查询HttpSolrServer.
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(q);
QueryResponse queryResponse = solrServer.query(solrQuery);
Run Code Online (Sandbox Code Playgroud)
我需要构建一个solr查询,比如"author:*user_inputed_text*title:*user_inputed_text*"我需要类似PreparedStatement的东西,但我在solrj库中找不到类似的东西.如何构建不会引起注入的查询?如何使用户输入字符串 - \user_input_text\safe?
我正在使用连接构建查询.当我有,例如这段代码:
public String buildQuery(String userInputedText) {
String query = "author:*" + userInputedText + "* OR title:*" + userInputedText + "*";
}
Run Code Online (Sandbox Code Playgroud)
然后用户可以注入一些子查询并接收结果,但不受限制.例如,输入的字符串是:"OR title:".所以,整个查询将是:作者:*OR标题:*OR标题:*OR标题:*
在这种情况下,用户收到所有结果(它们不受限制)并传递模式作者:*?*OR title:*?*.
使用默认参数注入构造函数的问题.
例如
container.RegisterType<IAddressImportRepository, AddressImportRepository>(
new PerRequestLifetimeManager());
public AddressImportRepository(
FairFlexxDbContext context, bool isUseSecurePredicate = true)
: base(context, isUseSecurePredicate)
{
}
Run Code Online (Sandbox Code Playgroud)
错误:
[InvalidOperationException:类型Boolean没有可访问的构造函数.]
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext context)+239 lambda_method(Closure,IBuilderContext)+60
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0(IBuilderContext上下文)+71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft .Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+425
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0 (IBuilderContext context)+71
Microsoft.Practices.ObjectB uilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+222
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0(IBuilderContext context)+71
Microsoft. Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.Unity.UnityContainer .DoBuildUp(Type t,Object existing,String name,IEnumerable`1 resolverOverri des)+383
我即将开始一个相对较大的项目并且想知道
使用这些依赖注入框架的真正好处是什么?
DI会增加应用加载时间吗?或提供任何性能价值?
Googles文档反对使用Robojuice因为它的RAM使用,这是所有DI的共同点吗?
有兴趣听取大家的意见.